ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。

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

A 回答 (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』文にも終わりのブロックに『;』文字が
 付いていますが、つける必要はありません。→文法からは『空文』
 扱いでエラーにはなりませんが、記述が間違っています。注意。
・構造体とヘッダ部分は質問者さんの記述どおりです。
・以上。おわり。
    • good
    • 0

このプログラムでは、新しくデータを入力するときに、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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/10 11:47

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