西暦・月からカレンダーを表示
問題文
西暦・月を入力してカレンダーを表示するプログラムを作成せよ。
プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。
(1)変数の宣言: プログラムの中で使う変数や配列等をすべてここに集めておく。
(2)入力: キーボードから、西暦年の値を読み取る ← scanf( ) 関数
1月から12月まで、以下を繰り返す。
(3)カレンダーの年・月の表示: (例えば、2008年1月 と表示)
(4)各曜日名の表示: 「日 月 火 水 木 金 土」と表示
(5)月の日数の算出: 月の最後の日を計算しておく。(*1~12月以外では誤りとすること)
(6)曜日の算出: 月の初めの日(ついたち)の曜日をツェラー公式で計算しておく。
(7)空列の表示: ついたちの前の空白部分を表示する ← for文 を利用。
(8)各日の表示: 月の各日を順に表示していく ← for文を利用
(土曜の後に改行を入れる)
#include <stdio.h>
int leapYear(int year)
{
if (year%400==0||(year%4==0 && year%100!=0))
{
return 1;
}
else
{
return 0;
}
}
int main(void)
{
int d,year,m,i;
int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /*1~12月までの各月の日数*/
printf("西暦を入力してください:");
scanf("%d",&year);
printf("月を入力してください:");
scanf("%d",&m);
if(m!=1 & m!=2 & m!=3 & m!=4 & m!=5 & m!=6 & m!=7 & m!=8 & m!=9 & m!=10 & m!=11 & m!=12)/*1~12月以外で日数を出そうとした場合*/
{
printf("入力が誤っています。やりなおしてください。\n");
}
else{
if (leapYear(year)==1)/*閏年の場合*/
{
printf("%d年は閏年です。\n",year);
day[1] +=1;
}
else/*閏年でない場合*/
{
printf("%d年は閏年ではありません。\n",year);
}
i = (year+year/4 -year/100 +year/400 + ( 13*m+8 )/5 + 1) % 7; /*西暦~年・1~12月の1日の曜日について考える*/
printf("日 月 火 水 木 金 土\n");
(7)・・・
(8)・・・
}
return 0;
}
手順に沿ってやっていく課題なのですが(7)、(8)の部分の表現の仕方が良く分かりません。(求めた月の日数をカレンダー形式に表示する方法・1日の前に空白を入れる等)
過去の質問も見たのですが、いまいち理解できず・・・orz
どなたかご教授お願いできないでしょうか・・・。
お礼
ありがとうございます。 楽しそうですね。 ただ米国やイスラムとかは公式にもあるので… 南アフリカには和解の日や善意の日などあってなるほどと思わせられるなど各国の休日を知るのも興味深いです。 ちなみに今日(2/12)は米国:リンカーン誕生記念日、インド:シヴァ神の祭りだそうです。