求改c语言程序,判断日期是否合法并计算星期,大部分日期都对,但肯定有日期不对,麻烦高人指点

#include <stdio.h>
main()
{ int y,m,d,b,c,f,g;
scanf("%d %d %d",&y,&m,&d);
if((m>12)||(m<0))
printf("month is error.\n");
else if(((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))&&(d>31||d<=0))
printf("day is error.\n");
else if(((m==4)||(m==6)||(m==9)||(m==11))&&(d>30||d<=0))
printf("day is error.\n");
else if(((y%4==0&&y%100!=0||y%400==0))&&(m==2)&&(d>29||d<=0))
printf("day is error.\n");
else if((d>28||d<=0)&&(m==2))
printf("day is error.\n");
else
{c=(y-1901)/4;
b=c*366+(y-1901-c)*365;
if (y%4==0 && y%100!=0 || y%400==0)
switch (m)
{ case 1:f=d;break;
case 2:f=d+31;break;
case 3:f=d+31+29;break;
case 4:f=d+31+29+31;break;
case 5:f=d+31+29+31+30;break;
case 6:f=d+31+29+31+30+31;break;
case 7:f=d+31+29+31+30+31+30;break;
case 8:f=d+31+29+31+30+31+30+31;break;
case 9:f=d+31+29+31+30+31+30+31+31;break;
case 10:f=d+31+29+31+30+31+30+31+31+30;break;
case 11:f=d+31+29+31+30+31+30+31+31+30+31;break;
case 12:f=d+31+29+31+30+31+30+31+31+30+31+30;break;
}
else switch (m)
{ case 1:f=d;break;
case 2:f=d+31;break;
case 3:f=d+31+28;break;
case 4:f=d+31+28+31;break;
case 5:f=d+31+28+31+30;break;
case 6:f=d+31+28+31+30+31;break;
case 7:f=d+31+28+31+30+31+30;break;
case 8:f=d+31+28+31+30+31+30+31;break;
case 9:f=d+31+28+31+30+31+30+31+31;break;
case 10:f=d+31+28+31+30+31+30+31+31+30;break;
case 11:f=d+31+28+31+30+31+30+31+31+30+31;break;
case 12:f=d+31+28+31+30+31+30+31+31+30+31+30;break;
}
g=(b+f+1)%7;
printf("%d\n",g);}
}

恰好我的一个项目上使用RTC,要根据年月日计算星期,在调用这个函数之前,已经对年月日做了限定,判断输入参数是否合法的代码比较简单,就不贴了.
/**
* 简介:已知年月日计算星期
*
* 描述: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
* @param y:年,比如2013年
* @param m:月,该数大于等于3,一月份该数为13,二月份该数为14
* @param d:日
* @return返回星期,=0:星期一 ;=6:星期天
*/
static uint8_t GetWeekDay(uint16_t y,uint8_t m,uint8_t d)
{
uint8_t tem8;
if((m==1)||(m==2))
{
m+=12;
y=y-1;
}
tem8=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return(tem8+1);
}追问

怎么既能判断月份错误又判断日期错误

追答

你对输入的年月日做一下判断,比如先根据输入的年份判断这否瑞年,这样就能判断一年有多少天,每一月是多少天,然后看输入的月份是否合法,输入的日期是否合法.

温馨提示:答案为网友推荐,仅供参考
相似回答