Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Dùng malloc đối với biến cấu trúc, chức năng của getch và code đã tối ưu chưa?

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    26

    Mặc định Dùng malloc đối với biến cấu trúc, chức năng của getch và code đã tối ưu chưa?

    C Code:
    1. #include <stdio.h>
    2. struct hocsinh //Khai bao bien cau truc ten hocsinh
    3. {
    4.     char tenhs[50]; //ten hoc sinh
    5.     char mahs[30]; //ma hoc sinh
    6.     float dtb; //diem trung binh
    7. };
    8. typedef struct hocsinh hs;
    9. void nhap1hs (hs &n) //ham nhap 1 hoc sinh
    10. {
    11.     fflush(stdin);
    12.     printf("Nhap ten hoc sinh: ");
    13.     gets(n.tenhs);
    14.     printf("\nNhap ma so hoc sinh: ");
    15.     gets(n.mahs);
    16.     printf("\nNhap diem trung binh: ");
    17.     scanf("%f", &n.dtb);
    18. }
    19. void nhapnhs (hs a[])// ham nhap n hoc sinh voi n do nguoi dung nhap vao
    20. {
    21.     int n,flag=0;
    22.     do
    23.     {
    24.         printf("\nNhap so hoc sinh: ");
    25.         scanf("%d", &n);
    26.         if(n>2 && n<10) //dieu kien n
    27.         {
    28.             flag=1;
    29.             for(int i=0;i<n;i++)
    30.             {
    31.                 nhap1hs(a[i]);
    32.             }
    33.         }
    34.     }while(flag==0);
    35. }
    36. float diem_lonnhat (hs a[], int n) //ham tra ve diem trung binh lon nhat trong mang a
    37. {
    38.     float max=a[0].dtb;
    39.     for(int i=1;i<n;i++)
    40.     {
    41.         if(max<a[i].dtb)
    42.         {
    43.             max=a[i].dtb;
    44.         }
    45.     }
    46.     return max;
    47. }
    48. void lietke(hs a[], int n) //ham liet ke diem trung binh lon nhat
    49. {
    50.     float kq=diem_lonnhat(a,n);
    51.     for(int i=0;i<n;i++)
    52.     {
    53.         if(kq==a[i].dtb)
    54.             printf("\nHoc sinh co diem TB lon nhat: %s",a[i].tenhs);
    55.     }
    56. }
    57. void main()
    58. {
    59.     hs a[10];
    60.     int n;
    61.     nhapnhs(a);
    62.     lietke(a,n);
    63. }
    Em hỏi chỗ này:
    C Code:
    1. void main()
    2. {
    3.     hs a[10]; //Nhap hs a[10] thi chay ok con nhap hs a[100] thi khong chay duoc. Cho nay em muon xin cap phep malloc thi viet the nao?. Em chi biet xai malloc cho con tro. That su khong hieu ve malloc cho lam.
    4.     int n;
    5.     nhapnhs(a);
    6.     lietke(a,n);
    7. }
    Em xài bản C free 4.0 thì bị lỗi như trên. Còn xài bản 4.1 hay 5.0 mới nhất thì nó không chạy luôn @@
    Cám ơn mọi người
    Đã được chỉnh sửa lần cuối bởi vtd93 : 09-10-2011 lúc 10:09 AM.

  2. #2
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    bạn ktra lại thế nào.mình chạy vẫn tốt mà.
    A *p = (A*)malloc(sizeof(A)*nSoPhanTu) A là 1 kiểu bất kì, bạn tạo ra hay có sẵn
    malloc ko xài cho con trỏ thì xài cho cái gì pn.
    HT117-5277

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    554

    @ treatmaster :
    Tổng quát phải là :
    KDL *<biến con trỏ>= (KDL*)malloc(kích thước 1 phần tử * Số phần tử) chứ

    @ vtd :
    Kích thước 1 phần tử là số byte của 1 ố nhớ(phần tử) . Thường dùng sizeof(kdl) để thay vào vị trí này.
    sizeof tổng quát là sizeof(KDL hoặcđối tượng dữ liệu). Đối tượng dữ liệu có thể là biến, mảng, hay tập hợp 1 số vùng nhớ nào đó.
    1)Malloc cấp phát 1 vùng nhớ ở vùng heap rất rộng lớn , thoải mái dư dã mà xaì, về ô nhớ phần tử và cách bài trí thì nó tựa tựa như khai báo mảng. Malloc trả về địa chỉ(hay 1 con trỏ) trỏ đến ô nhớ đầu tiên của vùng nhớ vừa cấp phát.
    Bạn gán địa chỉ này cho con trỏ vừa khai báo.
    Từ đây bạn có thể sử dụng con trỏ này như 1 mảng bình thường mà xưa nay bạn quen làm.
    Điểm khác biệt là : Con trỏ này bạn có thể thay đổi, có thể cho nó trỏ đi chỗ khác .
    Vùng nhớ của phép malloc là nằm ở Heap , rất rộng lớn so với của các phép khai báo mảng tĩnh , lại nằm ở vùng stack rất chật chội.
    Vì thế nó sinh ra lỗi của bạn là hs a[ số nhỏ] thì ok , còn hs a[ số lớn] thì bó tay .
    p/s cơ mà với a[100] thì vẫn compile dc chứ có sao đâu ?
    2) Code của bạn viết ko dc trong sáng cho lắm.
    //Khai bao bien cau truc ten hocsinh
    Cái này ko phải là khai báo biến mà là định nghĩa 1 kiểu dữ liệu mới, có tên là hocsinh
    typedef struct hocsinh hs;
    Cái này ko trong sáng chút nào , vì bạn đã định nghĩa 1 kiểu dữ liệu tên hocsinh rồi , còn cố định nghĩa thêm 1 kdl y chang vậy, lấy nền là hocsinh và đặt tên là hs .
    Rồi các hàm phía dưới bạn sử dụng cái tên thứ 2 này. Nó cồng kềnh và bị thừa.
    3) Bạn viết hàm Nhập đã bị sai bản chất , làm ko kiểm soát dc số n . Do đó toàn bộ chương trình trở về sau trở nên vô dụng.
    Nếu bạn chưa vững về truyền tham biến, tham chiếu vào hàm thì số n bạn nên nhập từ hàm main, rồi truyền vào hàm nhap như đối số bình thường
    Đã được chỉnh sửa lần cuối bởi clchicken : 19-10-2011 lúc 12:35 AM.

  4. #4
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    ủa mình vít có k j ko ta.
    bài vít rất hoành tá tràng hehe
    HT117-5277

Các đề tài tương tự

  1. Kỹ thuật C tính tổng các số chia hết cho 3 (dùng biến cấu trúc)
    Gửi bởi nhjmxu2601 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 02-11-2011, 12:19 PM
  2. Code tạo và lưu file dùng cho biến con trỏ. Giúp em vs.
    Gửi bởi why0591 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 19-12-2010, 05:04 PM
  3. Không dừng màn hình khi dùng getch()
    Gửi bởi van08t1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 29-04-2010, 01:11 AM
  4. Lệnh có chức năng như getch() trong J# là lệnh nào
    Gửi bởi vnnghia03 trong diễn đàn Thắc mắc chung
    Trả lời: 1
    Bài viết cuối: 06-12-2008, 12:28 AM
  5. Code dùng pointer, không biết sai chỗ nào ?
    Gửi bởi nguyenminhdanh trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 11
    Bài viết cuối: 07-10-2008, 09:07 AM

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