ページ 11

万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 03:05
by キンハム
C言語で万年カレンダーを作りました。が、なぜか閏年の時に日にちがずれて表示されてしまいます。
どこを修正し、どうすれば正しく表示されるのか教えてください

コード:

#include <stdio.h>
#include <stdlib.h>
int main( )
{
	int year, month, num, leap, a, b, c, d, e, f, g, i, j, x;
	j = 1;
	x = 1;
	
	printf("年=") ; scanf("%d",&y) ;
	printf("月=") ; scanf("%d",&m) ;

	if (month == 1 || month == 3 || month == 5 || month == 7 ||  month == 8 || month == 10 || month == 12) {
		num = 31;
	} else if (month == 4 || month == 6 || month == 9 || month == 11 ) {
		num = 30;
	} else if (month == 2) {

		if (year % 4 == 0 && (year % 100 != 0 || year % 400 ==0)) {
			leap = 28;
		} else {
			leap = 29;
		}

		num = leap;
	}
 
	if ( month == 1 || month == 2) {
		month+=12;
	}
 
	b = year % 100;
	a = (year - b)/100;
	c = 26 * (month + 1) / 10;
	d = b / 4;
	e = a / 4;
	f = (1 + c + b + d + e - 2 * a) % 7;
	g = (f + 6) % 7;
	if(month == 13){
		g--;
	}

	if(month > 12){
		month = month - 12;
	}

	printf("%d 年 %d 月", year, month);
	printf("\n");
	printf("月  火  水  木  金  土  日\n");
	for (i = 0; i < g - 1; i++) {
		printf("    ");
		x++;
	}
	if (g == 0){
		for (i = 0; i < 6; i++) {
			printf("    ");
		}
	}
	for (i = 0; i < num; i++) {
		if (j < 10) {
			printf(" ");
		}

		printf("%d  ", j);
		if(g == 0 && j == 1){
			printf("\n");
			x = 0;
		}

		if (x == 7) {
			printf("\n");
			x = 0;
		}
		j++;
		x++;
	}
	printf("\n");

	return 0;
}

Re: 万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 05:32
by かずま
キンハム さんが書きました:C言語で万年カレンダーを作りました。が、なぜか閏年の時に日にちがずれて表示されてしまいます。
そのソースではコンパイルできないので、閏年の時であろうがなかろうが表示できません。
キンハム さんが書きました:どこを修正し、どうすれば正しく表示されるのか教えてください
最小限の修正
  9行目: y を year に
 10行目: m を month に
 19行目: 28 を 29 に
 21行目: 29 を 28 に
 38行目: == を >= に

全部修正したら、

コード:

#include <stdio.h>

int main(void)
{
    static int z[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    static int t[] = { 3, 6, 5, 1, 3, 6, 1, 4, 0, 2, 5, 0 };
    int year, y, m, d, w, n;
    
    printf("年=");
    if (scanf("%d", &year) != 1) return 1;
    printf("月=");
    if (scanf("%d", &m) != 1 || m < 1 || m > 12) return 1;
    y = year;
    n = z[m-1]; 
    if (m == 2 && y%4 == 0 && (y%100 != 0 || y%400 == 0)) n++;
    if (m < 3) y--;
    w = (y + y/4 - y/100 - y/400 + t[m-1]) % 7;
    printf("%d 年 %d 月\n月  火  水  木  金  土  日\n%*s", year, m, w*4, "");
    for (d = 1; d <= n; d++) printf("%2d%s", d, ++w % 7 ? "  " : "\n");
    printf("\n");
    return 0;
}

Re: 万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 05:45
by かずま
かずま さんが書きました:全部修正したら、
6行目を static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; に、
17行目の - y/400 を + y/400 に訂正します。
まだ、バグがあるかもしれません。

Re: 万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 09:14
by キンハム
すいません、回答有難うございます。
かずまさんのやつでもやはりうまくいきませんでした。

Re: 万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 10:04
by かずま
元のプログラムに、さらに次の修正が必要だと思います。

28行目: month+=12; の後に year--; を追加
39行目: g--; を削除
43行目: month = month - 12; の後に year++; を追加

Re: 万年カレンダーで閏年の時に正しく表示されない

Posted: 2015年3月13日(金) 13:46
by かずま
これが最後の修正です。

37行目を g = (c + b + d + e + 5 * a) % 7; にする。

すなわち、36行目の f = (1 + c + b + d + e - 2 * a) % 7; は不要。
a が大きいと (1 + c + b + d + e - 2 * a) が負になるのでおかしくなります。