自 创 日 历 (在代码里有注释讲细节)

//预处理
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//构造一个二维数组,存放闰平年的月的天数。
int days_in_month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}
		,{0,31,29,31,30,31,30,31,31,30,31,30,31} };
//13是为了第month列刚好对应第几列(数组行和列从0数起)
//判断年份是否为闰年,闰年返回1(真,二维数组第0行),平年返回0(假,二维数组第1行)
int judge_run(int year)
{
	return  ( year % 400 == 0 ) || (year % 100 != 0 && year % 4 == 0);
}
//判断某一天是星期几。(星期日返回7)
int judge_weekday(int year, int month, int day)
{
	int year1 = 1;  //公元1月1号是星期一。
	int jiange_year = year - year1, jiange_days = 0;
	int i;
	for (i = 0; i < jiange_year; i++)
	{
		if (judge_run(i + year1))
			jiange_days += 366;
		else
			jiange_days += 365;
	}
	for (i = 1; i < month; i++) 
	{
		jiange_days += days_in_month[judge_run(year)][i];
	}
	jiange_days += day - 1;//例如第一个月的第二天与第一天隔着一天
	return  year1 + jiange_days % 7;
}
//打印日历
void show(int year, int month)
{
	printf("  | 一  | 二  | 三  | 四  | 五  | 六  | 日  | \n");
	printf("----------------------------------------------\n");
	int n = judge_weekday(year, month, 1);
	int i;
//定位到星期几开始打印日期。
	for (i = 1; i < n; i++)
	{
		printf("      ");
	}
	printf("    ");
//在二维数组中拿到这个月有多少天然后打印
	for (i = 1; i <= days_in_month[judge_run(year)][month]; i++)
	{
		printf("%2d    ", i);
		if (judge_weekday(year, month, i) == 7)//到了星期日打印完后换行
			printf("\n\n    ");
	}
	printf("\n----------------------------------------------\n");
}
int main()
{
	int year = 0, month = 0;
	printf("请输入你要查询的年月份:>");
	scanf("%d%d",&year,&month);
	show(year, month);
	return 0;
}

        做日历主要是要确定好第一天是星期几,然后算间隔多少天,算出具体这一天是星期几,然后把我们想打印的打印出来,把每个月的第一天定位到该在的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s:103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值