对日期的操作,输出某月日历;

在C语言开始的学习中总会遇到这样那样的问题,而问题最多的当属对日期的操作了。
对日期的操作首先要做就是判断是闰年还是平年;
用函数表示;

int IsLeapYear(int y)//判断是否是闰年
{
	return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}

下来是对月的判断,主要是判断二月,在不同的年份有多少天;

int GetNMonthDays(int y, int m)//计算某月的最后一天是今年的第几天;
{
	int ret = 0;
	int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	DOM[1] += IsLeapYear(y) ? 1 : 0;//根据是否是闰年判断二月有多少天;
	for (int i = 0; i < m; ++i)
	{
		ret += DOM[i];
	}
	return ret;
}

以上操作是计算本月过完,今年过了多少天;
因为是输出某月的日历,所以在此写一个函数判断,本月有多少天;

int GetNMonthDay(int y, int m)//判断此月有多少天;
{
	int ret = 0;
	int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	DOM[1] += IsLeapYear(y) ? 1 : 0;
	ret = DOM[m - 1];
	return ret;
}

然后进行对输入的年月是否正确的判断,毕竟有的时候,有可能手不小心就按错了,输入一个不正确的日期;

int IsLegalDate(int y, int m)//判断输入日期是否合法;
{
	int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int ret = 1;
	if (y <1918 || y > 2099 ||
		m < 1 || m > 12)//此处的对年的判断是我根据自己电脑上日历最早的一天设置的;
	{
		return 0;
	}
	return ret;
}

因为此操作是输出日历,所以不用对天数进行判断;
最后判断1918年到输入的年,只计算整年,过了多少天;

int Year(int y)
{
	int  t, Y = 0;
	for (int i = 1918; i < y; i++)
	{
		t = IsLeapYear(i) ? 1 : 0;
		Y += YD[t];
	}
	return Y;
}

再此声明,要在头文件下,定义一个全局变量(int YD[2]={365,366})
下面就是主函数了;

int main()
{
	int y, m, i ,t=0;
	int sum = 0;
	printf("请输入第日期:");
	scanf("%d%d", &y, &m);
	while (!IsLegalDate(y, m))
	{
		printf("输入日期不合法,请重新输入:");
		fflush(stdin);
		scanf("%d%d", &y, &m);
	}
	sum += GetNMonthDays(y, m - 1);
	sum += Year(y);//计算1918年1月1日距今多少天;
	printf(" 一 二 三 四 五 六 日\n");
	i = sum % 7;//计算相对参考日期今天是周几
	if (i != 6)//如果i=6证明这周第一天是周一,不需要给前面加空格
	{
		for (int j = 0; j < i + 1; j++)//因为我的日历是以1918年一月为参考,1918第一天是周二所以i+1;
		{
			printf("   ");//输出三个空格(一个汉字字符占两个空格,在加两个汉字中间的空格)
		}
	}
	for (int j = 1; j <= GetNMonthDay(y, m); j++)
	{
		printf("%3d", j);
		if ((i + j + 1) % 7 == 0)//计算换行;
		{
			printf("\n");
		}
	}
	printf("\n");
	return 0;
}

最后,如果程序有什么瑕疵,希望大家可以留言,让我改近;
谢谢你的阅读;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值