根据给定的信息,我们可以分析并总结出以下与“万年历”相关的知识点: ### 一、项目背景 此万年历程序是某学生在大学期间完成的毕业设计作品。作者在闲暇时间自行编写,旨在满足大部分学校的毕业设计要求。由于各学校的具体要求可能有所不同,因此作者建议用户根据实际情况对程序进行适当调整。 ### 二、核心功能概述 从提供的代码片段来看,该万年历主要实现了以下几个核心功能: 1. **日期输入验证**:确保用户输入的日期符合公历规则。 2. **闰年判断**:能够正确判断某一年是否为闰年。 3. **日期计算**:包括计算某个日期是一周中的哪一天等功能。 ### 三、关键代码解析 #### 1. 日期输入验证 ```c void enter(int* en_day) { // 实现了对年、月、日的输入验证 int i = 1, j = 0; while (i) { // 循环获取年份 if (j) printf("年份错误\n"); printf("请输入年份:\n"); scanf("%d", &en_day[0]); if (en_day[0] >= 1949) i = 0; else j = 1; } i = 1; j = 0; while (i) { // 循环获取月份 if (j) printf("\n月份错误"); printf("\n请输入月份:\n"); scanf("%d", &en_day[1]); if (en_day[0] == 1949) if (en_day[1] >= 10 && en_day[1] <= 12) i = 0; else j = 1; else if (en_day[1] >= 1 && en_day[1] <= 12) i = 0; else j = 1; } i = 1; j = 0; while (i) { // 循环获取日 if (j) printf("\n日期错误"); printf("\n请输入日期:\n"); scanf("%d", &en_day[2]); if (((en_day[0] % 4 == 0) && (en_day[0] % 100 != 0)) || (en_day[0] % 400 == 0)) // 判断是否为闰年 if (en_day[1] == 2) { if (en_day[2] >= 1 && en_day[2] <= 29) i = 0; else j = 1; } else { if (en_day[2] >= 1 && en_day[2] <= (mon_day[en_day[1]])) i = 0; else j = 1; } else { if (en_day[2] >= 1 && en_day[2] <= (mon_day[en_day[1]])) i = 0; else j = 1; } } } ``` #### 2. 闰年判断与日期计算 ```c int count(int* en_day) { long sum = 0; int m, y; if (en_day[0] == 1949) { for (m = 10; m < en_day[1]; m++) sum += mon_day[m]; sum += en_day[2]; } else { sum += 92; for (y = 1950; y < en_day[0]; y++) sum += 365; for (m = 1; m < en_day[1]; m++) sum += mon_day[m]; sum += en_day[2]; m = 0; for (y = 1950; y < en_day[0]; y++) if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) m++; // 计算闰年数量 if (en_day[1] > 2) if (((en_day[0] % 4 == 0) && (en_day[0] % 100 != 0)) || (en_day[0] % 400 == 0)) m++; sum += m; } return sum % 7; } ``` 此函数通过累加自1949年10月1日至目标日期之间的天数,并考虑到闰年的影响,来计算出目标日期是星期几。 #### 3. 显示结果 ```c void search() { int enter_day[3]; PRIN; printf("**输入的起始日期为1949年10月1日,当前系统时间为...\n"); PRIN; enter(enter_day); int i = count(enter_day); switch (i) { case 5: printf("%d年%d月%d日\n", enter_day[0], enter_day[1], enter_day[2]); break; case 6: printf("%d年%d月%d日\n", enter_day[0], enter_day[1], enter_day[2]); break; case 0: printf("%d年%d月%d日\n", enter_day[0], enter_day[1], enter_day[2]); break; case 1: printf("%d年%d月%d日\n", enter_day[0], enter_day[1], enter_day[2]); break; case 2: printf("%d年%d月%d日\n", enter_day[0], enter_day[1], enter_day[2]); break; case 3: printf("%d年%d月%d日一\n", enter_day[0], enter_day[1], enter_day[2]); break; default: printf("%d年%d月%d日二\n", enter_day[0], enter_day[1], enter_day[2]); break; } } ``` ### 四、总结 本万年历程序主要通过C语言实现,包含了日期输入验证、闰年判断以及日期计算等核心功能。其中,日期输入验证确保了用户输入的日期符合公历的基本规则;闰年判断则考虑到了每四年一闰的特殊情况;而日期计算功能则能准确地计算出任意公历日期是星期几。整体而言,该程序结构清晰、逻辑严谨,能够较好地满足毕业设计的要求。
#define PRIN printf("\n* * * * * * * * * * * * * * * * * * * * * * * * * * * \n")
int mon_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void enter(int *en_day) //实现日期输入功能,自动判断输入的日期是否有错
{
int i=1,j=0;
while(i) //输入年的循环
{
if(j)
printf("输入年份出错,请重新输入\n");
printf("输入年份\n年份:");
scanf("%d",&en_day[0]);
if(en_day[0]>=1949)
i=0;
else
j=1;
}
i=1;j=0;
while(i) //输入月的循环
{
if(j)
printf("\n输入月份出错,请重新输入");
printf("\n输入月份\n月份:");
scanf("%d",&en_day[1]);
if(en_day[0]==1949)
if(en_day[1]>=10&&en_day[1]<=12)
i=0;
j=1;
else
if(en_day[1]>=1&&en_day[1]<=12)
i=0;
else
j=1;
}
i=1;j=0;
while(i) //输入日的循环
{
if(j)
printf("\n输入日出错,请重新输入");
printf("\n输入日\n日:");
scanf("%d",&en_day[2]);
if(((en_day[0]%4==0)&&(en_day[0]%100!=0))||(en_day[0]%400==0)) //判断这个年份是否是闰年
if(en_day[1]==2)
{
if(en_day[2]>=1&&en_day[2]<=29)
i=0;
else
j=1;
}
else
{
if(en_day[2]>=1&&en_day[2]<=(mon_day[en_day[1]]))
i=0;
else
j=1;
}
剩余11页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助