- ベストアンサー
構造体配列
いつもお世話になっています。 今日構造体配列を勉強した際に下の演習をしていたのですが、いまいち基礎的な関数や配列のことやコマンドライン引数のことが理解できていません。一応自分なりにプログラムを書いてみたのですが、エラーがでます。 どなたかアドバイス・ご指摘・解説・例などをおねがいいたします。 問題はコマンドライン引数で人数を指定し,人数分のデータを標準入力(キーボード)から構造体配列に入力し,標準出力(ディスプレイ)に出力するプログラムです。 #include<stdio.h> typedef struct{ char name[100]; int age; double height; double weight; } PERSONAL_DATA1; typedef struct{ int person[10]; }PERSONAL_DATA2; PERSONAL_DATA1 input_personal_data(int num); void output_personal_data(PERSONAL_DATA2 person[10],int num); int main(int argc, char *argv[]){ PERSONAL_DATA1 x; int num,i; char person[10]; if(argc != 2){ printf("Usage ./test number"); return 0; } num=atoi(argv[1]); for(i=0;i<10&&i<num;i++){ person[i]=input_personal_data(); output_personal_data(person,num); return 0; } } PERSONAL_DATA input_personal_data(void){ PERSONAL_DATA1 x; printf("name>"); scanf("%c" ,&x.name); printf("age>"); scanf("%d" ,&x.age); printf("height>"); scanf("%lf" ,&x.height); printf("weight>"); scanf("%lf" ,&x.weight); return x; } void output_personal_data(PERSONAL_DATA2 person[10],int num){ PERSONAL_DATA1 x; printf("name>>%s\n" ,x.name); printf("age>>%d\n" ,x.age); printf("height>>%lf[cm]\n" ,x.height); printf("weight>>%lf[kg]\n" ,x.weight); } またコマンドライン引数で指定したデータファイルAから入力した個人データ集合を構造体配列に取り込み,標準出力(ディスプレイ)と同じくコマンドライン引数で指定したデータファイルBへファイル出力に出力するプログラムというおまけの問題もあります。 こちらの問題のヒントもいただけませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> いまいち基礎的な関数や配列のことやコマンドライン引数の > ことが理解できていません。一応自分なりにプログラムを書 > いてみたのですが、エラーがでます。 > どなたかアドバイス・ご指摘・解説・例などをおねがいいた > します。 > 問題はコマンドライン引数で人数を指定し,人数分のデータ > を標準入力(キーボード)から構造体配列に入力し,標準出力 > (ディスプレイ)に出力するプログラムです。 問題(要求仕様)を整理してみましょう。 (1) コマンドライン引数から、人数を指定する (2) 人数分のデータを標準入力から入力する (3) そのデータを構造体配列に格納する (4) 格納したデータを標準出力に出力する 【第1段階】 一人分のデータの構造体を定義する #define NAMEMAX (50) typedef struct { char name[NAMEMAX]; int age; double height; double weight; } PERSONAL_DATA; 【第2段階】 N人分(例として10人分)のデータを格納する 配列を定義する #define NINZU (10) PERSONAL_DATA persons[NINZU]; 【第3段階】 一人分のデータを入力する関数を作成する void InputPersonalData(PERSONAL_DATA *pdp) { char a_name[20]; int a_age; double a_height, a_weight; printf("データを入力してください\n"); printf("Name > "); scanf("%s", a_name); printf("\n"); printf("Age > "); scanf("%d", &a_age); printf("\n"); printf("Height > "); scanf("%lf",&a_height); printf("\n"); printf("Weight > "); scanf("%lf",&a_weight); printf("\n"); strcpy(pdp->name, a_name); pdp->age = a_age; pdp->height = a_height; pdp->weight = a_weight; } 【第4段階】 引数で指定された人数分、入力し、配列に格納する int count; //指定された人数が格納されているものとする 当然 count <= NINZU でなければならない int idx; //人数処理のカウンタ(インデックス) for(idx=0; idx < count; idx++) { InputPersonaData( &persons[idx] ); } 【第5段階】仕上げ 入力され、格納したデータの表示(出力) for(idx=0; idx < count; idx++) { printf("%-50s %3d years old, %lf cm, %lf kg\n", persons[idx].name, persons[idx].age, persons[idx].height, persons[idx].weight ); } あとは、だいたいわかりますね~~~d(^-^)ネ! > またコマンドライン引数で指定したデータファイルAから入 > 力した個人データ集合を構造体配列に取り込み,標準出力 > (ディスプレイ)と同じくコマンドライン引数で指定した > データファイルBへファイル出力に出力するプログラムと > いうおまけの問題もあります。 > こちらの問題のヒントもいただけませんか? 標準入力 :scanf ファイル入力 :fscanf 標準出力 :printf ファイル出力 :fprintf と関数がが変わるだけ、また、標準入出力は、open, close が不要ですが、ファイル入出力は、fopen, fclose が必要です。 あとは、自力でがんばってください!!
その他の回答 (3)
- postal0x02
- ベストアンサー率42% (24/57)
設計レベルで1から書き直したほうがいいです。 まず PERSONAL_DATA2 は不要ですね。 コマンドライン引数、構造体、配列、関数、ポインタを 一気に勉強するのではなく、1つ1つ地道に勉強しましょう。 掲載するソースコードはコンパイルが通るものにしましょう。
- asuncion
- ベストアンサー率33% (2127/6289)
ああ、それから、 >PERSONAL_DATA1 input_personal_data(int num); >PERSONAL_DATA input_personal_data(void){ も食い違ってますね。 設計をやり直した方がいいかもしれません。
- asuncion
- ベストアンサー率33% (2127/6289)
パッと見、おかしいなあと思うのは、 >PERSONAL_DATA1 input_personal_data(int num); >void output_personal_data(PERSONAL_DATA2 person[10],int num); >char person[10]; >person[i]=input_personal_data(); >output_personal_data(person,num); input_personal_data関数の戻り値の型とoutput_personal_data関数の第1引数の型が、 プロトタイプ宣言と呼び出し時とで矛盾していることです。