c语言实现万年历
万年历打印是学习c语言路上的一次小小试炼,这也是经典练习例程
本文实现的万年历包含的内容和功能:
1. 判断日期输入是否正确
2. 判断某天是星期几(基姆拉尔森计算公式)
3. 判断某天是一年的第几天
4. 如果只输入年份,显示整年历
5. 如果输入年和月,显示月历
6. 如果输入年月日,显示当月月历并显示是一年的第几天
代码注释比较完整,本人c语言小白,以下直接上代码
主函数main.c
#include <stdio.h>
#include <stdbool.h>
bool Jugdate(int year, int month, int day);
void dismonth(int year, int month);
int Jugweek(int year, int month, int day);
int Jugsday(int year, int month, int day);
int main()
{
int year,month,day,sday;
year=month=day=0;
printf("请输入日期( 格式 : 2008/8/8 ):");
scanf("%d/%d/%d",&year,&month,&day);
while(getchar()!='\n');
if(month == 0){
if(year<1)printf("error!\n");
else
for(int i = 1; i < 13; i++){
dismonth(year,i);
puts("");
}
}
else if(day == 0){
if(year<1 || month<1 || month>12) printf("error!\n");
else dismonth(year,month);
}
else{
if(Jugdate(year,month,day)){
sday = Jugsday(year,month,day);
printf("\n公元%6d年%3d月%3d日是一年的第 %-4d 天\n\n",year,month,day,sday);
dismonth(year,month);
}
else printf("error!\n");
}
return 0;
}
日期判断函数
bool Jugdate(int year, int month, int day)
{
if(year<1 || month<1 || month>12 || day < 1){
return false;
}
else {
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
if(month == 2 && day>29) {
return false;
}
}
else if(month == 2 && day>28) {
return false;
}
switch(month)
{
case 4:case 6:case 9:case 11:
if(day>30){
return false;
}
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(day>31){
return false;
}
}
}
return true;
}
显示整月月历函数
void dismonth(int year, int month)
{
int enter;
int monD[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int monL[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int *mon;
enter = Jugweek(year,month,1);
char head[2][40] = {"* * * * * * * * * * * * *",
" Sun Mon Tues Wed Thur Fri Sat"};
puts(head[0]);
printf("%15d 年 %d 月\n",year,month);
puts(head[0]);
puts(head[1]);
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
mon = monL;
}
else {
mon = monD;
}
printf("%*s",enter*5,"");
for(int i = 1; i <= mon[month-1]; i++){
printf("%5d",i);
enter++;
if(enter>6){
puts("");
enter = 0;
}
}
puts("");
puts(head[0]);
return;
}
星期判断函数
int Jugweek(int year, int month, int day)
{
int weekday;
if(1==month || 2==month) {
month+=12;
year--;
}
weekday = (day+1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
return weekday;
}
判断某天是一年的第几天
int Jugsday(int year, int month, int day)
{
int sday,leap=0;
int sumday[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
if(year%4 == 0 && year%100 != 0 || year%400 == 0)
leap = 1;
if(month<3)
sday = sumday[month-1] + day;
else
sday = sumday[month-1] + day + leap;
return sday;
}
运行效果展示
测试时,我添加了一个死循环,使其一直运行方便测试,一年的年历就是将
每个月都打印,内容过多就不一一展示了,根据示例,可以看出万年历的基本
功能已经实现了
请输入日期( 格式 : 2008/8/8 ):2008/13/32
error!
请输入日期( 格式 : 2008/8/8 ):2022/2/29
error!
请输入日期( 格式 : 2008/8/8 ):2022/8
* * * * * * * * * * * * *
2022 年 8 月
* * * * * * * * * * * * *
Sun Mon Tues Wed Thur Fri Sat
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
* * * * * * * * * * * * *
请输入日期( 格式 : 2008/8/8 ):1949/10/1
公元 1949年 10月 1日是一年的第 274 天
* * * * * * * * * * * * *
1949 年 10 月
* * * * * * * * * * * * *
Sun Mon Tues Wed Thur Fri Sat
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
* * * * * * * * * * * * *