![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
名簿作成のプログラム、コンパイルしたときに
自分で入れた名簿を全て表示させたいのですが
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);
};
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』文にも終わりのブロックに『;』文字が
付いていますが、つける必要はありません。→文法からは『空文』
扱いでエラーにはなりませんが、記述が間違っています。注意。
・構造体とヘッダ部分は質問者さんの記述どおりです。
・以上。おわり。
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
4の倍数を論理演算で表す。。
-
printf で二進表示を行いたい。
-
C言語の勉強しています。すみま...
-
10個出力で改行したいのですが...
-
defineで定数が置き換えられな...
-
テキストカーソル位置の取得
-
switch分のケースを範囲数?に...
-
c言語でAからZまでを表示する...
-
%P と %X の違い
-
Cプログラムについて
-
1秒で動くインターバルタイマ
-
結果の表示
-
C言語での数字の花形表示
-
名簿作成 表示について
-
三角形の判別
-
printfの出力内の文字をdefine...
-
C++でfprintfやprintf,fopenな...
-
unsigned int型について
-
なぜgccはstdio.hをインクルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
【C言語教えてください】sin波...
-
三角形の判別
-
4の倍数を論理演算で表す。。
-
strcmp
-
%P と %X の違い
-
入力したお金の金額からお札の...
-
LU分解法のピボット選択機能実...
-
コマンドラインに出力した文字...
-
LU分解法のピボッティングにつ...
-
テキストカーソル位置の取得
-
c言語でAからZまでを表示する...
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
改行について 1行に何個かづ...
-
printfの出力内の文字をdefine...
-
C言語です このプログラミング...
おすすめ情報