Saturday, 4 December 2010

[Thắc mắc] Tham chiếu & tham trị trong hàm con C

đang làm bài tập nộp cho BKindex thì vứơng phải vấn đề trên
VD:
Nhập 3 số nguyên:

Viết hàm để nhập 3 số nguyên này vào 3 biến trong chương trình chính.
- Hàm có tên là nhapso,nhận 3 đối số truyền theo tham chiếu (by-reference).
- Hàm này mời người dùng nhập vào 3 số nguyên.
- Lưu 3 số đó vào 3 biến a, b, c trong chương trình chính để sử dụng cho các câu sau.
Ví dụ : Khi hàm được gọi sẽ hoạt động như sau:
Moi ban nhap so thu nhat : 6 (enter)
Moi ban nhap so thu hai : 21 (enter)
Moi ban nhap so thu hai : 15 (enter)
trên là code viết thử nhưng vẫn chết

Mời các giáo sư thử sờ tay vào vấn đề này xem , sửa code trên luôn nhé
-----------------------------------------------------------------------
đây là đoạn code này , mọi người xem để khỏi quên nhé
void nhapso(int *a,int *b,int *c)
{
printf("\n Moi ban nhap vao so thu nhat :");
scanf("%d",a);
printf("\n Moi ban nhap vao so thu hai :");
scanf("%d",b);
printf("\n Moi ban nhap vao so thu ba :");
scanf("%d",c);
}

Trong hàm main đổi thành
case 1:{nhapso(&a,&b,&c);break;}

