C语言实验(十二):函数(输入年份输出日历、闰年判断、元旦星期几)
一、判断闰年和某年元旦星期几的函数1. 编写一个函数,输入年份,判断是否为闰年;2. 编写一个函数,输入年份,判断当年元旦所对应的星期数;二、输入日期(年、月、日),输出他是该年的第几天、星期几。三、打印年历,要求输入年份(1900以后),输出每个月的月历构成年历。即每天对应的星期。一、判断闰年和某年元旦星期几的函数
1. 编写一个函数,输入年份,判断是否为闰年;
1、闰年:年份是4的倍数,但不是100的倍数的年份;以及年份是400的倍数的年份。2、有闰年的定义,用代码实现即可。用取模运算判断是否是x的倍数。
2. 编写一个函数,输入年份,判断当年元旦所对应的星期数;
1、求出从1900年开始的闰年及平年数量。依此计算出共多少天,然后根据一周七日,用天数对7做取模运算。2、结合1990年元旦为星期一,可推断出要求年份元旦是星期几。
二、输入日期(年、月、日),输出他是该年的第几天、星期几。
1、根据年份判断是否是闰年;根据月份和日期可以计算是该年第几天。
2、将该年第几天和与1900年间隔年份天数相加得到至1900年元旦的天数,对7做取模运算可推断得这一日期是星期几。
实验代码
#include <stdio.h>#include <stdlib.h>int main(){int y,m,d;printf("请输入日期(示例:2000.3.9)\n");scanf("%d.%d.%d",&y,&m,&d);Xingqi(y,m,d);Dijitian(y,m,d);return 0;}int Runnian(int year)//判断year年是否是闰年{if (year%4 == 0 && year%100!=0 || year%400==0)return 1;elsereturn 0;}int Xingqi(int year,int month,int day)//判断year年month月day日是星期几{int i,s=0,n,a[13];for(i=1990;i<year;i++){if(Runnian(i))n = 366;elsen = 365;s+=n; //结果为与1900年间隔的年总天数}if(Runnian(year))a[2] = 29;elsea[2] = 28;for(i=1;i<=12;i++)if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)a[i]=31;else if(i==4||i==6||i==9||i==11)a[i]=30;for(i=1;i<month;i++)s+=a[i]; //加上这年过去的月份共多少天s+=day;//加上这是本月第几天switch(s%7){case 0:printf("星期日");break;case 1:printf("星期一");break;case 2:printf("星期二");break;case 3:printf("星期三");break;case 4:printf("星期四");break;case 5:printf("星期五");break;case 6:printf("星期六");break;}return 0;}int Dijitian(int year,int month,int day) //判断year年month月day日是这年第几天{int i,s=0,n,a[13];if(Runnian(year))a[2] = 29;elsea[2] = 28;for(i=1;i<=12;i++)if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)a[i]=31;else if(i==4||i==6||i==9||i==11)a[i]=30;for(i=1;i<month;i++)s+=a[i];//这年过去的月份共多少天s+=day;//加上这是本月第几天printf("今年的第%d天\n",s);}
运行结果
三、打印年历,要求输入年份(1900以后),输出每个月的月历构成年历。即每天对应的星期。
1、要打印年历,需要输入年份。年历的输出,需要用到两个循环:每个月一个循环及每周一个循环。
2、首先需要知道该年元旦是星期几(调用函数2),将之前的位置都空出来。然后每周一个循环,去填充月历。在此之前,应该判断该年是否是闰年(调用函数1),依此判断2月份的天数。
3、将步骤2填充月历的过程循环12次即可,输出年历。根据控制台输出结果,适当调整代码,可以使年历清晰展示。
实验代码
#include <stdio.h>#include <stdlib.h>int Xingqi_yuandan(int year);int main(){int m,i,l,d,t,year;printf("请输入某年年份:");scanf("%d",&year);t = Xingqi_yuandan(year);printf("%d年\n",year);for (m=1;m<=12;m++){printf("%2d 月 \n",m);printf("-------------------------------------------------\n");printf(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");printf("-------------------------------------------------\n");for(i=0;i<t;i++)//把元旦之前星期X空出来printf(" ");if(m==2) //判断二月多少天{if(Runnian(year))l = 29;elsel = 28;}else if(m==4||m==6||m==9||m==11)l = 30;elsel = 31;for(d=1;d<=l;d++){printf("%2d",d);t++;if(t==7) //周日换行{t = 0;printf("\n\n");}}printf("\n\n\n");//与下一月之间隔开}return 0;}int Runnian(int year) //判断year年是不是闰年{if (year%4 == 0 && year%100!=0 || year%400==0)return 1;elsereturn 0;}int Xingqi_yuandan(int year)//判断year年元旦是星期几{int m,n;m = (year-1900)/4-(year-1900)/100+(year-1900)/400;n = ((year-1900)*365 + m)%7+1;return n;}
运行结果