- ベストアンサー
c言語 構造体
大学での内容なのですが,『名前,数学の点数,英語の点数,国語の点数を格納できる(メンバに持つ)構造体を宣言し,この構造体の配列を用いて,3人分の情報をキーボードから入力後,各科目の平均点を画面に表示するプログラムを作成せよ.』という問題で,自分なりに作ってみたのですがうまくいきません.どなたか教えていただけませんか? 一応自分で作ったものを下に載せておきます. ================================================================ #include <stdio.h> #include <string.h> struct test { char name[20]; int sugaku; int eigo; int kokugo; }; int main(void) { struct test suzuki; int (suzuki.sugaku), (suzuki.eigo), (suzuki.kokugo); strcpy(suzuki.name, "Suzuki"); printf("氏名:鈴木 一馬\n"); printf("数学:"); scanf("%d", &suzuki.sugaku); printf("英語:"); scanf("%d", &suzuki.eigo); printf("国語:"); scanf("%d", &suzuki.kokugo); struct test tanaka; int tanaka.sugaku, tanaka.eigo, tanaka.kokugo; strcpy(tanaka.name, "Tanaka"); printf("氏名:田中 二郎\n"); printf("数学:"); scanf("%d", &tanaka.sugaku); printf("英語:"); scanf("%d", &tanaka.eigo); printf("国語:"); scanf("%d", &tanaka.kokugo); struct test yamamoto; int yamamoto.sugaku, yamamoto.eigo, yamamoto.kokugo; strcpy(yamamoto.name, "Yamamoto"); printf("氏名:山本 三弘\n"); printf("数学:"); scanf("%d", &yamamoto.sugaku); printf("英語:"); scanf("%d", &yamamoto.eigo); printf("国語:"); scanf("%d", &yamamoto.kokugo); printf("数学の平均点は%dです。\n", ((suzuki.sugaku + tanaka.sugaku + yamamoto.sugaku) / 3.0)); printf("英語の平均点は%dです。\n", ((suzuki.eigo + tanaka.eigo + yamamoto.eigo) / 3.0)); printf("国語の平均点は%dです。\n", ((suzuki.kokugo, + tanaka.kokugo + yamamoto.kokugo) / 3.0)); return (0); } ================================================================
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご自身でソースを一通り書いてみた努力は買います。 > 構造体の配列を用いて 題意の通りなら、こうでしょう。 struct test test_result[3] = { {"鈴木 一馬", 0, 0, 0}, {"田中 二郎", 0, 0, 0}, {"山本 三弘", 0, 0, 0} }; 続いて、 > 3人分の情報をキーボードから入力 for(i=0; i<3; i++){ printf("氏名 : %s \n", test_result[i]); printf("数学:"); scanf("%d", &(test_result[i].sugaku)); 英語、国語も同様に。 } > 各科目の平均点を画面に表示する int sugaku_sum = 0; // 数学の点数合計 int eigo_sum = 0; // 英語の点数合計 int kokugo_sum = 0; // 国語の点数合計 for(i=0; i<3; i++){ sugaku_sum += test_result[i].sugaku; 英語、国語も同様に。 } あとは各教科の合計を 学生の人数(3)で割って表示すればOKですね。
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6289)
>『』の内容が問題文なので配列の定義はされてないです. >なのでint型の配列で定義しても問題ないと思います. 話がずれています。 問題文に「この構造体の配列を用いて」とある以上、 構造体の配列を定義することは必須です。 ところが、質問者さんのソースには見あたりません。 私は、「もしかして、質問者さんは「構造体の配列」の定義の理解度が足りないのかな?」と思いました。 そこで、「構造体ではない配列の定義はできるだろうか」と考え、 「int型の配列は定義できますか?」とたずねたのです。 今回の問題をint型の配列で解けばよい、と言っているのではありません。
補足
そういう意味でしたか… 勘違いして申し訳ないです. 問題文には「構造体の配列を…」とありますが,まずはもとになるプログラムを作ろうと思って書いたので配列はまだ入ってません. 説明不足でした.
- asuncion
- ベストアンサー率33% (2127/6289)
>この構造体の配列 構造体の配列の定義がありませんね。 別の型、例えばint型の配列(要素数3)を定義することはできますか?
補足
『』の内容が問題文なので配列の定義はされてないです. なのでint型の配列で定義しても問題ないと思います.
- g540593
- ベストアンサー率0% (0/1)
まず第一の問題は各生徒のtest構造体を宣言しているあとの1行がいりません。 つまり、 int (suzuki.sugaku), (suzuki.eigo), (suzuki.kokugo); int tanaka.sugaku, tanaka.eigo, tanaka.kokugo; int yamamoto.sugaku, yamamoto.eigo, yamamoto.kokugo; の3行がいりません。3つのメンバ変数sugaku,eigo,kokugoは struct test hogehoge; と宣言された時点で自動的に確保されています。 改めて宣言する必要はありません。 さらに第二の問題点は最後の3つのprintf文です。平均点は%d(整数)の変換子になっているのに、 その後の引数はdouble型になっています。これではエラーが出るので、 変換子を%f(浮動小数点)にするか、引数の方を3.0で割るのではなく3で割るようにすれば正しくなります。 あと、最後のprintfの中のsuzuki.kokugoの後の,は不要でしょう。
お礼
回答ありがとうございます. 参考になりました.明日ご指摘の通りにやってみます. 最後の『,』はうち間違いです…
お礼
自分で作ってみたものは似たような問題を参考にしながら考えたものなので若干変かもしれません… また明日やってみたいと思います. 回答ありがとうございました.