• ベストアンサー

QNo.4191217 ライブラリ関数について教えてくださいの質問をした者です。

質問を連投するのは気が引けたのですが、 どうしても分からなかったのでまた質問させてください・・・ ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 前質問で、ライブラリ関数について教えていただき 以下のようにプログラムを作成してみました。 しかし、これだと結果が何も出力されませんでした・・・ 何が間違っていて、どうすればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((strcmp(test_p->no,f_no)==0) && (strcmp(test_p->name,f_name)==0) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); } test.txtの中身 001 akemi 002 kazuo 003 tadashi 005 mika 006 xxx

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

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

> for(i = 0; i <= data[i]; i++) { > と書けばいいんでしょうか? 配列の要素数を求めるには、sizeof() を使って、 sizeof(array) / sizeof(array[0]) と書くことがよくあります。 要するに、配列全体の大きさを先頭要素の大きさで割ると、 配列のサイズが求まるのです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

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

お手数ですが、最新のソースを見せてください。 入力ファイル test.txt の内容は変わってないですね?

peneflear
質問者

お礼

何度も親身にご回答いただきありがとうございました。 なんとか作成出来ました。 感謝致します。

全文を見る
すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

(プログラムのどこどこが悪い、ではなくて、「そもそも」について)  ・プログラムは、データが変動するたびの再構築は不適、と考えます。  ・ファイルは、データが変動するたびに再作成が適している、と考えます。 ☆変動する試験結果は「ファイル」に、不変な名簿テーブルは「プログラム」に。 と思います。もっとも、質問者様のように「逆」であっても、 ☆「プログラムの勉強」といわれれば、それまでですが・・。 -------------------------------------- 「プログラムの勉強」ということで、ソースをいじくって(BorlandC++5.6.4)みました。 ★それにつけても、学籍番号?と名前が一致するものが一人だけとは・・。  プログラムデータ  ファイルデータ    001 akemi    001 akemi    002 tadao    002 kazuo    003 mika      003 tadashi    004 hiroshi    (なし)    005 kazu      005 mika      (なし)     006 xxx ------------------------------------- #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct{  int iNum;  char cName[16];  int iEnglish;  int iMath; }TEST; TEST sData[5] = {  { 1, "akemi", 100, 40 },  { 2, "tadao", 59, 76 },  { 3, "mika", 94, 69 },  { 4, "hiroshi", 54, 98 },  { 5, "kazu", 39, 57 } }; void main() {  FILE *fp;  int i, iTblNum, iOk;  char cTblName[16];  if( ( fp = fopen( "test.txt", "r" ) ) == NULL ){   printf( "NOT OPEN FILE\n" );   exit( 1 );  }  while( 2 == fscanf( fp, "%d%s", &iTblNum, cTblName ) ){   iOk = 0;   for( i = 0; i < 5; i++ ){ // 人物特定    if( iTblNum != sData[i].iNum ) continue; // 学籍番号    if( strcmp( cTblName, sData[i].cName ) ) continue; // 名前    printf( "%03d %-8s 英語 %3d 数学 %3dです。\n", iTblNum, cTblName, sData[i].iEnglish, sData[i].iMath );    iOk = 1;    break;   }   if( iOk ) continue;   printf( "%03d %-8s さんの結果がありません。\n", iTblNum, cTblName );  }  fclose( fp ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

peneflear
質問者

お礼

詳しいご説明ありがとうございます。 まだまだ勉強不足なのが身にしみてわかりました・・・

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.6

配列の要素数をマクロ定義で求めるのであれば、引数に配列名を指定して #define SIZE(array) (sizeof(array)/sizeof(array[0])) なんて書くんでしょうね、きっと。 汎用的に使えますから。

peneflear
質問者

お礼

色々と教えていただきありがとうございます。 しかし、今のままでは動くことは動くのですが 表示結果が正しくありません・・・ 他にどこが間違っているのでしょうか・・・

全文を見る
すると、全ての回答が全文表示されます。
  • ency
  • ベストアンサー率39% (93/238)
回答No.5

勝手ながら、No.4 asuncionさんに補足しますと、配列の初期値がある場合は、マクロを使って以下のような書き方をすることが多いですね。 配列定義の要素数は省略すると、初期値のある分だけぴったり領域を確保してくれます。 # 配列の初期値がある場合は、こっちのほうが多いかな? ------------------------------------------------------------------------ struct test data[] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; /* データサイズを、配列サイズから算出 */ #define DATA_SIZE sizeof(data)/sizeof(data[0]) /* これ以降は、配列サイズには「5」の代わりに「DATA_SIZE」を使用する */ ------------------------------------------------------------------------ あるいは、配列サイズとして、以下のように直接数値をマクロに設定してしまうことも結構あります。 # 特に配列に初期値がない場合は、このやり方が使われますね。 # 初期値がある場合でも使わないことはないと思うけど、ちょっと不自然な気がするかなぁ。。。 # ←あくまで個人的な感覚の話です。 ------------------------------------------------------------------------ /* データサイズは「5」 */ #define DATA_SIZE 5 struct test data[DATA_SIZE] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; /* これ以降は、配列サイズには「5」の代わりに「DATA_SIZE」を使用する */ ------------------------------------------------------------------------ 要するに、「コードの中に数値を直接書くことは極力避けるような習慣をつけましょう」ということです。 あとで見たときにその数値が何を意味するものなのかがわからなくなるし、サイズを変えたいときに修正箇所が多くなって面倒ですよね。 ご参考まで。

peneflear
質問者

お礼

先に定義しておけば変更箇所が少なくなるのですね。 ご説明ありがとうございます。 しかし、動くことは動くのですが 表示結果は正しくありません・・・ もしよろしければ、他にどこが間違っているのかの ご指摘をお願いします・・・

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

> ロードするファイルの中のデータに > 数値が入っているとは限らない ロードするファイルとは、何のことですか? test.txt のことですか? だとすると、test.txt には番号と名前が書いてあるだけで、 点数はプログラムの中に書いてありますよね。 ロードするファイルが test.txt 以外である、ということでしたら、 具体的な補足説明をお願いします。

peneflear
質問者

お礼

勘違いしていました、すみません。 test.txtは番号と名前だけなんで 点数は数値として書くべきですね・・・ ご指摘ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

細かい話をすると、 英語と数学の点数がどうして「文字列」なのですか? 点数って、普通「数値」じゃないですか?

peneflear
質問者

お礼

普通は数値なのですが、 ロードするファイルの中のデータに 数値が入っているとは限らないものだとして作成したため、 すべて文字列として作成しました。

全文を見る
すると、全ての回答が全文表示されます。
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

そもそもコンパイルが通らないけど、 > char f_no[5], f_name[5]; f_nameの要素数が少ない。 > if((strcmp(test_p->no,f_no)==0) && (strcmp(test_p->name,f_name)==0) { ) が足りない。 この2点を修正すれば一応動く。 > struct test *test_p; > test_p = data; test_pの必要性は? > ++test_p; test_p = data;の代入をやり直しているところがないから、 もし5回インクリメントしてしまうとtest_pは参照できなくなる。 素直にdata[i]で参照すれば良いのに。 > for(i = 0; i<=5; i++) { 配列dataの要素数が5なのにループ回数が6回なのはおかしくないか? できれば5はそのまま書かない方が良い。 > else { > printf("%s %s 一致しません\n", f_no, f_name); > break; > } 一致しないときにループを抜けてしまうと、 その後に一致するデータがあっても見つけられない。 最後まで一致する組が無かったときに一致なしとするべきで、 ループを抜ける必要があるのはむしろ一致したとき。 あと、main関数の最後にreturn 0;が無い。

peneflear
質問者

お礼

ご指摘ありがとうございます。 分からないことがあったので、また質問させてください。 >> struct test *test_p; >> test_p = data; >test_pの必要性は? >> ++test_p; >test_p = data;の代入をやり直しているところがないから、 >もし5回インクリメントしてしまうとtest_pは参照できなくなる。 >素直にdata[i]で参照すれば良いのに。 struct test *test_p; test_p = data; の部分を削除して、data[i]を使えばいいってことでしょうか? >> for(i = 0; i<=5; i++) { >配列dataの要素数が5なのにループ回数が6回なのはおかしくないか? >できれば5はそのまま書かない方が良い。 for(i = 0; i <= data[i]; i++) { と書けばいいんでしょうか? その他のご指摘は理解できました! 作成しなおしてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ライブラリ関数について教えてください

    C言語を独学で勉強しています。 ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 しかし、私が作っているプログラムでは表示結果が正しくありません。 char型では==を使って一致かどうかを調べることが出来ないので、ライブラリ関数を使う必要があることを知ったのですが、調べてもよくわかりませんでした・・・ どのように作ればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((test_p->no == f_no) && (test_p->name == f_name)) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); }

  • 検索機能

    名簿管理システムとしてメンバの追加、メンバの削除、メンバリストを名前順(アルファベット昇順)で表示、メンバリストのファイル出力 引数としてファイルパスを指定することによるメンバ初期データの読込ができるプログラムを以下のように作成しました。 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> typedef struct tagNode{ int no; char name[30]; struct tagNode *next; }Node; Node *ApndNode(Node *top, int no, char *name) { if(top == NULL){ top = (Node*)calloc(1, sizeof(Node)); top->no = no; strcpy(top->name, name); top->next = NULL; }else{ if(strcmp(top->name, name) > 0){ Node *p = (Node*)calloc(1, sizeof(Node)); p->no = no; strcpy(p->name, name); p->next = top; top = p; }else{ top->next = ApndNode(top->next, no, name); } } return top; } Node *DltNode(Node *top, int no, char *name) { if(top != NULL){ if(top->no == no && !strcmp(top->name, name)){ Node *p = top->next; free(top); top = p; }else{ top->next = DltNode(top->next, no, name); } } return top; } void PrintList(Node *top) { if(top != NULL){ printf("%-10d %s\n", top->no, top->name); PrintList(top->next); } } void PrintFile(Node *top) { FILE *fp; char file_name[256]; Node *p = top; printf("file name : "); scanf("%s", file_name); fp = fopen(file_name, "w"); if(!fp) return; while(p != NULL){ fprintf(fp, "%d %s\n", p->no, p->name); p = p->next;} fclose(fp); } void FreeList(Node *top) { while(top != NULL){ Node *p = top->next; free(top); top = p; } } int main(int argc, char *argv[]) { Node *top = NULL; int no, op; char name[30]; while ((op = getopt(argc, argv, "f:")) != -1){ switch (op){ case 'f': do{ FILE *fp = fopen(optarg, "r"); if(!fp) break; while(fscanf(fp, "%d%s", &no, name) == 2) top = ApndNode(top, no, name); fclose(fp); }while(0); } } while(1){ printf("--------command--------\n"); printf("1.Append\n2.Delete\n3.Show\n4.Save\n5.Quit\n"); printf("-----------------------\n"); printf("op : "); scanf("%d", &op); if(op == 5) break; switch(op){ case 1: printf("no : "); scanf("%d", &no); printf("name : "); scanf("%s", name); top = ApndNode(top, no, name); break; case 2: printf("no : "); scanf("%d", &no); printf("name : "); scanf("%s", name); top = DltNode(top, no, name); break; case 3: printf("=========list==========\n"); printf("<no> <name>\n"); PrintList(top); printf("=======================\n"); break; case 4: PrintFile(top); break; } } FreeList(top); return 0; } このプログラムに名前によって検索できる機能をつけるにはどのようにすればよいのでしょうか?教えてください。

  • 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; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 文字列の並び替えについて。

    #include<stdio.h> #include<string.h> main() {char name[40][50]; int i; for(i=1;i<=;i++){ printf("名前="); gets(name[i]); } if(strcmp(name[1],name[2])>0){ printf("%s %s \n",name[2],name[1]);} if(strcmp(name[1],name[2])<0){ printf("%s %s \n",name[1],name[2]);} if(strcmp(name[1],name[2])==0){ printf("%s %s \n",name[1]);} } は二人の名前を早い順に並べ替えるものなんですが、これを五人の名前を並べ替えるものにしたいので、どのようなプログラムにしたらいいのか教えてください。

  • ライブラリ関数

    文字列をコピーする(strcpy) 文字列の長さを調べる(strlen) 配列の長さを調べる(sizeof) #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } char *strcpy(char *d, const char *s) { while (*d++ = *s++) printf("pointer=%s \n",d); } /* 文字列sをdにコピーする[配列版] */ char *strcpy(char d2[], const char s2[]) { unsigned i=0; while (d2[i] = s2[i]){ i++; printf("hairetsu=%s\n",&d2[i]); } } /*--- 文字列strの長さを返す[ポインタ版] ---*/ size_t strlen(const char *s) { size_t len = 0; while (*s++) len++; return (len); } /*--- 文字列strの長さを返す[配列版] ---*/ unsigned strlen(const char str[]) { unsigned len = 0; while (str[len]) len++; return (len); } c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(48) : error C2084: 関数 'char *strcpy(char *,const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の前の定義を確認してください c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(68) : error C2084: 関数 'size_t strlen(const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(80) : 'strlen' の前の定義を確認してください 上記の問題が解決できません。助けてください><

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //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++; }

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

  • 名簿作成 表示について

    名簿作成のプログラム、コンパイルしたときに 自分で入れた名簿を全て表示させたいのですが main関数をどう変えれば出来るでしょうか? このままだと、1人分しか表示されません。 初心者なので丁寧に教えてくださればと思います。 #include<stdio.h> #define NAMELEN 30 #define NOLEN 10 char s; struct gakuseki{ char no[NOLEN]; char name[NAMELEN]; int age; }; struct gakuseki input_data(void){ struct gakuseki st; printf("input student number>"); scanf("%s",&st.no); /*getchar(); fgets(st.no,NOLEN,stdin);*/ printf("input name>"); getchar(); fgets(st.name,NAMELEN,stdin); printf("input age>"); scanf("%d",&st.age); printf("continue?(y/n)"); scanf("%s",&s); return st; }; void output_data(struct gakuseki g){ printf("----------------------------------\n"); printf("student number : %s\n",g.no); printf("name : %s\n",g.name); printf("age : %d\n",g.age); }; int main(){ int i,j; struct gakuseki stud; for(i=0;i<3;i++){ /* struct gakuseki stud;*/ stud=input_data(); if(s=='n') { break; }; }; output_data(stud); };

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • 質問ですが

    教えていただきたいのですが、C言語で名前と点数を入力して合計と平均を求めるというプログラムを作ったのですが、 main関数の中で情報入力、合計と平均の計算をしているのでそれぞれ入力関数、合計を求める関数、平均を求める関数というものを作ってmain関数をすっきりとさせたいのですがどうすればいいですか? #include <stdio.h> typedef struct{ char name[15]; int jpn; int eng; int math; int sum; } stdent; typedef struct{ double sum; double jpn; double eng; double math; } Score; void maxmin(stdent *, int); main() { int i, n; n = 5; stdent person[n]; Score average; average.jpn = 0; average.eng = 0; average.math = 0; average.sum = 0; for(i = 0; i < n; i++) { printf("Student No.%d \n",i + 1); printf("Name? "); scanf("%s", person[i].name); printf("Japanese? "); scanf("%d", &(person[i].jpn)); printf("English? "); scanf("%d", &(person[i].eng)); printf("Math? "); scanf("%d", &(person[i].math)); printf("\n"); person[i].sum = person[i].jpn + person[i].eng + person[i].math; average.jpn += person[i].jpn; average.eng += person[i].eng; average.math += person[i].math; average.sum += person[i].sum; } average.jpn /= n; average.eng /= n; average.math /= n; average.sum /= n; printf(" 名前 国語 英語 数学 \n"); printf("------------------------------------\n"); for(i = 0; i < n; i++) { printf("%8s %3d %3d %3d %3d\n", person[i].name, person[i].jpn, person[i].eng, person[i].math, person[i].sum); } printf("------------------------------------\n"); printf("平均 %.1lf %.1lf %.1lf %.1lf\n\n", average.jpn,average.eng,average.math,average.sum); return 0; }

このQ&Aのポイント
  • MFC-J6710で印刷できないエラーが発生し、試しに対処したところ記録紙が詰まっていることがわかりました。
  • Windowsで使用しており、無線LAN接続しています。
  • 光回線を使用しています。
回答を見る

専門家に質問してみよう