C语言编写某年某月的日历,详细讲解

文章介绍了一个编程挑战,即编写程序来确定每月的第一天是星期几。程序使用自定义函数处理闰年计算和月份天数,并详细解释了解决方案,包括计算两个时间点之间天数差的方法。代码示例展示了如何输出日历,特别是如何找出当月1号对应的星期数。
摘要由CSDN通过智能技术生成

话不多说,直接上结果图

说明 :       

        程序不难,唯一一个难点就是怎么算每月是星期几,其余的代码比较多但不费脑筋(当然了作者脑壳笨第一次写的时候也花了不少时间,哈哈),特别适合学到函数这一章节,因为需要用到许多自定义的函数。让我们来看看详细的解题过程吧。

1.这是需要用到的自定义函数,后面都有注释说明,眼尖的好朋友肯定会看到1970和4,这就是我们要搞懂怎么算星期几的关键,当然也可以自己选一个早一点的时间点。方法下面会讲到先从最基本的切入。

2.我们的主函数,输出都在自定义函数里面去完成。

3.开始输出相当于给我们程序装修的代码

 

 4.开始最重要的输出我们下面日期的代码(不好截屏直接上代码段),每一步基本上都注释了。

和最重要的是我们怎么求当月1号所占星期几。

就是 (两个时间点的天数之差+ 所设时间点的星期数) % 7 取余数 

//2
//打印日历内容 
void number(int year, int mouth)
{
	 //1970年1月1日是星期四
	//num1为接收每个闰年多出来的一天,num2为接收输入的当前月份1号之前的所有天数
	//num为当前月份天数
	int n = 1970, num1 = 0, num2 = 0, num = 0;
	int sum1 = 0, sum2 = 0;
	int i=0, j=0;
	//run函数 是否是闰年,是的话返回非0值
	for (n; n < year; n++)
	{
		if (run(n))
		{
			num1++;
		}
	}
	

	//用来计算输入的当年月份1号之前的所有天数
	for (i = 1; i < mouth; i++)
	{
		num2 += day(year, i);
	}
	
	//上面run函数用过了n现在得,归为原值
	n = N;
	//得到当月1号星期数
	sum1 = ( (year -n) * 365 + num1 + num2 + D) % 7;



	//输出每个日期空格
	for (i = 0; i < sum1 && sum1 != 7; i++)
	{
		space();
	}

	//当前月份天数
	num = day(year, mouth);
	
	j += sum1;
	//j为统计7的倍数换行
	//最后循环输出
	for (i = 1; i <= num; i++)
	{
		printf("%4d", i);
		j++;
		if (j% 7 == 0)
		{
			printf("\n");
		}
	}
	printf("\n");

}

 5.这是上层函数所需要引用的函数

 

最后放上我们的原代码

如有不妥之处还请指出,谢谢。

希望对你有帮助。

温馨提醒因为采用了布尔类型,布尔类型是c99开始的,所以用VC++6.0编译器的话会报错.

#include <stdio.h>
#include <stdbool.h>
#define N 1970 //自己可以选个先前时间点
#define D 4 //1970年1月1号是星期四
 
 
void yearmouth(int year, int mouth); //打印相应年份和月份下划线以及下面的中文星期
void year1(int i, int j);	//打印年份月份
void underline();	//打印下划线
void week();	//打印中文星期
void number(int year, int mouth);//打印日历内容 
bool run(int year);//判断闰年
int day(int year, int mouth);//当前月份1号之前的所有天数
void space();	//空格
//
 
int main()
{
	int year, mouth;
	printf("请输入年份:");
	scanf("%d", &year);
	printf("请输入月份:");
	scanf("%d",&mouth);
	yearmouth(year,mouth);
	number(year, mouth);
	return 0;
}
 
 
//1
//打印相应年份和月份的日历 
void yearmouth(int year, int mouth)
{
	year1(year, mouth);
	underline();
	week();
}
 
//1.1
	//打印年份月份
void year1(int year, int mouth)
{
	printf("\t%d  年  %d  月\n", year, mouth);
}
 
