西暦と月(ともに整数型)を入力し、その月の日数を出力する。ただし、以下の場 合にはエラー表示する。

西暦と月(ともに整数型)を入力し、その月の日数を出力する。ただし、以下の場 合にはエラー表示する。 ・ 西暦が0以下のとき ・ 月が1以上12以下でない場合 なお、西暦が以下のいずれかのときはうるう年である。 ・ 4の倍数で、かつ100の倍数でない ・ 400の倍数 論理和、論理積を用いること これを実行するためのプログラムを教えてください

補足

まだprintf関数とscanf関数、if文くらいしか習ってないので、そこらへんでできるプログラムでお願いします

ベストアンサー

1

たぶんC言語ですよね? 私はC言語を使ったことがなくて,割り算の「余り」を算出するC言語の計算式を知らないので,ベーシック風に,しかも文章スタイルで書きます。 意味は十分に通じると思うから,あとはご自分でC言語に直してください。 なお,紀元前が入ると面倒なので,西暦はプラスの整数とします。 というか,グレゴリオ歴は1582年に作られたので,1582年以前には当てはまらないけど…。 西暦をy,月をm,うるう年かどうかをu(平年=0,閏年=1)としたら,プログラムの流れは次の通りになります。 ① if (y<0)or(m<0)or(m>12) then printf("エラーです");goto end ② if (西暦y年が400で割り切れる,つまり,y/400の商が0)then u=1;goto③ else if(y/100の商が0) then u=0;goto③ else if (y/4の商が0) then u=1;goto③ ③ if (m=1)or(M=3)or(m=5)or(m=7)or(M=8)or(m=10)or(m=12) printf("西暦”,y,"年”,m,"月は31日まであります");goto end ④ if (m=4)or(m=6)or(m=9)or(m=11) printf("西暦”,y,"年”,m,"月は30日まであります");goto end ⑤ if u=1 then printf("西暦”,y,"年は閏年なので2月は29日まであります");goto end else printf("西暦”,y,"年は閏年でないので2月は28日までです");goto end ➅ end : printf("これでどうでしょうか?") ①の部分は西暦と月が正しいかどうかをチェックする部分 ②の部分が西暦y年がうるう年かどうかを判定する部分 ③から⑤がその月の日数を印刷するする部分です。 ➅はオマケ。

1人がナイス!しています

「y/400の商が0」「y/100の商が0」「y/4の商が0」と書いてしまったけど,「y/400の余りが0」(以下同)が正解でした。