• ベストアンサー

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); } ================================================================

質問者が選んだベストアンサー

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ご自身でソースを一通り書いてみた努力は買います。 > 構造体の配列を用いて 題意の通りなら、こうでしょう。 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ですね。

ryuko_1001
質問者

お礼

自分で作ってみたものは似たような問題を参考にしながら考えたものなので若干変かもしれません… また明日やってみたいと思います. 回答ありがとうございました.

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.4

>『』の内容が問題文なので配列の定義はされてないです. >なのでint型の配列で定義しても問題ないと思います. 話がずれています。 問題文に「この構造体の配列を用いて」とある以上、 構造体の配列を定義することは必須です。 ところが、質問者さんのソースには見あたりません。 私は、「もしかして、質問者さんは「構造体の配列」の定義の理解度が足りないのかな?」と思いました。 そこで、「構造体ではない配列の定義はできるだろうか」と考え、 「int型の配列は定義できますか?」とたずねたのです。 今回の問題をint型の配列で解けばよい、と言っているのではありません。

ryuko_1001
質問者

補足

そういう意味でしたか… 勘違いして申し訳ないです. 問題文には「構造体の配列を…」とありますが,まずはもとになるプログラムを作ろうと思って書いたので配列はまだ入ってません. 説明不足でした.

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

>この構造体の配列 構造体の配列の定義がありませんね。 別の型、例えばint型の配列(要素数3)を定義することはできますか?

ryuko_1001
質問者

補足

『』の内容が問題文なので配列の定義はされてないです. なのでint型の配列で定義しても問題ないと思います.

  • g540593
  • ベストアンサー率0% (0/1)
回答No.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の後の,は不要でしょう。

ryuko_1001
質問者

お礼

回答ありがとうございます. 参考になりました.明日ご指摘の通りにやってみます. 最後の『,』はうち間違いです…

