Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

名簿作成 表示について

名簿作成のプログラム、コンパイルしたときに 自分で入れた名簿を全て表示させたいのですが 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); };

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★引数には構造体アドレスを渡す方が良い。 ・回答者 No.1 さんの方法で一通り複数分の入力が出来ます。 ・外部変数 s で『continue?(y/n)』の『n』を入れていますが、  『input_data』関数の戻り値で『yes』、『no』とすればもっと  分かりやすくなりますよ。main 関数が…。 ・また、構造体はアドレス参照させると引数の複写がポインタのみ  だけになり処理の高速化につながります。アドレス参照のときは  『->』というアロー演算で構造体メンバをアクセスします。  『.』はドット演算です。 ●サンプル(回答者 No.1 さんとは別の回答で~す→動作は同じ) int input_data( struct gakuseki *st ) {  char s[ 32 ]; ←ここで宣言(容量に注意)    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( s[0] ); ←'y' or 'n'を返す } 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( void ) {  struct gakuseki stud[ MAXLEN ]; ←人数分の配列  int i, j;    for ( i = 0 ; i < MAXLEN ; i++ ){   if ( input_data(&stud[i]) == 'n' ){    break;   }  }  for ( j = 0 ; j < i ; j++ ){   output_data( &stud[j] );  } } 最後に: ・関数ブロックの最後の『};』にある『;』文字は必要ありません。 ・また、『for』、『if』文にも終わりのブロックに『;』文字が  付いていますが、つける必要はありません。→文法からは『空文』  扱いでエラーにはなりませんが、記述が間違っています。注意。 ・構造体とヘッダ部分は質問者さんの記述どおりです。 ・以上。おわり。

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

その他の回答 (1)

回答No.1

このプログラムでは、新しくデータを入力するときに、1個前に入力したデータを上書きしてしまうので、最後に入力したデータしか覚えておけません。 今まで入力したデータをすべて格納しておけるように、struct gakusekiの配列を用意し、そこにデータを格納していきます。 #include<stdio.h> #define NAMELEN 30 #define NOLEN 10 char s; #define MAXLEN 100 // データ数の限度 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[MAXLEN]; /* ループはデータ数限度まで */ for(i=0;i<MAXLEN;i++){ stud[i]=input_data(); if(s=='n'){ break; } } /* この時点で i は (入力したデータ数-1) となっている */ /* 入力したすべてのデータを出力する */ for(j=0;j<=i;++j) output_data(stud[j]); return 0; }

torya9
質問者

お礼

ありがとうございます。 うまく作れました。 感謝です。

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

関連するQ&A