问题如题;
刚一开始的时候想到的就是用 switch 函数,从一月开始,到十二月;
写完代码,发现计算量不小,需要计算每一种情况下的天数,而且还需要分闰年的情况,break 函数也是写到手疼;
一开始的代码:
<span style="font-size:14px;">#include <stdio.h>
#include <process.h>
int main()
{
int y,m,d,days,flag;
flag=0;
scanf("%d%d%d",&y,&m,&d);
if(y%400==0||y%4==0&&y%100!=0)
flag=1;
if (m<1||m>12)
{
printf("输入月份有错\n");
}
else
{
if (!flag&&m==2&&(d<1||d>28))
{
printf("输入日期有错\n");}
if (flag&&m==2&&(d<1||d>29))
{
printf("输入日期有错\n");}
if ((m==4||m==9||m==11)&&(d<1||d>30))
{
printf("输入日期有错\n");}
if ((m==1||m==3||m==5||m==7||m==8||m==10)&&(d<1||d>31))
{
printf("输入日期有错\n");}
switch(m)
{
case 1:days=0;break;
case 2:days=31;break;
case 3:days=31+28;break;
case 4:days=31+28+31;break;
case 5:days=31+28+31+30;break;
case 6:days=31+28+31+30+31;break;
case 7:days=31+28+31+30+31+30;break;
case 8:days=31+28+31+30+31+30+31;break;
case 9:days=31+28+31+30+31+30+31+31;break;
case 10:days=31+28+31+30+31+30+31+31+30;break;
case 11:days=31+28+31+30+31+30+31+31+30+31;break;
case 12:days=31+28+31+30+31+30+31+31+30+31+30;break;
};
days=days+d;
if (m>2)
days=days+flag;
printf("%d",days);
}
return 0;
}</span>
看起来虽然整齐,但浪费时间;
后来在百度上看到了更好的方法:
#include<stdio.h>
#include<string.h>
int isRunNian(int year)
{
if(year%100==0)
{
if(year%400==0) return 1;
else return 0;
}
else if(year%4==0) return 1;
else return 0;
}
int main()
{
int year, month, day, total;
scanf("%d%d%d",&year,&month,&day);
total = 0;
for(int i = 1; i < month; i++)
{ //step1
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
{
total += 31;
}
else if (i == 4 || i ==6 || i == 9 || i==11)
{
total += 30;
} else if(i == 2){
if(isRunNian(year)){
total += 29;
} else {
total += 28;
}
}
}
total += day; //step2
printf("%d\n", total); //step3
return 0;
}
将每月三十一天的,每月三十天的和二月分开,并在二月时判断闰年;
给出闰年函数;
说明在一定情况下,for 语句和 switch 语句可互换;