//1.2
	//打印下划线
void underline()
{
	int i;
	for (i = 0; i < 16; i++)
	{
		printf("- ");
	}
	printf("\n");
}
 
//1.3
	//打印中文星期
void week()
{
	
	printf("  日");
	
	printf("  一");
 
	printf("  二");
 
	printf("  三");
	
	printf("  四");
 
	printf("  五");
	
	printf("  六\n");
 
}
 
//2
//打印日历内容 
void number(int year, int mouth)
{
	 //1970年1月1日是星期四
	//num1为接收每个闰年多出来的一天,num2为接收输入的当前月份1号之前的所有天数
	//num为当前月份天数
	int n = 1970, num1 = 0, num2 = 0, num = 0;
	int sum1 = 0, sum2 = 0;
	int i=0, j=0;
	//run函数 是否是闰年,是的话返回非0值
	for (n; n < year; n++)
	{
		if (run(n))
		{
			num1++;
		}
	}
	
 
	//用来计算输入的当年月份1号之前的所有天数
	for (i = 1; i < mouth; i++)
	{
		num2 += day(year, i);
	}
	
	//上面run函数用过了n现在得,归为原值
	n = N;
	//得到当月1号星期数
	sum1 = ( (year -n) * 365 + num1 + num2 + D) % 7;
 
 
 
	//输出每个日期空格
	for (i = 0; i < sum1 && sum1 != 7; i++)
	{
		space();
	}
 
	//当前月份天数
	num = day(year, mouth);
	
	j += sum1;
	//j为统计7的倍数换行
	//最后循环输出
	for (i = 1; i <= num; i++)
	{
		printf("%4d", i);
		j++;
		if (j% 7 == 0)
		{
			printf("\n");
		}
	}
	printf("\n");
 
}
//2.1
//判断是否为闰年
bool run(int year)
{
 
	return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
 
}
 
//2.2
//当前月份1号之前的所有天数
int day(int year ,int mouth)
{
	int d;
	//如果输入年份中月份大于2月需要查询输入年份是否为闰年
	if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10)
		return 31;
	else if (mouth == 4 || mouth == 6 || mouth == 11 || mouth == 9)
		return 30;
	else if (mouth==2)
	{
		d = 28;
		if (run(year))
		{
			return ++d;
		}
		else
			return d; 
	}
	
}
 
//2.3
//空格
void space()
{
	printf("    ");
}

以下是C语言代码实现,可以打印任意年份的日历,每行三个月份: ```c #include <stdio.h> // 判断是否为闰年 int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } // 计算某年某月的天数 int getDaysOfMonth(int year, int month) { int days[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 打印某年某月日历 void printCalendar(int year, int month) { // 计算该月第一天是星期几 int firstDayOfWeek = 1; // 假设公元1年1月1日是星期1 for (int i = 1; i < year; i++) { firstDayOfWeek = (firstDayOfWeek + 365 + isLeapYear(i)) % 7; } for (int i = 1; i < month; i++) { firstDayOfWeek = (firstDayOfWeek + getDaysOfMonth(year, i)) % 7; } // 打印日历表头 printf("%d年%d月\n", year, month); printf("日 一 二 三 四 五 六\n"); // 打印该月日历 int daysOfMonth = getDaysOfMonth(year, month); for (int i = 0; i < firstDayOfWeek; i++) { printf(" "); } for (int i = 1; i <= daysOfMonth; i++) { printf("%2d ", i); if ((firstDayOfWeek + i) % 7 == 0) { printf("\n"); } } printf("\n"); } int main() { int year; printf("请输入年份:"); scanf("%d", &year); for (int i = 1; i <= 12; i++) { printCalendar(year, i); if (i % 3 == 0) { printf("\n"); } } return 0; } ``` 代码中,`isLeapYear`函数用于判断某年是否为闰年,`getDaysOfMonth`函数用于计算某年某月的天数,`printCalendar`函数用于打印某年某月日历。在`main`函数中,循环打印该年的所有月份,并每三个月份打印一个空行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值