题目内容:
给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。
输入格式:
年 月 日
输出格式:
0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?
输入样例:
2013 3 11
输出样例:
1
输入样例:
2013 13 15
输出样例:
month is error.
程序代码:*
#include "stdio.h"
void CaculateWeekDay(int y,int m, int d);
int JudgeDay(int y, int m, int d);
int leap (int y);
int main()
{
int year=0,month=0,day=0;
scanf("%d%d%d",&year,&month,&day);
if(month>12||month<1)
{
printf("month is error.");
if(JudgeDay(year,month,day))
printf("day is error.");
}
else if(JudgeDay(year,month,day))
printf("day is error.");
else
CaculateWeekDay(year,month,day);
return 0;
}
int leap (int y)//判断是否是闰年
{
if(y%100!=0&&(y%4==0||y%400==0))
return 1;
else return 0;
}
void CaculateWeekDay(int y,int m, int d)//计算是星期几
{
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i;
if(m>2&&leap(y))d++;
for(i=1;i<m;i++)
{
d+=mon[i];
}
d=y-1+(y-1)/4-(y-1)/100+(y-1)/400+d;
switch(d%7)
{
case 0: printf("0\n"); break;
case 1: printf("1\n"); break;
case 2: printf("2\n"); break;
case 3: printf("3\n"); break;
case 4: printf("4\n"); break;
case 5: printf("5\n"); break;
case 6: printf("6\n"); break;
}
}
int JudgeDay(int y, int m, int d)//判断输入是否合法
{
if (d <= 0 || d> 31)
return 1;
else if (leap(y))
{
switch (m)
{
case 4:
case 6:
case 9:
case 11: if (d== 31) return 1; break;
case 2: if (d> 29) return 1; break;
default : return 0; break;
}
}
else
{
switch (m)
{
case 4:
case 6:
case 9:
case 11: if (d== 31) return 1; break;
case 2: if (d> 28) return 1; break;
default : return 0; break;
}
}
return 0;
}