• 締切済み

このCのプログラムの修正と追加してくれませんか

完成まで近いのですが、詰まっております このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。実行結果のとおりになるようお願いします http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています、実行結果も含まれています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; int main(void) { int a; while(1) { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } if (a==1){ read_file(); } if (a==2){ p_all(); } if (a==3){} if(a==4){ break; } return a; } /*read_file関数の宣言*/ void read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } return 0; } /*p_all関数の宣言*/ void p_all(void) { int i; printf("名前 身長(cm) 体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } int main(void) { }

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.5

▼whileで繰り返すブロックはscanf()までではなくa==1,2,3,4の判定も含みます > while(1) > { > 中略 > scanf("%d",&a); > } ▼この箇所だけ変数名 a が全角文字 > if (a==2){ > p_all(); > } ▼ 誤× fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight) 正○ fscanf(fp,"%s %d %lf",data[cnt].name,&data[cnt].height,&data[cnt].weight) ▼戻り値はvoidだと関数定義したなら,単にreturn;あるいはreturn文を書かない > void read_file(void) > { > 中略 > return 0; > } 以上のような凡ミスはあるものの, 提示されたコードを見るかぎり,プログラム言語の文法は分かっており,何をすべきかそれをどう書くかも分かっていらっしゃるように思います。 「(3) 特定データの表示」機能もある程度ご自分でコーディングできるのではないですか。 質問に対して一言のお礼すら返さない質問者は好みではないので,とりあえずこの辺で。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

少し進んでは新しく「続きの質問」を出すのはどうかと思いますが……。 まあ、判断は事務局がしてくれるでしょうから置いといて。 >if (a==1){ >read_file(); >} >if (a==2){ >p_all(); >} >if (a==3){} >if(a==4){ >break; >} if文を羅列するのではなく、こういう場合はswitch~caseを使用する方が効率的でしょう。 aが1だった時にループで戻る前に「aが2か判定」=>「2ではないので次へ」=>「aが3か判定」=>「3ではないので次へ」……のような処理が入ることになります。 # まぁコンパイラの最適化でよろしく処理してくれるかもしれませんけどね。 switch~caseでbreakしても、その上のループ等までは抜けないので注意が必要です。 ってか終了はループの終了条件(継続条件)で判定するべきでしょうけどね。 # whileループにするか、do~whileのループにするかは状況次第。 # 今回の場合だとdo~whileですかねぇ……。

回答No.3

while(1) の ループ範囲が間違っています。 「なにを」繰り返したいのか、その範囲を while にしましょう。 単に、元のソフトの do - while を while に書き直しただけではだめです。 「繰り返したい範囲」が違いますから。 あと、「main() を 下に持ってくる」のと「main() を下に追加する」のは、別のことです。

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.2

while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } ここの  fclose(fp);  printf("ファイルを読み込みました。\n"); はwhileの外に出しましょう。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

で、ご質問は何ですか?

関連するQ&A