質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2896閲覧

構造体のプログラム

ikuo-biyori

総合スコア56

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/12/15 22:27

編集2016/12/15 23:41

いつもお世話になっています。C言語初心者でただいま勉強中です。構造体について質問させていただきます。ファイルから構造体配列に読み込んで以下のように出力するプログラムを作りたいんですが、worningとerrorが出て、実行がうまくできません。以下がコードです。

C言語

1コード 2```ここに言語を入力
#include <stdio.h> #include<stdlib.h> char grade(Record );/*成績判定*/ typedef struct{ char sid[8]; char sname[10]; int score[5]; char grade; double ave; } Record; char grade(Record );/*成績判定*/ int main(int argc,char *argv[]) { Record hyo[20],data[20]; FILE *fp; int i=0,j,z; if(argc!=2){/*ファイル名がないとき*/ printf("Error! Usage: ./a.out datafilename\n"); exit(8); } if((fp=fopen(argv[1],"r"))==NULL){/*ファイル読む*/ printf("Error! Usage: ./a.out datafilename\n"); exit(8); } while(1){ hyo[i].ave=0; if(fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].score[0],&hyo[i].score[1],&hyo[i].score[2],&hyo[i].score[3]))==EOF){ break;/*EOFなら、ループ抜ける*/ } for(j=0;j<4;j++){ hyo[i].ave+=hyo[i].score[j]; } i++; }z=i;/*EOFになったときのiの値記憶*/ for(i=0;i<j;i++){ hyo[i].ave=hyo[i].ave/4.0; hyo[i].grade= grade(hyo); } for(i=0;i<j;i++){ printf("%s %s %d %d %d %d %f %c\n",hyo[i].sid,hyo[i].sname,hyo[i].score[0],hyo[i].score[1],hyo.score[2],hyo[i],score[3],hyo[i].ave,hyo[i].grade); } fclose(fp); printf("Input a student name/ID :"); return 0; } char grade(Record obi) { int average;/*構造体に代入して条件分岐に使う*/ average=obi.ave; if(average>=0.0 && average<35.0){ return 'F'; } else if(average>=35.0 && average<50.0){ return 'D'; } else if(average>=50.0 && average<65.0){ return 'C'; } else if(average>=65.0 && average<80.0){ return 'B'; } else if(average>=80.0 && average<=100.0){ return 'A'; } }

コンパイルした結果

char grade(Record );/*成績判定*/ ^ a92.c:27:16: warning: expression result unused [-Wunused-value] if(fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].s... ^~ a92.c:27:19: warning: expression result unused [-Wunused-value] if(fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].s... ^~~~~~~~~~~~~~~~~~~~ a92.c:27:47: warning: expression result unused [-Wunused-value] if(fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].s... ~~~~~~ ^~~ a92.c:27:58: warning: expression result unused [-Wunused-value] if(fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].s... ~~~~~~ ^~~~~ a92.c:27:64: warning: expression result unused [-Wunused-value] ...%s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].score[0],&hyo[i].score[... ^~~~~~~~~~~~~~~~ a92.c:27:81: warning: expression result unused [-Wunused-value] ...%d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].score[0],&hyo[i].score[1],&hy... ^~~~~~~~~~~~~~~~ a92.c:27:98: warning: expression result unused [-Wunused-value] ...&hyo[i].score[2],&hyo[i].score[3]))==EOF){ ^~~~~~~~~~~~~~~~ a92.c:27:132: error: too few arguments to function call, expected at least 2, have 1 ...fscanf((fp,"%s %s %d %d %d %d",hyo[i].sid,hyo[i].sname,&hyo[i].score[0],&hyo[i].score[1],&hyo[i].score[2],&hyo[i].score[3]))... ~~~~~~ ^ a92.c:41:100: error: member reference base type 'Record [20]' is not a structure or union ...%c\n",hyo[i].sid,hyo[i].sname,hyo[i].score[0],hyo[i].score[1],hyo.score[... ~~~^~~~~~ a92.c:41:117: error: use of undeclared identifier 'score' ...score[3],hyo[i].ave,hyo[i].grade); ^ 7 warnings and 4 errors generated.

やりたいこと
./a.out seiseki.data
1249001 Jack 87 70 71 92 80.0 A
1249002 Jo 67 77 75 92 77.8 B
1249003 Akira 37 60 71 52 55.0 C
1249004 Kouichi 79 61 82 70 73.0 B
1249005 Georgia 77 60 75 55 66.8 B
1249006 Linus 88 66 75 45 68.5 B
1249007 Lucy 43 79 64 18 51.0 C
1249008 Boss 45 46 75 98 66.0 B
1249009 Mary 99 96 95 99 97.2 A
1249010 Makoto 40 25 37 27 32.2 F
1249011 Hiroshi 70 95 96 68 82.2 A
1249012 Max 34 58 52 45 47.2 D
1249013 Show 99 69 77 60 76.2 B
1249014 Kohei 81 45 46 75 61.8 C
1249015 Yasu 29 37 40 20 31.5 F
1249016 Kazu 95 97 90 95 94.2 A

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コンパイルが通る様にしました。

#include <stdio.h> #include<stdlib.h> //char grade(Record );/*成績判定*/ typedef struct{ char sid[8]; char sname[10]; int score[5]; char grade; double ave; } Record; char grade(Record );/*成績判定*/ int main(int argc,char *argv[]) { Record hyo[20],data[20]; FILE *fp; int i=0,j,z; if(argc!=2){/*ファイル名がないとき*/ printf("Error! Usage: ./a.out datafilename\n"); exit(8); } if((fp=fopen(argv[1],"r"))==NULL){/*ファイル読む*/ printf("Error! Usage: ./a.out datafilename\n"); exit(8); } while(1){ hyo[i].ave=0; if(fscanf(fp,"%s %s %d %d %d %d", hyo[i].sid, hyo[i].sname, &hyo[i].score[0], &hyo[i].score[1], &hyo[i].score[2], &hyo[i].score[3])==EOF){ break;/*EOFなら、ループ抜ける*/ } for(j=0;j<4;j++){ hyo[i].ave+=hyo[i].score[j]; } i++; } z=i; /*EOFになったときのiの値記憶*/ for(i=0;i<z;i++){ hyo[i].ave=hyo[i].ave/4.0; hyo[i].grade= grade(hyo[i]); } for(i=0;i<z;i++){ printf("%s %s %d %d %d %d %f %c\n", hyo[i].sid, hyo[i].sname, hyo[i].score[0], hyo[i].score[1], hyo[i].score[2], hyo[i].score[3], hyo[i].ave, hyo[i].grade); } fclose(fp); printf("Input a student name/ID :"); return 0; } char grade(Record obi) { int average;/*構造体に代入して条件分岐に使う*/ average=obi.ave; if(average>=0.0 && average<35.0){ return 'F'; } else if(average>=35.0 && average<50.0){ return 'D'; } else if(average>=50.0 && average<65.0){ return 'C'; } else if(average>=65.0 && average<80.0){ return 'B'; } else if(average>=80.0 && average<=100.0){ return 'A'; } }

投稿2016/12/16 00:15

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuo-biyori

2016/12/16 00:48

ありがとうございます。実行できました。scanfやprintfする時にscanf("%d %d", ans1, ans2, ); のようにコード書くと分かりやすくていいですね。これからそのようにコード書くようにします。また、hyo[20]にしていたからhyoのままだとhyo[0]しか渡していないことになってエラーがでる。だからhyo[i]にする。この解釈であっていますか?
A.Ichi

2016/12/16 01:09

コンパイルの言語は、一行でも複数に並べても変わらないので、見易さを優先されたら良いと思います。 hyoだと確かに先頭ですが、受け側がRecordなのでタイプ違いのワーニングとなります。 grade(hyo[i])は、構造体Recordのhyo[]20個の内、ひとつ分を順に渡してあげる様にしました。 あとは、data[20]は、なんかに使われる予定だったのでしょう。
ikuo-biyori

2016/12/16 01:14

教えていただき、ありがとうございました。よく分かりました。
guest

0

C

1if (fscanf((fp,...))==EOF)

試してないけど、fscanfの()が2重になってるからじゃない?

C

1if (fscanf(fp,...)==EOF)

投稿2016/12/15 23:53

kopio

総合スコア487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問