アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
do
{
printf("**************身長・体重の表示***************\n\n");
printf(" データファイルの読み込み・・・・・(1)\n");
printf(" 全てのデータを表示・・・・・・・・(2)\n");
printf(" 特定のデータを表示・・・・・・・・(3)\n");
printf(" 終わり・・・・・・・・・・・・・・(4)\n\n");
printf("処理番号を入力してください\n");
scanf("%d",&a);
}
while(a<1 || a>4);
return a;
}

/*read_file関数の宣言*/
int 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関数の宣言*/
int 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);
}
}

最初の処理番号を入力した所で終わってしまいます、何とか改変してくださいお願いします
補足

A 回答 (4件)

ここ、質問サイトだからね。

わからないところはどこなの?

依頼サイトじゃないんだよ?
知恵袋でもいきな?
    • good
    • 0

return a;するので終わってしまいます。


while(;;);
//1,2,3の場合を場合分け
 if ( a == 4){
  return 0; //終わり
 }
}

こうすれば終わりません。
ファイルの読み込みread_all関数はa == 1の場合、
全件読み込みp_all関数ははa==2の場合に実行すればいいのではないでしょうか。

3名前を指定して実行は、p_allを拡張して、ループの中に名前を調べる判定文を追加し、
一致した名前のデータを出力する。
    • good
    • 0

>最初の処理番号を入力した所で終わってしまいます



そりゃそうですよね。
せっかく作ってあるread_file関数やp_all関数を呼び出していないのですから。

また、名前から推測するに、「すべてのデータを出力する」ための関数が
p_allであるように思います。仮にそうであるとして、では、
「特定のデータを出力する」ための関数のコードはどこにありますか?
    • good
    • 0

プログラムは、サンプルコードをコピー&ペーストすれば出来上がるというものではありませんので、質問を連投せずに、この質問内で分からないところを確認されて、理解した上でコードを書いて行ってみてください。




回答いただいたアドバイスで、どの辺りが分からないのでしょうか?
入力された数値をif文で判定して、

while( 1 ) {    // while文を無限にしておいて、ループ中に入力された内容によってbreakさせる。

printf( … (中略) …

  scanf( … (中略) …


  if (a==1)  read_file(); // ファイルの読み込み

  if (a==2)  p_all(); // 全データの表示

  // if (a==3) (個別データの表示。これは未だ作られていないので、後で追加)

  if (a==4) break; // while(1) を抜けて終了する。

}

の様に組めば動く、というアドバイスです。3番の処理はちょっと込み入った処理になるので後回しにするとしても、まずは、ここまでをやってみてください。

多分、このままコンパイルすると参照が解決していないので、エラーがワーニングが出るとは思いますが…参照の解決をするために、コードの置き方を、read_file()の本体、p_all()の本体の後に、main()を置いてみてください。

int read_file(void) { …(中略) …
}

inte p_all(void) { …(中略)…
}

int main(void) { …(中略)…

}

こうすれば、関数の参照のエラーはクリアできます。

まずは、ここまで。

この回答への補足

指示通り作成いたしました、次はどうしましょう?


#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)
{
}

補足日時:2013/07/12 13:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!