C语言做万年历,求高手来解释

5.万年历
功能要求:
(1)模仿现实生活中的挂历
(2)当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)
(3)当系统日期变到下一月时,系统自动翻页到下一月
(4)能够查询任意一天是星期几
已经做出原函数了,能够运行(都是在网上差的)但老师让解释写报告,以下在这呢

#include<stdio.h>
#include<time.h>
int leap (int year)//判断闰年
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else return 0;
}
int days_month (int month,int year)//判断月
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 31;
if(month==4||month==6||month==9||month==11)
return 30;
if(month==2&&leap(year)==1) return 29;
else return 28;
}
int firstday(int month,int year)//判断年
{
int w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
return w;
}
void DayOfWeek()
{
int rtnDay;
int y,m,d;
int ch;
printf("请输入年月日(xxxx,xx,xx): ");
scanf("%d,%d,%d", &y, &m, &d);
fflush(stdin);
rtnDay = (3*y-(7*(y+(m+9)/12))/4+(23*m)/9+d+17-((y+(m<3?-1:0))/100+1)*3/4) % 7;
printf("%04d年%02d月%02d日 是 星期%d\n", y, m, d, rtnDay?rtnDay:7);
}
main()
{
//调用系统时间
time_t tval;
struct tm *now;
tval = time(NULL);
now = localtime(&tval);
printf("现在时间: %4d年 %d月 %02d日\n", now->tm_year+1900, now->tm_mon+1, now->tm_mday);
//调用结束
int i,j=1,k=1,a,b,month,year;
char ch;
b=days_month(now->tm_mon+1,now->tm_year+1900);
a=firstday (now->tm_mon+1,now->tm_year+1900);
printf(" Sun Mon Tue Wed Thu Fri Sat \n");
if(a==7)
{
for(i=1;i<=b;i++)
{
printf("%4d",i);
if(i%7==0)
{
printf("\n");
}
}
}
if(a!=7)
{
while (j<=4*a)
{
printf(" ");
j++;
}
for(i=1;i<=b;i++)
{
printf("%4d",i);
if(i==7*k-a)
{
printf("\n");
k++;
}
}
}
printf("\n");
printf("You can enter 'y' to search anyday you want ,or you can exit");
ch=getchar();
switch(ch)
{
case 'y':
DayOfWeek();
printf("继续查询(y/n)");
ch=getchar();
while(ch='y'&&ch!='n')
{
DayOfWeek();
printf("继续查询(y/n)");
ch=getchar();
}
break;
}
}
解释一下int firstday的函数功能

第1个回答  2012-06-30
int firstday(int month,int year)//判断年
{
int w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
return w;
}

这个函数不是判断年的,而是判断year和month组成的时间第一天是星期几的。
例如如果是2012年7月,那么返回的就是7月1日是星期几,用于显示这个月份日期的时候,是否前端加空格。由于7月1日是星期日,返回值是7,所以,不用加空格
如果返回值为1,那么显示本月日期的时候,先加四个空格
如果返回值为2,那么显示本月日历的时候,先加8个空格。本回答被网友采纳
第2个回答  2012-07-02
那个就是判断第一天是星期几的,,,我没分了,望采纳吧本回答被提问者采纳
第3个回答  2012-06-30
这个函数是判断每个月开始的第一天是星期几~追问

我知道,详细说明下为什么啊

追答

额~这是一条公式来的啊...我不知道怎么给你详细说明~~(我还没那么高的水平啊~)

追问

那我怎么写报告啊,就写上网查的第一天星期几的运算方法?

追答

你就说,根据基姆拉尔森计算公式得到的~我相信老师不会问你这条公式的由来吧

第4个回答  2012-07-02
路过
相似回答