西暦・月からカレンダーを表示
問題文
西暦・月を入力してカレンダーを表示するプログラムを作成せよ。
プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。
(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
どなたかご教授お願いできないでしょうか・・・。
お礼
早速のご回答ありがとうございます。 どこで曜日を修正したのか、やっとわかりました。 1900.1.1(日)、1900.1.2(火)と表示されました。 あぁこれで胸のつかえが一つとれました。 あとは明治33年ごろの友人をさがして当時のカレンダーを見せてもらいたいと願っております。
補足
まことにハヤトチリで失礼しました。 曜日の表示1.1(日)1.2(火)はとんでもない大間違いです。 取り消しが出来ないのでこの欄をお借りしてお詫びします。 ご容赦賜りますようお願い申し上げます。