質問するログイン新規登録

回答編集履歴

2

誤字訂正

2021/05/14 01:13

投稿

hoshi-takanori
hoshi-takanori

スコア7903

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  printf("正しい日付を入力してください\n");
42
42
  printf("記念日日付を入力してください");
43
43
  scanf("%d",&day);
44
- }else if(day>eachmonth[month-1]){
44
+ }else if(day>eachmonth[month-1]){ // 上の条件を満たさなかった場合、この条件もチェックされる。
45
45
  printf("正しい日付を入力してください\n");
46
46
  printf("記念日日付を入力してください");
47
47
  scanf("%d",&day);

1

追記

2021/05/14 01:13

投稿

hoshi-takanori
hoshi-takanori

スコア7903

answer CHANGED
@@ -25,4 +25,45 @@
25
25
 
26
26
  > ex3.c:37:9: error: 'break' statement not in loop or switch statement
27
27
 
28
- break は、for や while などのループや、switch の中でしか使えません。if の中に break がありますが、if から break することはできません。(ループや switch の中に if があるなら、if の中に break を書けますが、その場合 if から break するのではなく、その外側にあるループなどから break することになります。)
28
+ break は、for や while などのループや、switch の中でしか使えません。if の中に break がありますが、if から break することはできません。(ループや switch の中に if があるなら、if の中に break を書けますが、その場合 if から break するのではなく、その外側にあるループなどから break することになります。)
29
+
30
+ ---
31
+
32
+ 閏年の 2/29 の日付入力がうまくいかない件ですが、最初の if では 29 日は通りますが、最初の if の条件を満たさないので次の else if の条件もチェックされて、ここで引っかかってしまいます。
33
+ `else if (b != 0 && day > eachmonth[month - 1]) {` のように、else if でも b をチェックする必要があります。
34
+
35
+ ```c
36
+ printf("記念日日付を入力してください");
37
+ scanf("%d",&day);
38
+ while(1){
39
+ int b=fx(year);
40
+ if(b==0 && day>lyeachmonth[month-1]){ //ありもしない日を打たれた時にエラーを出す
41
+ printf("正しい日付を入力してください\n");
42
+ printf("記念日日付を入力してください");
43
+ scanf("%d",&day);
44
+ }else if(day>eachmonth[month-1]){
45
+ printf("正しい日付を入力してください\n");
46
+ printf("記念日日付を入力してください");
47
+ scanf("%d",&day);
48
+ }else{
49
+ break;
50
+ }
51
+ }
52
+ ```
53
+
54
+ 個人的には同じ scanf やエラーメッセージを何度も書きたくないので、次のように書くのが好みです。
55
+
56
+ ```c
57
+ while (1) {
58
+ printf("記念日日付を入力してください");
59
+ scanf("%d", &day);
60
+ int b = fx(year);
61
+ if ((b == 0 && day <= lyeachmonth[month - 1]) ||
62
+ (b != 0 && day <= eachmonth[month - 1])) {
63
+ break; // 正しい日を入力されたので、ループを抜ける。
64
+ }
65
+ printf("正しい日付を入力してください\n");
66
+ }
67
+ ```
68
+
69
+ ちなみに、西暦1年1月1日からの日数ですが、[ユリウス暦からグレゴリオ暦への切り替え](http://smartnova.net/blog/gregorian-shift/) (国によって違う) とかあるので、微妙かもしれません。