本年(2024年)もあとわずかとなった。
今回は、西暦年と月を読み込んで、その月のカレンダーを表示するプログラムをご紹介しよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、Visual Studio Code(1.95.3)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//カレンダー表示
#include <stdio.h>
//各月の日数
int mday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31};
//year年month月day日の曜日を求める
int dayofweek(int year,int month,int day)
{
if (month == 1 || month == 2) {
year--;
month += 12;
}
return (year + year/4 - year/100 + year/400 + (13*month+8)/5 + day) % 7;
}
//year年はうるう年か
int is_leap(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 4 == 0;
}
//year年month月の日数
int monthdays(int year,int month)
{
if (month-- != 2)
return mday[month];
return mday[month] + is_leap(year);
}
//y年m月のカレンダーを表示
void put_calendar(int y,int m)
{
int i;
int wd = dayofweek(y,m,1);
int mdays = monthdays(y,m);
printf(" 日 月 火 水 木 金 土\n");
printf(" ーーーーーーーーーー\n");
printf("%*s",3*wd,"");
for ( i = 1; i <= mdays; i++)
{
printf("%3d",i);
if(++wd % 7 == 0)
putchar('\n');
}
if (wd % 7 != 0)
putchar('\n');
}
int main(void)
{
int y,m;
printf("カレンダーを表示します\n");
printf("年:"); scanf("%d",&y);
printf("月:"); scanf("%d",&m);
putchar('\n');
put_calendar(y,m);
return 0;
}
実行結果
カレンダーを表示します
年:2024
月:12
日 月 火 水 木 金 土
ーーーーーーーーーーー
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
カレンダーを表示します
年:2024
月:2
日 月 火 水 木 金 土
ーーーーーーーーーー
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29
カレンダー表示に欠かせない処理の一つが、「曜日」を求めることである。
関数dayofweekは、前回で作成したプログラムから流用している。
year年がうるう年であるかどうかを調べるのが、関数is_leapである。
うるう年であれば、1を、平年であれば0を返す。
関数monthdaysは、year年month月の日数を返す。2月は平年が28日、うるう年は29日である。
(参考)新・明解C言語 中級編 柴田 望洋(著)SBクリエイティブ
コメント