回答編集履歴

2

誤字訂正

2021/05/14 01:13

投稿

hoshi-takanori
hoshi-takanori

スコア7901

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  scanf("%d",&day);
86
86
 
87
- }else if(day>eachmonth[month-1]){
87
+ }else if(day>eachmonth[month-1]){ // 上の条件を満たさなかった場合、この条件もチェックされる。
88
88
 
89
89
  printf("正しい日付を入力してください\n");
90
90
 

1

追記

2021/05/14 01:13

投稿

hoshi-takanori
hoshi-takanori

スコア7901

test CHANGED
@@ -53,3 +53,85 @@
53
53
 
54
54
 
55
55
  break は、for や while などのループや、switch の中でしか使えません。if の中に break がありますが、if から break することはできません。(ループや switch の中に if があるなら、if の中に break を書けますが、その場合 if から break するのではなく、その外側にあるループなどから break することになります。)
56
+
57
+
58
+
59
+ ---
60
+
61
+
62
+
63
+ 閏年の 2/29 の日付入力がうまくいかない件ですが、最初の if では 29 日は通りますが、最初の if の条件を満たさないので次の else if の条件もチェックされて、ここで引っかかってしまいます。
64
+
65
+ `else if (b != 0 && day > eachmonth[month - 1]) {` のように、else if でも b をチェックする必要があります。
66
+
67
+
68
+
69
+ ```c
70
+
71
+ printf("記念日日付を入力してください");
72
+
73
+ scanf("%d",&day);
74
+
75
+ while(1){
76
+
77
+ int b=fx(year);
78
+
79
+ if(b==0 && day>lyeachmonth[month-1]){ //ありもしない日を打たれた時にエラーを出す
80
+
81
+ printf("正しい日付を入力してください\n");
82
+
83
+ printf("記念日日付を入力してください");
84
+
85
+ scanf("%d",&day);
86
+
87
+ }else if(day>eachmonth[month-1]){
88
+
89
+ printf("正しい日付を入力してください\n");
90
+
91
+ printf("記念日日付を入力してください");
92
+
93
+ scanf("%d",&day);
94
+
95
+ }else{
96
+
97
+ break;
98
+
99
+ }
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ 個人的には同じ scanf やエラーメッセージを何度も書きたくないので、次のように書くのが好みです。
108
+
109
+
110
+
111
+ ```c
112
+
113
+ while (1) {
114
+
115
+ printf("記念日日付を入力してください");
116
+
117
+ scanf("%d", &day);
118
+
119
+ int b = fx(year);
120
+
121
+ if ((b == 0 && day <= lyeachmonth[month - 1]) ||
122
+
123
+ (b != 0 && day <= eachmonth[month - 1])) {
124
+
125
+ break; // 正しい日を入力されたので、ループを抜ける。
126
+
127
+ }
128
+
129
+ printf("正しい日付を入力してください\n");
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ ちなみに、西暦1年1月1日からの日数ですが、[ユリウス暦からグレゴリオ暦への切り替え](http://smartnova.net/blog/gregorian-shift/) (国によって違う) とかあるので、微妙かもしれません。