
名簿作成のプログラム、コンパイルしたときに
自分で入れた名簿を全て表示させたいのですが
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
標準出力先を変える
-
4の倍数を論理演算で表す。。
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
2の累乗を計算するプログラム...
-
ホームページをC言語で作りたい...
-
C言語について
-
C言語プログラミング 漸化式に...
-
printfの出力内の文字をdefine...
-
Visual Sutdio 2017 でのC言語...
-
3つの整数が等しいかどうか調...
-
Segmentation fault
-
2進数の乗算と除算
-
入力したお金の金額からお札の...
-
8人分のテストの点数を入力し、...
-
10個出力で改行したいのですが...
-
C言語で入力した変数の値から三...
-
アドレスの比較について
-
分数を表示するプログラム(長...
-
勝率をプログラムに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報