C语言之日历问题

一、代码展示

cpp 复制代码
#include<stdio.h>
int leapyear(int year)//判断是不是闰年函数
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	else
		return 0;
}
int days(int year, int month, int* day)//判断一个月有几天
{
	if (month != 2)
		return day[month - 1];
	else
		return 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}
int sumdays(int year, int month, int* day) 
{
	int sum=0;
	for (int i = 1900; i < year; i++) {
		if (leapyear(i) == 1)
			sum += 366;
		else
			sum += 365;
	}
	for (int j = 1; j < month; j++) {
		sum += days(year, j, day);//计算一年中到目标月有几天
	}return sum;
}
int print(int month, int year, int* day) {
	int max = days(year, month, day);
	int min = sumdays(year, month, day) % 7;
	printf("       %d月      %d年       \n", month, year);
	printf("  一  二  三  四  五  六  日\n");
	for (int j = min; j > 0; j--) {
		printf("    ");
	}
	for (int i = 1; i <= max; i++) {
		printf("%4d", i);
		if ((i + min) % 7 == 0)
			printf("\n");
	}
}

int main() {
	int year, month;
	int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("Please enter the year and month you want to query:");
	scanf("%d %d", &year, &month);
	if (month > 12 || month < 1)
	{
		printf("Input Error!\n");
	}
	print(month, year, day);
	putchar('\n');
	return 0;
}

二、代码分析

cpp 复制代码
int leapyear(int year)//判断是不是闰年函数
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	else
		return 0;
}

这是一个名为 leapyear 的函数,用来判断给定的年份是否为闰年。根据闰年的规则,如果一个年份能被4整除且不能被100整除,或者能被400整除,那么这个年份就是闰年。该函数返回1表示是闰年,返回0表示不是闰年。

cpp 复制代码
int days(int year, int month, int* day)//判断一个月有几天
{
	if (month != 2)
		return day[month - 1];
	else
		return 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}

days 函数用于确定一个月份有多少天。对于非二月(2月)的月份,天数直接由数组 day 提供,其中 day 数组包含了每个月的天数。对于2月,如果当前年是闰年,那么2月就有29天,否则只有28天。

cpp 复制代码
int sumdays(int year, int month, int* day) 
{
	int sum=0;
	for (int i = 1900; i < year; i++) {
		if (leapyear(i) == 1)
			sum += 366;
		else
			sum += 365;
	}
	for (int j = 1; j < month; j++) {
		sum += days(year, j, day);//计算一年中到目标月有几天
	}return sum;
}

sumdays 函数计算从1900年到给定年份的前一年之间的总天数,再加上给定年份中截止到目标月份的总天数。这样得到的是自1900年以来的累积天数,可以用来确定星期几。

cpp 复制代码
int print(int month, int year, int* day) {
	int max = days(year, month, day);
	int min = sumdays(year, month, day) % 7;
	printf("       %d月      %d年       \n", month, year);
	printf("  一  二  三  四  五  六  日\n");
	for (int j = min; j > 0; j--) {
		printf("    ");
	}
	for (int i = 1; i <= max; i++) {
		printf("%4d", i);
		if ((i + min) % 7 == 0)
			printf("\n");
	}
}

print 函数负责打印出给定月份和年份的日历。首先,它调用 days 和 sumdays 函数来获取这个月有多少天和月初是星期几。然后按照格式打印出日历的头信息,接着通过循环打印出日期,并在每7个数字后换行以形成一周的格式。

cpp 复制代码
int main() {
	int year, month;
	int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("Please enter the year and month you want to query:");
	scanf("%d %d", &year, &month);
	if (month > 12 || month < 1)
	{
		printf("Input Error!\n");
	}
	print(month, year, day);
	putchar('\n');
	return 0;
}

主函数 main 是程序的入口点。它声明了两个整数变量 year 和 month 来存储用户输入的年份和月份。还初始化了一个包含各个月份天数的数组 day。接下来提示用户输入要查询的年份和月份,并检查输入是否有效(即月份是否在1到12之间)。最后调用 print 函数打印日历,并在结束时添加一个新行字符。

三、结果展示

相关推荐
思茂信息21 分钟前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
Persistent的粽子!41 分钟前
双指针算法:最大盛水容器
c++·算法·leetcode
小小龙学IT1 小时前
三菱 PLC MC 协议(SLMP / QnA 兼容 3E 帧)深度解析:从帧结构到 C++/Go 双语言采集实战
c语言·c++·golang
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出游戏速通中的“独特初始能量值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
hold?fish:palm1 小时前
44 二叉搜索树中第K小的元素
开发语言·c++·算法
Chen—LSN2 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
anew___2 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
木由里予2 小时前
GDB 使用手册(详细版)
c语言·vscode
Chen—LSN3 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
程序员yu3 小时前
会编网络:别被入门教程骗了,Python实用能力不在语法本身
开发语言·python·学习·算法