C语言_日期_周计算

日期计算

计算指定日期是周几

#include <stdio.h>
#include <stdlib.h>

int Day(int y, int m, int d);

int main(int argc, char *argv[])
{
    int year, month, day; //读取用户输入的年月日
    int days;             //储存从1900-1-1到该天的天数
    int week = 0;         //储存求余后的星期
        //字符串组合输出星期
    char b[] = {"星期"};
    char c[7][4] = {"日", "一", "二", "三", "四", "五", "六"};

loop:
    printf("请输入年 月 日:(空格分隔)\n");
    scanf("%d%d%d", &year, &month, &day);
    days = Day(year, month, day);
    //增强程序的健壮性
    if (days == -1)
    {
        printf("输入格式有误,");
        fflush(stdin); //防止用户输入字母等其他非数字字符
        goto loop;
    }
    else
    {
        week = days % 7; //用求余计算星期几
        printf("%d年%d月%d日是%s%s\n", year, month, day, b, c[week]);
    }
    system("pause");
    return 0;
}

//函数功能:输入年月日,输出1900-1-1到该天的天数,-1位输入不合法
int Day(int y, int m, int d)
{
    int i;
    int r = 0;                                              //储存1900到该天的闰年个数
    int a[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30}; //m给出每月的天数

    if (y >= 1900 && m > 0 && m < 13 && d > 0 && d < 32)
    {
        for (i = 1900; i <= y; i++) //计算闰年的个数
        {
            if (i % 400 == 0 || i % 100 != 0 && i % 4 == 0)
                r++;
        }
        for (i = 0; i < m - 1; i++) //统计当年1月1日到当月的天数
        {
            d += a[i];
        }
        if ((y % 400 == 0 || y % 100 != 0 && y % 4 == 0) && m < 3) //如果当年是闰年但不到二月就不能算进去
            r--;
        return 365 * (y - 1900) + r + d;
    }
    else
        return -1;
}

参考百度知道

输出日历数组

#include <stdio.h>

#define IS_LEAP_YEAR(y) ((((y) % 4 == 0) && ((y) % 100 != 0)) || ((y) % 400 == 0))

//if( ((0 == year%4)&&(0 != year%100)) ||(0 == year %400) )
//2018
int Leap_year[] = {
	31, 29, 31,
	30, 31, 30,
	31, 31, 30,
	31, 30, 31};
int No_Leap_year[] = {
	31, 28, 31,
	30, 31, 30,
	31, 31, 30,
	31, 30, 31};

int PrintfDate(int year, int i16DayOffset, FILE* fp)
{
	//int i16DayOffset = 0;
	int i16Month = 0;
	int i16Week = 0;
	int i16DayCnt = 0;
	int i16DisplayDay = 0;
	int i16RunOneTime = 1;
	int i16NA = 0;

	if (year == 2018)
	{
		i16DayOffset = 1;
	}

	i16DayCnt = i16DayOffset;

	//月  周  日历
	fprintf(fp, "Date%d[53][9]={\n", year);

	if (IS_LEAP_YEAR(year))
	{
		//printf("Leap_year\n");
		for (i16Month = 0; i16Month <= 11; i16Month++)
		{
			for (i16DisplayDay = 1; i16DisplayDay <= No_Leap_year[i16Month]; i16DisplayDay++)
			{
				if ((i16RunOneTime) && (0 != i16DayOffset))
				{
					i16Week = 1;
					fprintf(fp, "%4d,", i16Month + 1);
					fprintf(fp, "%4d,", i16Week);
					i16RunOneTime = 0;
				}

				while (i16DayOffset)
				{
					//printf("    ");
					fprintf(fp, "%4d,", i16NA);
					//printf("%4s,",' ');
					i16DayOffset = i16DayOffset - 1;
				}

				if (i16DayCnt % 7 == 0)
				{
					i16Week++;
					fprintf(fp, "\n");
					fprintf(fp, "%4d,", i16Month + 1);
					fprintf(fp, "%4d,", i16Week);
				}
				else
				{
				}
				//printf("%4d",i16DayCnt);
				fprintf(fp, "%4d,", i16DisplayDay);
				i16DayCnt++;
			}
		}
	}
	else
	{
		//printf("No_Leap_year\n");
		for (i16Month = 0; i16Month <= 11; i16Month++)
		{
			for (i16DisplayDay = 1; i16DisplayDay <= No_Leap_year[i16Month]; i16DisplayDay++)
			{
				if ((i16RunOneTime) && (0 != i16DayOffset))
				{
					i16Week = 1;
					fprintf(fp, "%4d,", i16Month + 1);
					fprintf(fp, "%4d,", i16Week);
					i16RunOneTime = 0;
				}

				while (i16DayOffset)
				{
					//printf("    ");
					//printf("%4s,",' ');
					fprintf(fp, "%4d,", i16NA);
					i16DayOffset = i16DayOffset - 1;
				}

				if (i16DayCnt % 7 == 0)
				{
					i16Week++;
					fprintf(fp, "\n");
					fprintf(fp, "%4d,", i16Month + 1);
					fprintf(fp, "%4d,", i16Week);
				}
				else
				{
				}
				//printf("%4d",i16DayCnt);
				fprintf(fp, "%4d,", i16DisplayDay);
				i16DayCnt++;
			}
		}
	}
	fprintf(fp, "\n");
	fprintf(fp, "};\n");

	i16DayOffset = i16DayCnt % 7;

	//printf("\n");
	//printf("DayOffset  %4d",i16DayOffset);
	//printf("\n");
	
	return i16DayOffset;
}

int main()
{
	FILE *fp = NULL;
	fp = fopen("./date.c", "wb");
	if (NULL == fp)
	{
		printf("Failed to create 'data.c'\n");
		return -1;
	}
	
	int i16DayOffset = 0;

	i16DayOffset = PrintfDate(2018, 1, fp); //init  Offset
	for (int year = 2019; year < 2050; year++)
	{
		i16DayOffset = PrintfDate(year, i16DayOffset, fp);
	}
	
	fclose(fp);
	fp = NULL;
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值