输出今天是星期几并计算n天后的日期(万年历)

#类似一个万年历
今天的上机作业如下:
计复杂的日期计算器。要求根据用户输入一个日期,实现如下功能:
(1)判断日期是否有效;
(2)输出n天后的日期;(n为用户输入,可正可负);
(3)输出当天是星期几。 先来说一下思路:
从公元一年算起,算出总天数s,一月一日为星期一,后给mod7,注意余0时是星期天。
注意判断闰年。
给s加(减)n后再次从公元元年起算,输出最终日期。
代码如下:

#include <stdio.h>
int main({
	int y, m, d, i = 0, n;
	scanf_s("%d%d%d%d", &y, &m, &d, &n);
	if (y < 0 || m < 0 || d < 0)
		printf("F\n");
	else if (y % 1 == 0 && m % 1 == 0 && d % 1 == 0)
	{
		if (m == 2)
		{
			if ((y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) && d < 30)
			{
				printf("T\n");
				i = 1;
			}
			else if (d < 29)
			{
				printf("T\n");
				i = 1;
			}
			else
				printf("F\n");
		}
		else if (m == 4 || m == 6 || m == 9 || m == 11)
		{
			if (d < 31)
			{
				printf("T\n");
				i = 1;
			}
			else printf("F\n");
		}
		else
		{
			if (d > 31)
				printf("F\n");
			else
			{
				printf("T\n");
				i = 1;
			}
		}
	}
	if (i)
	{
		int y1, m1, d1,s1;
		int x[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		long i, s = 0;
		for (i = 1; i < y; i++)
		{
			if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) s += 366;
			else s += 365;//整年份的天数
		}    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)x[2] = 29;
    for (i = 1; i < m; i++)
    {
        s += x[i];//整月的天数
    }
    s += d;//日的天数
    s1 = s % 7;
    if (s1 == 0)
        s1 = 7;
    printf("星期%ld\n", s1);
    s = s + n;
    for (i = 1; s > 365; )
    {
        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
        {
            s -= 366;
        }
        else { s -= 365; }//整年份的天数
        i = i + 1;
        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
        {
            if (s <= 366)
                break;
        }
        else
        {
            if (s <= 365)
                break;
        }
    }
​
    y1 = i;
    if (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0)x[2] = 29;
    if (s <= 31)
    {
        m1 = 1;
        d1 = s;
        printf("%d %d %d", y1, m1, d1);
        return 0;}
    for (i = 1; ; )
    {
        s -= x[i];//整月的天数
        i = i + 1;
        if (i == 4 || i == 6 || i == 9 || i == 11)
        {
            if (s <= 30)
                break;
        }
         else if (i == 2)
        {
            if(s <= x[2])
            break;
        }
        else
        {
            if (s <= 30)
                break;
        }
    }    m1 = i;
    d1 = s;
    printf("%d %d %d", y1, m1, d1);return 0;
}
}

初学,代码比较复杂,繁琐。
记录上机作业,仅供参考。
*敬请谅解。 *


版权声明:本文为TheGodOfCloud原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。