

「年、月、日」をそれぞれ入力すると、ツェラーの公式を用いて曜日を出力するプログラムを作成したいのですが、1月と2月の実行結果が以下のようにおかしくなってしまいます。

私は以下のようにプログラムを作成しました

[code]

    #include <stdio.h>
    int main(void)
    {
        int year,m,q,k,j,h;
    
        printf("年: ");
        scanf("%d", &year);
        printf("月: ");
        scanf("%d", &m);
        printf("日: ");
        scanf("%d", &q);
        k=year%100;
        j=year/100;
        h=(q+((m+1)*26)/10+k+k/4+j/4+5*j)%7;
       /* 1582年10月14日以前が入力されたとき */
        if (year < 1582 || year == 1582 && (m < 10 || m == 10 && q <= 14)){
        printf("1582年10月14日以前には対応していません\n");
        }
        else if(h==1){
        printf("%4d年%2d月%2d日は日曜日です \n", year, m, q);
        }
        else if(h==2){
        printf("%4d年%2d月%2d日は月曜日です \n", year, m, q);
        } 
        else if(h==3){
        printf("%4d年%2d月%2d日は火曜日です \n", year, m, q);
        }
        else if(h==4){
        printf("%4d年%2d月%2d日は水曜日です \n", year, m, q);
        }
        else if(h==5){
        printf("%4d年%2d月%2d日は木曜日です \n", year, m, q);
        }
        else if(h==6){
        printf("%4d年%2d月%2d日は金曜日です \n", year, m, q);
        } 
        else if(h==0){
        printf("%4d年%2d月%2d日は土曜日です \n", year, m, q);
        }
        return 0;
    }
    
[/code]

**実行結果**

[code]

    $ ./a.out
    年: 2020
    月: 2
    日: 7
    2020年 2月 7日は水曜日です
    
    $ ./a.out
    年: 2020
    月: 1
    日: 31
    2020年 1月31日は木曜日です
    
    $ ./a.out
    年: 2020
    月: 3
    日: 7
    2020年 3月 7日は土曜日です
    
    $ ./a.out
    年: 2020
    月: 4
    日: 6
    2020年 4月 6日は月曜日です
    
[/code]

このように、3月以降の曜日の出力結果は正しく出力されるのですが、1,2月がなぜか間違った表示になってしまいました。

なぜ、このようになるのでしょうか。  
また、どこを修正すれば正しい表示となるのでしょうか。

よろしくお願いします。


CC BY-SA 4.0
2020-11-29T06:11:55.377
72266
2020-11-29T23:28:29.643
2020-11-29T11:56:48.397
3060
41837
question
c
ツェラーの公式を用いた曜日の判定で、1月と2月のみ期待とは異なる結果になってしまう


Wikipediaの[ツェラーの公式](https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F#:%7E:text=%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F%EF%BC%88%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE,%E7%AE%97%E5%87%BA%E3%81%99%E3%82%8B%E5%85%AC%E5%BC%8F%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)を見ると、

> y 年 m 月 d 日の曜日を求める。
>
> ただし、1月と2月は、前年のそれぞれ13月・14月として扱う。

となっていますが、プログラムの方はそういった処理がされていないためだと思います。


CC BY-SA 4.0
2020-11-29T08:48:57.287
72271
2020-11-29T09:02:34.817
2020-11-29T09:02:34.817
3060
9515
72266
answer


> なぜ、このようになるのでしょうか。

うるう年の１月２月は、＋１してはダメですよね


CC BY-SA 4.0
2020-11-29T23:28:29.643
72279
2020-11-29T23:28:29.643
27481
72266
answer