C言語のきほん「カレンダー」

スポンサーリンク
コンピューター C言語

本年(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クリエイティブ

コメント

タイトルとURLをコピーしました