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 ???
Bài liên quan
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.
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
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.
là sao hả bạn, mình vẫn chưa hiểu lắm
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.