Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [C]Chương trình có sử dụng hàm con ...

  1. #1
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Exclamation [C]Chương trình có sử dụng hàm con ...

    Viết chương trình tính tiền lãnh cho 2 công nhân , với giờ vào sớm nhất là 6h giờ chuyển ca là 12h giờ ra ca trễ nhất là 18h . Buổi sáng thì 6000/h còn chiều thì 7.500/h . Mình viết sử dụng hàm con : Nhưng ko biết sao lại sai mất
    mọi người coi sửa và phân tích giúp mình ha .

    C Code:
    1. #inlcude <stdio.h>
    2. #include <conio.h>
    3. void nhapdulieu(float *g_vao,float *g_ra);
    4. void tinhluong(float g_vao,float g_ra,float *tlanh);
    5. void intraloi(float tlanh);
    6. main()
    7. {
    8.     float g_vao1,g_ra1,tlanh1;
    9.     float g_vao2,g_ra2,tlanh2;
    10.     printf("\n cong nhan I\n");
    11.     nhapdulieu(&g_vao1,&g_ra1)
    12.     tinhluong(g_vao1,g_ra1,&tlanh1)
    13.     intraloi(tlanh1)
    14.     printf("\n cong nhan I\n");
    15.     nhapdulieu(&g_vao2,&g_ra2)
    16.     tinhluong(g_vao2,g_ra2,&tlanh2)
    17.     intraloi(tlanh2)
    18.     getch();
    19. }
    20. void nhapdulieu(float *g_vao,float *g_ra)
    21. {
    22.    printf("gio vao :"); scanf("%f", &(*g_vao));
    23.    printf("gio ra: "); scanf("%f", &(*g_ra));
    24. }
    25. void tinhluong(float g_vao,float g_ra,float *tlanh)
    26. {
    27.    #define g_vao_m 6
    28.    #define g_ra_m 18
    29.    #define g_chuyen_c 12
    30.    #define dg_sang 6000
    31.    #define dg_chieu 7500
    32.    float g_sang, g_chieu;
    33. if (g_vao >= g_vao_m && g_ra <= g_ra_m && g_vao < g_ra)
    34.  {
    35.     if (g_ra <= g_chuyen_c)
    36.     {
    37.        g_sang = g_ra - g_vao;
    38.        g_chieu = 0;
    39.     }
    40.     else if (g_vao >= g_chuyen_c)
    41.    {
    42.       g_sang = 0;
    43.       g_chieu = g_ra - g_vao;
    44.     }
    45.    else if (g_vao < g_chuyen_c && g_ra > g_chuyen_c)
    46.    {
    47.       g_sang = g_chuyen_c - g_vao;
    48.       g_chieu = g_ra - g_chuyen_c;
    49.    }
    50.     tlanh = g_sang*dg_sang + g_chieu*dg_chieu;
    51. }
    52.  else
    53.   tlanh = -1;
    54. }
    55. void intraloi(float tlanh)
    56. {
    57.   if (tlanh == -1)
    58.      printf(" du lieu bi sai \n");
    59.  else
    60.      printf(" tien lanh la : %f", tlanh);
    61. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi shinichi_haha : 06-12-2006 lúc 11:55 AM.

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    preprocessor : #define đặt ở đầu

    ... Khai báo : void nhapdulieu(float *g_vao,float *g_ra)
    sau đó input : scanf("%f", &(*g_vao)); >>> lạ chưa từng thấy :
    chỉ cần : scanf("%f",g_vao) là đủ ..
    .. #inlcude >> viết sai
    ... trong hàm main() thiếu ; liên tục
    .. trong hàm tính lương biến tlanh kiểu con trỏ nên truy nhập giá trị phải là : *tlanh >> sửa lại : *tlanh=g_sang*dg_sang + g_chieu*dg_chieu ;
    *tlanh = -1;

    >> như thế là chạy được bài rồi
    None!

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mình đã sửa lại như bạn nói , chỉ khác là mình vẫn để define ở yên như vậy , còn include gì đó bạn nói sai mình cũng chẳng hiểu sai chỗ nào nữa , pete nói rõ giúp hả . Sau khi mình sửa lại thì code cũng báo lỗi là {

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. void nhapdulieu(float *g_vao,float *g_ra);
    4. float tinhluong(float g_vao,float g_ra,float *tlanh);
    5. void intraloi(float tlanh);
    6. main();
    7. {
    8. float g_vao1,g_ra1,tlanh1;
    9. float g_vao2,g_ra2,tlanh2;
    10. printf("\n cong nhan I\n");
    11. nhapdulieu(&g_vao1,&g_ra1)
    12. tinhluong(g_vao1,g_ra1,&tlanh1)
    13. intraloi(tlanh1)
    14. printf("\n cong nhan I\n");
    15. nhapdulieu(&g_vao2,&g_ra2)
    16. tinhluong(g_vao2,g_ra2,&tlanh2)
    17. intraloi(tlanh2)
    18. getch();
    19. }
    20. void nhapdulieu(float *g_vao,float *g_ra)
    21. {
    22. printf("gio vao :"); scanf("%f", g_vao));
    23. printf("gio ra: "); scanf("%f", g_ra));
    24. }
    25. void tinhluong(float g_vao,float g_ra,float *tlanh)
    26. {
    27. #define g_vao_m 6
    28. #define g_ra_m 18
    29. #define g_chuyen_c 12
    30. #define dg_sang 6000
    31. #define dg_chieu 7500
    32. float g_sang, g_chieu;
    33. if (g_vao >= g_vao_m && g_ra <= g_ra_m && g_vao < g_ra)
    34.  {
    35.  if (g_ra <= g_chuyen_c)
    36.   {
    37.   g_sang = g_ra - g_vao;
    38.   g_chieu = 0;
    39.   }
    40.  else if (g_vao >= g_chuyen_c)
    41.   {
    42.   g_sang = 0;
    43.   g_chieu = g_ra - g_vao;
    44.   }
    45.  else if (g_vao < g_chuyen_c && g_ra > g_chuyen_c)
    46.   {
    47.   g_sang = g_chuyen_c - g_vao;
    48.   g_chieu = g_ra - g_chuyen_c;
    49.   }
    50.  
    51.  *tlanh = g_sang*dg_sang + g_chieu*dg_chieu;
    52.  }
    53. else
    54.   *tlanh = -1;
    55. }
    56. void intraloi(float tlanh)
    57. {
    58. if (tlanh == -1)
    59.     printf(" du lieu bi sai \n");
    60. else
    61.     printf(" tien lanh la : %f", tlanh);
    62. }

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Đây code sửa lại là thế này ... Ngồi xem mà suy ngẫm nha ...
    Code gì mà viết san sát như cát ... Thằng nào nhin cái này ngán tận cổ không thèm giúp luôn ..
    May mà gặp mình
    Học cách lập trình viết code cho nó gọn gàng, hàng cột rõ ràng , có comment ghi chú lại để còn biết nó làm cái gì....
    Về cơ bản bài này pete viết lại cho bạn gọn gàng hơn một chút .. Lỗi linh tinh sửa hết rồi .. Còn thuật toán pete chả hiểu bạn muốn làm cái gì -_-

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. #define g_vao_m 6
    5. #define g_ra_m 18
    6. #define g_chuyen_c 12
    7. #define dg_sang 6000
    8. #define dg_chieu 7500
    9.  
    10. // khai bao ham
    11. void nhapdulieu(float *g_vao,float *g_ra);
    12. void tinhluong(float g_vao,float g_ra,float *tlanh);
    13. void intraloi(float tlanh);
    14.  
    15.  
    16. //ham main()
    17. int main()
    18. {
    19. float g_vao1,g_ra1,tlanh1;
    20. float g_vao2,g_ra2,tlanh2;
    21.  
    22. // Cong Nhan I
    23. printf("\n cong nhan I\n");
    24. nhapdulieu(&g_vao1,&g_ra1);
    25. tinhluong(g_vao1,g_ra1,&tlanh1);
    26. intraloi(tlanh1);
    27.  
    28. // Cong nhan II
    29. printf("\n cong nhan II\n");
    30. nhapdulieu(&g_vao2,&g_ra2);
    31. tinhluong(g_vao2,g_ra2,&tlanh2);
    32. intraloi(tlanh2);
    33.  
    34. getch(); return 0;
    35. } // end main
    36.  
    37. // nhap du lieu
    38. void nhapdulieu(float *g_vao, float *g_ra)
    39. {
    40. printf("gio vao :"); scanf("%f", g_vao);
    41. printf("gio ra: "); scanf("%f", g_ra);
    42. }
    43.  
    44. // tinh luong
    45. void tinhluong(float g_vao, float g_ra, float *tlanh)
    46. {
    47.  float g_sang, g_chieu;
    48.  
    49.  if (g_vao >= g_vao_m && g_ra <= g_ra_m && g_vao < g_ra)
    50.  {
    51.     if (g_ra <= g_chuyen_c)
    52.     {
    53.      g_sang = g_ra - g_vao;
    54.      g_chieu = 0;
    55.     }
    56.     else if (g_vao >= g_chuyen_c)
    57.     {
    58.      g_sang = 0;
    59.      g_chieu = g_ra - g_vao;
    60.     }
    61.     else if (g_vao < g_chuyen_c && g_ra > g_chuyen_c)
    62.     {
    63.      g_sang = g_chuyen_c - g_vao;
    64.      g_chieu = g_ra - g_chuyen_c;
    65.     }
    66.  *tlanh = g_sang*dg_sang + g_chieu*dg_chieu;
    67.  } // end if
    68.  
    69.  else
    70.  *tlanh = -1;
    71. } // end tinh luong
    72.  
    73. // in tra loi
    74. void intraloi(float tlanh)
    75. {
    76. if (tlanh == -1)
    77. printf(" du lieu bi sai \n");
    78. else
    79. printf(" tien lanh la : %f", tlanh);
    80. }

    Tested : Very Good !
    None!

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    May mà gặp mình
    he he .... cái ni cũng tức cười nghen ...
    Mình đang đọc , cũng cảm ơn pete trước đã , nếu có gì thì tạ ơn offine ..
    Bi giờ thì hỏi pete nhé , mình mới đọc xong tài liệu về C có thắc mắc thế này :
    vd nhé :
    ham1(int a,int b);
    ham2(int *a,int *b);
    thế thì sự khác nhau ở đây là gì , có công dụng thế nào , a,b đơn thuần chỉ là các đối số , thế *a,*b thì gọi là gì , có phải là các tham biến hay không .
    có phải * ám chỉ là một con trỏ hay không ?...

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định [C]Chương trình có sử dụng hàm con ...

    OK .. giải thích nhé :
    * ham1(int a, int b) : cái này nghĩa là : bạn đưa giá trị cho arguement từ ngoài vào trong hàm ham1 sau đó tính toán trong local scope của ham1

    * ham2(int *a, int *b) : có nhiều nghĩa tùy mục đích sử dụng thôi . Cái này là kiểu con trỏ pâmeter pointer. có thể dùng để tạo giá trị cho biến nào đó trong global scope..

    Ví dụ thực hành luôn : Tính tổng của 2 số dùng hàm ( chơi hẳn 2 hàm cho nó " máu " < new word > ) :

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. int main(void)
    5. {
    6.      getValue( &Left , &Right );  // ham2(int *a, int * b) được invoke
    7.      getSum( Left , Right ); // ham1(int a, int b) được truy nhập
    8.      getch();
    9.      return 0;
    10. }
    11. void getValue( int* a, int* b )
    12. {
    13.       printf("\n Input LeftValue = "); scanf("%d",a) ; // không phải &a vì con trỏ có sẵn address rồi :D
    14.       printf("\n Input RightValue = ");scanf("%d",b);
    15. }
    16.  
    17. void getSum( int a , int b )
    18. {
    19.      printf("\n Answer : %d + %d = %d " ,a,b,a+b);
    20. }

    Rất đơn giản nha ^_^!
    None!

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    hèm hiểu rùi , để ngâm cứu thêm nhiều nữa mới được ...
    Có ngâm cứu mới thấy , nó chẳng chịu chạy , pete làm cho nó chạy luôn coi ...
    Đã được chỉnh sửa lần cuối bởi kidkid : 08-12-2006 lúc 10:01 AM.

  8. #8
    No Avatar
    CCmaster Khách

    Trích dẫn Nguyên bản được gửi bởi kidkid
    Bi giờ thì hỏi pete nhé , mình mới đọc xong tài liệu về C có thắc mắc thế này :
    vd nhé :
    ham1(int a,int b);
    ham2(int *a,int *b);
    thế thì sự khác nhau ở đây là gì , có công dụng thế nào , a,b đơn thuần chỉ là các đối số , thế *a,*b thì gọi là gì , có phải là các tham biến hay không .
    có phải * ám chỉ là một con trỏ hay không ?...
    Mình bon chen tý nhé

    Tham số của function trong C được gọi theo giá trị (called by value).
    Có nghĩa là nó (như ham1 chẳng hạn) chỉ gọi giá trị của a,b rồi nhét vào 1 vùng nhớ tạm thời, xử lý trên vùng nhớ đó.

    Sau khi function ham1 kết thúc thì vùng nhớ đó được giải phóng. Do vậy giá trị của a,b sẽ không thay đổi sau khi kết thúc function.

    Vậy muốn giữ lại giá trị của a,b đã thay đổi khi qua function thì làm thế nào (called by reference). Chính là dùng ham2. *a,*b chính là 2 con trỏ đó. Gọi giá trị của 2 con trỏ vào. Tuy 2 con trỏ đó không thay đổi sau khi function kết thúc nhưng đối tượng mà 2 con trỏ đó trỏ đến có thể thay đổi được

    1 instance nhé: Hàm swap đổi giá trị 2 số a và b:

    C Code:
    1. void Swap_1(int a, int b)
    2. {
    3.          int temp;
    4.          temp = a;
    5.          a = b;
    6.          b = temp;
    7. }

    Với a = 1, b=2 thì sau khi gọi
    Code:
    Swap_1(a,b);
    giá trị của a=1, b=2. Không đổi gì cả!

    C Code:
    1. void Swap_2(int *pa, int *pb)
    2. {
    3.          int temp;
    4.          temp = *pa;
    5.          *pa = *pb;
    6.          *pb = temp;
    7. }

    Với a=1, b=2 thì sau khi gọi
    Code:
    Swap_2(&a,&b);
    giá trị a = 2, b=1.

    Đây là cách dùng tham biến và tham trị trong C.

  9. #9
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Uh cái ni thì mình cũng có biết qua rùi , nhưng vẫn còn thấy lúng túng trong cách sử dụng con trỏ , nhất là cách gán của nó , vẫn đang tìm hiểu , nói chung cũng biết được ít phần rùi phải học hỏi thêm ở mọi người chứ sao chừ
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn