01/10/2018, 16:27

Lỗi chương trình tính số điểm trung bình bằng cách dùng struct

mình có bài tập như sau

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

struct seiseki{ 
  int number;
  float *score; //diem so cua tung mon
  int size_score; //tong so mon
  float ave; //diem trung binh
};

void calcAverage(struct seiseki *scores);

int main(){
  struct seiseki *scores;
  int N;
  int j,i;
  scanf("%d",&N);
  scores = (struct seiseki *)malloc(N*sizeof(struct seiseki));
  for(i=0; i<N;i++){
    scanf("%d", &scores[i].number);
    scanf("%d", &scores[i].size_score);
    for(j=0; j<scores[i].size_score; j++){
      scanf("%f",&scores[j].score[j]);
    }
    scores[i].ave = calcAverage(scores[i].score[i]); //no bi loi o cho nay
    printf("%d: ave = %f
",i,scores[i].ave);
  }
  return 0;
}
 //minh muon dung ham nay de tinh so diem trung binh cua scores.size mon cua N nguoi 
void calcAverage(struct seiseki *scores){
  int i;
  for(i=0; i<scores->size_score; i++){
    scores[i].ave = scores[i].ave + scores[i].score[i];
    scores[i].ave /= scores[i].size_score;
  }
}

nó yêu cầu mình phải tính số điểm trung bình của tất cả học sinh N
tuy nhiên khi mình thử dịch để chạy thử thì nó báo lỗi như thế này

 gcc kadai9.c
kadai9.c: In function ‘main’:
kadai9.c:26:33: error: incompatible type for argument 1 of ‘calcAverage’
     scores[i].ave = calcAverage(scores[i].score[i]);
                                 ^~~~~~
kadai9.c:12:6: note: expected ‘struct seiseki *’ but argument is of type ‘float’
 void calcAverage(struct seiseki *scores);

ai có thể giúp mình sửa lỗi này và giải thích vì sao lại xuất hiện lỗi này cho mình với được không ???

guo_da viết 18:38 ngày 01/10/2018

hàm calc của bạn trả về void. trong khi scores[i].ave là kiểu int => lỗi kiểu dữ liệu.

nya nguyen viết 18:33 ngày 01/10/2018

yêu cầu của ông thầy là dùng void, bạn có thể sửa đoạn ấy cho mình được không

guo_da viết 18:42 ngày 01/10/2018

nếu dùng void thì bạn chỉ cần đẩy trực tiếp con trỏ hoặc mảng vào trong hàm thôi.

nya nguyen viết 18:29 ngày 01/10/2018

là sao hả bạn, mình vẫn chưa hiểu lắm

guo_da viết 18:38 ngày 01/10/2018

tức là bạn đẩy trực tiếp mảng của bạn vào hàm calc. Vì bản chất của mảng chính là con trỏ, nên sau khi bạn truyền tham số này vào hàm thì tương đương với việc bản truyền địa chỉ của nó vào hàm. Nên sau khi kết thúc hàm, thì giá trị của nó vẫn được lưu lại.
Gần giống như việc sử dụng tham chiếu vậy. (Mình nói là gần giống thôi nhé)
Và việc gán
scores[i].ave = calcAverage(scores[i].score[i]);
là không cần thiết.
Trong quá trình làm, bạn chú ý cấp phát bộ nhớ hợp lí là được.

Bài liên quan
0