23 comments:

  1. Hải xem lại code đê có chạy được đâu
    đừng chủ quan ,
    phần này là 1 trong những phần khó cùng với pointer đó

    ReplyDelete
  2. lỗi j dell nói ai biết mà sửa
    chạy đc t mới post lên (t dùng c free 4.1)

    ReplyDelete
  3. di học cái kiểu shit j thế Chung.

    int n,a,b,c,x,y,z;
    nhapso(a,b,c);
    chưa khởi tạo tham số cho a,b,c. a,b,c là tham số của hàm, nó phải được khởi tạo trước khi gọi hàm chứ không phải là trong hàm. Cái hàm này ko cần có tham số nếu mày scanf bên trong hàm !

    ReplyDelete
  4. chưa khởi tạo giá trị cho tham số a,b,c :">

    ReplyDelete
  5. vẫn dell hiểu Hưng nói j.
    cách m làm là khai báo biến toàn cục trước khi khởi tạo hàm, nhưng mà hình như nó đang học về tham trị với tham chiếu mà làm kiểu đấy thì nói chuyện giề

    ReplyDelete
  6. à ko, cái đoạn kia tao copy từ code của nó ra mà :))
    Chung xem cái này là ví dụ đơn giản về tham chiếu
    http://pastebin.com/JsZVBXHa

    ReplyDelete
  7. nếu có ít lý thuyết thì càng tốt , cho nó bài bản
    hờ hờ

    ReplyDelete
  8. *x=1245008 *y=1245004
    x=70 y=50Press any key to continue . . .

    Đấy là kết quả của đoạn của Hưng đấy
    thế có đúng ý tưởng của Hưng không

    ReplyDelete
  9. sau khi nhìn mãi mới ra, tớ hiểu là cái phần tham chiếu này mấu chốt 1 phần là ở lúc khai báo tên hàm cùng với địa chỉ của tham số chứ ko phải là tham số đơn thuần .
    vd : phải là int minmax( &a, &b, &c )
    chứ ko phải là int minmax ( int a, int b, int c)
    đúng ko mọi người ?

    ReplyDelete
  10. dùng địa chỉ của biến để làm tham số cho hàm. Khi thay đổi các con trỏ(trỏ con này sang giá trị kia) thì in ra thấy các giá trị bị thay đổi. Thực chất ta chỉ đảo con trỏ thôi

    ReplyDelete
  11. cháu hiểu rùi! nhưng trong 1 vài trường hợp phức tạp thì vẫn chưa thể sửa đc sao cho đúng ! :(

    ReplyDelete
  12. Code thằng Hưng viết kiểu khỉ j thế @@
    Dùng tham chiếu cần thiết cho hàm nào thay đổi giá trị của biến tham số truyền vào, bởi dùng tham trị thì sẽ ko có tác dụng, biến chỉ thay đổi giá trị trong hàm, ra khỏi hàm biến lại trở về giá trị ban đầu.
    Hàm minmax kia thì ko cần phải sử dụng đến tham chiếu.
    Bài thằng Chung t viết trên Geany thì đây (ko hiểu sao để .c chạy bt, .cpp toàn báo compile failed nhưng vẫn chạy). Lưu ý là trong C ko có tham chiếu nên phải dùng con trỏ (C++ mới có tham chiếuiếu)
    http://pastebin.com/zgNP3wgE
    Viết trên C++ thì đây (compile failed nhưng vẫn chạy :)))
    http://pastebin.com/b5gnfAxp

    Thằng Chung chạy lỗi chỗ nào thì phải nói, cứ bảo lỗi thì ai biết ở đâu mà sửaửa

    ReplyDelete
  13. http://pastebin.com/xYa2nwHX
    trên là cả bài code , tao lấy phần chạy của Hải ghép vào ,
    nhưng trên C-free vẫn chết ở cái hàm nhapso

    mọi người chạy thử và cho ý kiến nhé

    ReplyDelete
  14. t vẫn chạy bt chả vấn đề j
    đã bảo lỗi j thì nói ra cứ kêu chết chết ai mà biết @@

    ReplyDelete
  15. ô , thế thì sorry bạn Hải nhé , mình tưởng bạn không chạy được giống mình =))

    ----------------------------------------------
    Nhap vao 1 so de dua ra nua chon phu hop
    Voi 1 la ;Nhap 3 so nguyen
    Voi 2 la :so lon nhat va so lon nhat trong 3 so
    Voi 3 la :uoc so chung cua 3 so do
    Voi 4 la :Hieu binh phuong cua so lon nhat va so be nhat
    Voi 5 la :Chuong trinh thoat
    Nhap vao 1 lua chon di !
    1

    Moi ban nhap vao so thu nhat :2

    Moi ban nhap vao so thu hai :3

    Moi ban nhap vao so thu ba :4

    Nhap vao 1 lua chon di !
    2

    Trong 3 so 256 , 1 va 4265820 :
    So lon nhat : 4265820
    So nho nhat : 1
    Nhap vao 1 lua chon di !
    ---------------------------------------
    Bạn Hải nhìn đoạn kết quả trên thì biết là lỗi gì rồi chứ nhỉ

    ReplyDelete
  16. M compile = j thế Chung
    T dùng G++ chuẩn rồi vẫn thấy chạy bt chả lỗi liếc j
    Nhìn bài m cũng dell hiểu lỗi j luôn

    ReplyDelete
  17. Viết lại hàm nhập chạy thử:
    void nhapso(int *a,int *b,int *c)
    {
    printf("\n Moi ban nhap vao so thu nhat :");
    scanf("%d",a);
    printf("\n Moi ban nhap vao so thu hai :");
    scanf("%d",b);
    printf("\n Moi ban nhap vao so thu ba :");
    scanf("%d",c);
    }

    Trong hàm main đổi thành
    case 1:{nhapso(&a,&b,&c);break;}

    ReplyDelete
  18. rất cảm ơn bạn Hiệp đã ra tay giúp đỡ , câu trả lời đã xong , mọi người nhớ tham khảo nhé
    hí hí

    ReplyDelete
  19. Hải dùng lại compile đê , sai mà vẫn chạy được thì hậu quả rất nguy hiểm

    ReplyDelete
  20. Dm sao bảo ko đc dùng con trỏ, cái cách này t đã chỉ cho ở trên rồi còn j nữa, nó dell phải là tham chiếu đâu.
    Còn compile t dùng là chuẩn rồi, cũng chỉ riêng thấy mỗi m chạy sai thôi.
    Nhờ vả mà ăn nói khó nghe vãi Hùng, lần sau có ứt t thèm giúp nhé.

    ReplyDelete
  21. ối trời ơi
    sorry bạn Hải nhé , cái cm trên của mày có 2 bài code mà tao không để ý
    ------------------------
    đính chính lại nhé , Hải cũng làm đúng và khác Hiệp

    @@mà sao mày thiếu bình tĩnh thế , lâu không gặp ấy ấy hả =))

    ReplyDelete