アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語の勉強をしているものですが以下の問題のエラーが取れなくて困っております。

問題文で構造体のポインタを用いるとの指定がありましたので、それに従っているつもりですが、
*をとる?という読めるエラーが出てしまいます。
また、その他のエラーに関してもどう対応してよいのか困っております。
どなたかお時間がありましたら、アドバイス頂けると幸いです。

【問題分】
以下の表は、あるクラスのテストの成績を示す票である。この生徒情報を構造体として作成し、それぞれの科目の平均点を構造体のポインタを用いて求めなさい。
学生番号  国語  算数  理科  社会  英語
1001     82   43   53    84   45
1002     92   83   88    79   99
1003     43   32   53    45   66
1004     72   73   71    68   59
1005     99   72   82    91   94

この時、以下の構造体を作成し、利用すること。

【student_data:学生の番号と、点数のデータを保存する構造体 】
typdef struct{
int id; // 学生番号
int kokugo; // 国語の点数
int sansu; // 算数の点数
int rika; // 理科の点数
int shakai; // 社会の点数
int eigo; // 英語の点数
}student_data;

【期待される実行結果】
国語 平均 = 77.60
数学 平均 = 60.60
理科 平均 = 69.40
社会 平均 = 73.40
英語 平均 = 72.80




【私が作成してビルドした結果】
**** Build of configuration Debug for project probex6-4 ****

**** Internal Builder is used for build ****
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ..\main.c
..\main.c: In function `Avarage':
..\main.c:75: error: invalid type argument of `->'
..\main.c:81: error: invalid type argument of `->'
..\main.c:87: error: invalid type argument of `->'
..\main.c:93: error: invalid type argument of `->'
..\main.c:99: error: invalid type argument of `->'
Build error occurred, build is stopped
Time consumed: 218 ms.

【私が作成したソース】
#include <stdio.h>

typedef struct{
int id;
int kokugo;
int sansu;
int rika;
int shakai;
int eigo;
}student_data;

void Avarage(student_data *data,double *ave);

int main(void){
student_data data[5];
double ave[5];

data[0].id = 1001;
data[1].id = 1002;
data[2].id = 1003;
data[3].id = 1004;
data[4].id = 1005;

data[0].kokugo = 82;
data[1].kokugo = 92;
data[2].kokugo = 43;
data[3].kokugo = 72;
data[4].kokugo = 99;

data[0].sansu = 43;
data[1].sansu = 83;
data[2].sansu = 32;
data[3].sansu = 73;
data[4].sansu = 72;

data[0].rika = 53;
data[1].rika = 88;
data[2].rika = 53;
data[3].rika = 71;
data[4].rika = 82;

data[0].shakai = 84;
data[1].shakai = 79;
data[2].shakai = 45;
data[3].shakai = 68;
data[4].shakai = 91;

data[0].eigo = 45;
data[1].eigo = 99;
data[2].eigo = 66;
data[3].eigo = 59;
data[4].eigo = 94;

Avarage(data,ave);

printf("国語 平均 = %4.2f\n 数学 平均 = %4.2f\n 理科 平均 = %4.2f\n 社会 平均 = %4.2f\n 英語 平均 = %4.2f\n", ave[0],ave[1],ave[2],ave[3],ave[4]);

return 0;
}

void Avarage(student_data *data,double *ave){

int i;

int sum = 0;

for(i=0;i<5;i++){
sum = sum + data[i]->kokugo;
}
ave[0] = sum / 5;
sum = 0;

for(i=0;i<5;i++){
sum = sum + data[i]->sansu;
}
ave[1] = sum / 5;
sum = 0;

for(i=0;i<5;i++){
sum = sum + data[i]->rika;
}
ave[2] = sum / 5;
sum = 0;

for(i=0;i<5;i++){
sum = sum + data[i]->shakai;
}
ave[3] = sum / 5;
sum = 0;

for(i=0;i<5;i++){
sum = sum + data[i]->eigo;
}
ave[4] = sum / 5;

}

A 回答 (2件)

エラー行の data[i]->sansu で "->" の左側の data[i] は「ポインター」を示している必要がありますが、この場合のこの書き方 (data[i]) は「実体」を示しています。


よって、エラーになっているわけで、この場合 data[i].sansu と書くか、(data + i)->sansu と書く必要があります。
    • good
    • 0

data が student_data *(student_data へのポインタ)


 だとしたら
data[X] ( *(data+X) と等価 )
 の型は何になるか、よーく考えてみましょう。
data の型は?
data +X の型は?
*(data + X)の型は?
と順番に考えるとよいでしょう。


-> の前は、構造体(等)へのポインタである必要があります。
エラーが出ているのは、 -> の左がポインタになっていないからです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!