- ベストアンサー
構造体
下記プログラムの2次元配列を構造体の配列に作り変え,構造体を利用して生年月日の項目を追加し,形式は日を除いたYYYY/MMで持ち,生年月日の入出力は,YYYY/MM形式で行い,西暦が数字4桁で,西暦と月の間に'/'があり,月が01~12の範囲の数字の2桁になっている7文字の入力のみ受け付け,正しく入力されるまでそれ以外は再入力させたい。あとdo-while文をつかっている箇所をwhile文に直したいです.自力でやったのですが,わかりませんでした. どのようにしたらよいか教えてください. お願いします. include <stdio.h> #define BUFFERSIZE 11 #define MAX_PERSON 10 #define MAX_CHARS 10 int main(void) { char name[10][BUFFERSIZE]; int c; int count = 0; int i; int j; for (i = 0; i < MAX_PERSON; i++) { printf("氏名入力 : "); j = 0; /* 氏名の1文字目が'0'なら入力を終了 */ if ((c= getchar()) == '0'){ break; } if (c == '\n') { /* 改行のみの入力は再入力 */ do { printf( "再入力\n" ); /*再入力*/ printf("氏名入力 : "); } while ((c = getchar()) == '\n'); } name[i][j++] = c; /*1文字目を格納*/ if (name[i][0] == '0') { break; } while ((c = getchar()) != '\n' && c != EOF) { if (j < BUFFERSIZE - 1) { name[i][j++] = c; } } name[i][j] = '\0'; count++; /* 実際に入力した人数を記録*/ printf("累計 : %d \n", count); } /* 氏名と生年月日を出力したいです */ for (i = 0; i < count; i++) { for (j = 0; j < MAX_CHARS; j++) { if (name[i][j] == '\0'){ break; } putchar(name[i][j]); } putchar('\n'); } return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
構造体の使い方がのみこめていない、という事ですよね? 以下その前提で書きます。蛇足だったらすみません。 まず、データの容れ物です。 char name[10][BUFFERSIZE]; この部分を、構造体を使って、 struct { char name[BUFFERSIZE]; char birth_y[4+1]; /* 生年月日の年(4桁) */ char birth_m[2+1]; /* 生年月日の月(2桁) */ } person[10]; のようにします。 年、月については getchar()を使って1文字ごとにエラー検出するのならchar[]かな、 と思ってこうしましたが、 入力のやり方によっては、int型にした方が扱いやすいかも知れません。 上ではstruct{}からいきなり変数を宣言しましたが、通常は、 typedef struct { ~ } PERSON; のようにして型定義した後、 PERSON person[10]; のようにして使うのが一般的です。 typedefを使った書き方なら、struct {~}に対して (上の例の場合)PERSONという名前がついているので、 PERSON person2[10]; のようにして、同じ構造の別の変数も作れます。 次に、現在ソース中で、nameを使っていた部分を全て、 構造体を使った形になおします。 例えば name[i][j++] = c; の箇所なら、 person[i].name[j++] = c; になります。 生年月日の入力、出力処理は完全に追加になりますね。 文字制限があるだけで、名前の入力処理と同じですから、 getchar()だけでここまで書いたのなら、やれば出来ると思います。 1~4桁目は'0'~'9'、5桁目は'/'のみ、6桁目は'0'か'1'、 7桁目は、(6桁目が'0'なら'1'~'9'、6桁目が'1'なら'0'~'2')ですね。 ところで、もしgetchar()へのこだわりがあるのでなければ、 fgets(),sscanf()等を使った方が楽かと思います。 do-whileは・・・機械的に書きかえると、 while(c=='\n'){ ~ c=getchar(); } のようになります。 ただし、元々の処理がやりたい事と合っていないような気もします。 自下げなしのまま読んだだけなので、読み違えてる可能性も かなり高いですが・・・。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★最初にソースは全く見ていません。 ・前回『入力された2つの整数の差を絶対値を出力するプログラム』のアドバイスを元に main 関数や 入力部、生年月日のチェック部、表示部の3つ分けてプログラミングして下さい。 ・関数にした方が良い場合はサブ関数を作ります。→多分、今回もサブ関数にした方が良いでしょう。 (1)入力部『MyBirthInput』関数などを作成 (2)生年月日のチェック部『MyBirthCheck』関数などを作成 (3)表示部『MyBirthPrint』関数などを作成 最後に: ・Immaturity さんは『記号定数』を上手に使ってプログラミングしているので、その後に入力桁数の 変更が簡単になります。→これは良いことですね。 ・以上。おわり。→こちらの問題はアドバイス程度ですので、頑張って下さい。