C语言实验(十二):函数(输入年份输出日历、闰年判断、元旦星期几)
一、判断闰年和某年元旦星期几的函数
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;
else
return 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;
else
n = 365;
s+=n; //结果为与1900年间隔的年总天数
}
if(Runnian(year))
a[2] = 29;
else
a[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;
else
a[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;
else
l = 28;
}
else if(m==4||m==6||m==9||m==11)
l = 30;
else
l = 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;
else
return 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;
}
运行结果