
名簿作成のプログラム、コンパイルしたときに
自分で入れた名簿を全て表示させたいのですが
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
C言語
-
printfの出力内の文字をdefine...
-
じゃんけんゲームの応用
-
ホームページをC言語で作りたい...
-
サイコロをふって、出た目のパ...
-
cshの文字列操作(0埋め)
-
strcmp
-
printf で二進表示を行いたい。
-
円の面積を求めるプログラミン...
-
Cプログラムについて
-
10個出力で改行したいのですが...
-
アドレスの比較について
-
4の倍数を論理演算で表す。。
-
分数を表示するプログラム(長...
-
改行について 1行に何個かづ...
-
3つの整数を画面から入力して...
-
c言語で2000年以降カレンダーを...
-
C言語での、年複利の計算方法...
-
c言語でAからZまでを表示する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
cshの文字列操作(0埋め)
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
アドレスの比較について
-
コマンドプロンプトがすぐ消える
-
Visual Sutdio 2017 でのC言語...
-
defineで定数が置き換えられな...
-
10個出力で改行したいのですが...
-
ifなんですが
-
c言語で2000年以降カレンダーを...
-
WM_CLOSEで閉じれないウィンド...
-
%P と %X の違い
-
Cプログラムについて
-
三角形の判別
おすすめ情報