関連するQ&A

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 合計の出し方

    よろしくお願いいたします。 プログラミングの勉強中です。 国語:78 算数:94 理科:68 社会:70 英語:75 合計点は385点です。 と表示されるプログラムを作り、数字は変えられるようにscanfを使用します。 自分で以下のように作ってみたのですが、合計だけがめちゃめちゃな数で出て来てしまいます。 どこが間違っているか教えていただけますか? #include<stdio.h> main() { int kokugo; int sansuu; int rika; int syakai; int eigo ; int sum = kokugo+sansuu+rika+syakai+eigo; printf("国語:"); scanf("%d",&kokugo); printf("算数:"); scanf("%d",&sansuu); printf("理科:"); scanf("%d,&rika"); printf("社会:"); scanf("%d,&syakai"); printf("英語:"); scanf("%d,&eigo"); printf("合計点は%d点です。",sum); }

  • 構造体についてです。

    typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。

  • classmate[a].name がうまく出力できません。

    ソースはこれです。途中は省略してますが、これでいいと思っています。 int aで指定した構造体に....[a].nameで文字を表示したいのですが、以下のようではうまくいきません。 宜しくお願いします。 struct classmatedata { char name[15]; int age; char sex[1]; struct seiseki ten; }classmate[member]; inline void classdata::outputseiseki() { int a; printf("成績を表示します。 番号="); scanf("%d",&a); printf("名前=%s\n",classmate[a].name); printf("国語=%d 社会=%d 数学=%d 理科=%d 英語=%d\n",classmate[a].ten.kokugo,classmate[a].ten.syakai,classmate[a].ten.sugaku,classmate[a].ten.rika,classmate[a].ten.eigo); }

  • C言語による構造体の値渡しについて

    以下プログラムを作成しました。 1.read_file関数によりファイルを読み込み。 2.avg_kokugo関数により、国語の平均点を出す。 という流れで組まれているのですが、 1.read_file関数実行時に、dat構造体を渡しています。 2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。 ここで、疑問なのが、 「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、 「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」 本を参考にして勉強していたのですが、 「構造体は、値渡しの時に読み込みはできるが、更新はできない」 と書かれていたのです。(ポインタ参照渡しの時は可能。) なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか? 更新と新規格納は意味が異なるからなのでしょうか? ご教授よろしくお願いします。 <ソース> #include <stdio.h> //グローバル #define FNAME "test.txt" struct score{ char name[20]; int kokugo; int sansu; }; int read_file(struct score dat[],int n); float avg_kokugo(struct score dat[],int n); int main(void){ struct score dat[3]; int ret; float kokugo; float sansu; ret= read_file(dat,3); if(ret <0){ return 0; } kokugo = avg_kokugo(dat,3); printf("国語の平均 %.1f\n",kokugo); return 0; } int read_file(struct score dat[],int n){ FILE *fp; //ファイルポインタ int i; fp=fopen(FNAME,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return -1; //-1によるプログラム強制終了 } //データ読み込み i=0; //datに保存していく。 while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){ i=i+1; //ファイル件数読み込み } fclose(fp); return 0; } float avg_kokugo(struct score dat[],int n){ int sum; //合計 float answer; int i; sum=0; for(i=0;i<n;i++){ sum = sum + dat[i].kokugo; } //平均点を求める answer =(float)sum / (float)n; return answer; }

  • C言語 構造体の並び替え 

    #include<stdio.h> typedef struct{ char mozi[10]; char namae[30]; }PE; void input_profile(PE *p,int *a); void printf_profile(PE *p,int *a); int main(void) { int i=0; PE c[999]; input_profile(c,&i); return 0; } void input_profile(PE *p,int *a){ int c,b; for(b=0;999>b;b++) { printf("名前を入力\n"); scanf("%s",(p+b)->namae); printf("文字を入力\n"); scanf("%s",(p+b)->mozi); printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n"); scanf("%d",&c); if(c==0)break; } b++; *a=b; printf_profile(p,a); } void printf_profile(PE *p,int *a) { int b; for(b=0;*a>b;b++) { printf("NO%d\n",b+1); printf("文字%s\n",(p+b)->mozi); printf("名前%s\n",(p+b)->namae); } } このプログラムを 自分で関数を作って データ一覧をmoziのアルファベット順に表示するように書きなおしたいんですけど どうなるのでしょうか? どうか教えてください

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • fscanfの使い方

     現在C言語の勉強をしているのですが、ファイル入力のfscanfの使い方がいまいちわかりません。  テキストファイル「TEST4K01.txt」には 「A01MATSUMOTO 090075100」が入ってるのですが、それぞれ構造体に直接振り分けて格納したい為fscan関数を使って下のソースを書いたのですがコンパイルするといつも以上終了してしまいます。大変申し訳ないのですが、誰か助言を御願いします。 #include<stdio.h> #include<stdlib.h> struct score { char clas_i; char num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; FILE *ifp; int main(void) { struct score dt; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%1c%2d%10c%3d%3d%3d\n", &dt.clas_i, &dt.num_i, &dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); printf("%s", dt.clas_i); printf("%d", dt.num_i); printf("%s", dt.name); printf("%d", dt.eigo_i); printf("%d", dt.sugaku_i); printf("%d", dt.kokugo_i); fclose(ifp); return 0; }

  • C言語 関数が文字列を含む構造体を返すとき

    生徒名、テストの点数 を要素とする構造体 struct test{char name[10];int score;}; を定義し、 点数の大きいほうを返す関数 struct test Top(struct test test1,struct test test2) { if(test1.score > test2.score) return test1; else return test2; } を定義しました。(この状態では同点のとき後者を返してしまいますが) main関数内で struct test test1; struct test test2; strcpy(test1.name,"yamada"); test1.score=70; strcpy(test2.name,"tanaka"); test2.score=90; と宣言・代入したあと、Top関数が返した点数と名前を表示したいのですが、 名前の表示がうまくいってくれません。 文字配列の操作が誤っているのでしょうか? 実行したのは次の操作です。 printf("Top score = %d\n",Top(test1,test2).score); printf("Top man = %c\n",Top(test1,test2).name[0]); printf("Top man = %s\n",Top(test1,test2).name); Top score = 90 Top man = t Top man = tanaka と表示されるのを期待していたのですが、 前二つの表示が終わるとダンプを起こしてしまいます

専門家に質問してみよう