c语言输出一个月的日历

        输出一个月的日历,我们只需要知道这个月的第一天是星期几,然后输出这个月的1号好最后一天,最后一天要判断是31,30天,如果是2月还要通过是否是闰年判断是28还是29天。但是实际上最重要的是要算出这个月的一号是星期几,不然就无法找到输出的点。

我们可以通过这个公式计算出一个日期是星期几,其中YEAR表示年份,DAYS表示这个日期是这一年的第几天。如果要计算2014-2-12是星期几,那么YEAR就是2014,DAYS就是43,计算出TEMP后,再用7对TEMP求余数,求出的值就是星期几,值的范围是[0-6],分别表示星期天,星期一,星期二,到星期六。

TEMP = [YEAR  - 1]  +  [(YEAR - 1) / 4]  -  [(YEAR - 1) / 100] + [(YEAR - 1) / 400] + DAYS 
WEEKDAY = TEMP % 7
然后就可以同过一下代码输出一个月的日历:

#include <stdio.h>
#include <string.h>

bool isLeapYear(int);
int getWeekDay(int, int, int);

int main(int argc, char const *argv[])
{
	int year;
	int month;

	printf("输入日期(yyyy-mm):");
	scanf("%d-%d-%d", &year, &month);//输入年和月

	printf("     %d年%d月\n", year, month);//输出日历日历标题
	printf("日 一 二 三 四 五 六\n");//输出星期

	//本函数获取某个日期是星期几,这里获取每月的1号是星期几,返回是是[0-7]对应(星期天-星期六)
	int week = getWeekDay(year, month, 1);

	int i;
	for (i = 0; i < week; i++)//每月第一周前几天用空格填充
		printf("   ");

	int endDayOfMonth;//每个月的最后一天
	if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		endDayOfMonth = 31;
	else if (month == 2)
	{
		if (isLeapYear(year))
			endDayOfMonth = 29;
		else 
			endDayOfMonth = 28;
	}
	else 
		endDayOfMonth = 30;

	int dayOfMonth = 1;
	//从一号循环到本月末
	while (dayOfMonth <= endDayOfMonth)
	{
		printf("%2d ", dayOfMonth);
		dayOfMonth++;
		//每输出完星期六的日期后就换行(对应周数起点是从week开始的,所以要在天数上加上week)
		if ((dayOfMonth + week- 1) % 7 == 0)
			printf("\n");
	}
	printf("\n");
	return 0;
}

//判断闰年
bool isLeapYear(int y) 
{
	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
		return true;
	return false;
}

//获取某天是星期几返回值(0-7)
int getWeekDay(int y, int m, int d)
{
	//计算星期几的固定公式,Y是年D是这个日期在本年的天数
	//W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D 
	int days = d;
	int i;
	for (i = 1; i < m; i++) 
	{
		if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
			days += 31;
		else if (i == 2)
		{
			if (isLeapYear(y)) 
				days += 29;
			else 
				days += 28;
		}
		else 
			days += 30; 
	}

	int temp = y - 1 + (int)((y - 1) / 4) - (int)((y - 1) / 100) + (int)((y - 1) / 400) + days;
	return temp % 7;
} 

输出效果如下:

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值