C判断输入的年月日是这一年的第几天
这道题我们主要是练就思路问题,然后是解题方法。比如我们看到题目,接下来就应该想到一些特殊情况:一年中的月份有大月和小月,而且还有最特殊的是二月,在闰年是28天,平年是29天,然后继续想,就会知道我们接下来要做的就是想到判断闰年的条件,然后把月份以某种形式表达出来,比如用switch,或者数组,然后就可以开始写代码了。
#define YEAR_ERROR -1 //告诉人们这是年份输入错误,不然返回-1也不知道哪里错了,使其更具有可读性
#define MONTH_ERROR -2
#define DAY_ERROR -3
bool is_Leapyear(int year)
{
return (year % 100 != 0 && year % 4 == 0 || year % 400 == 0);
}
int Get_YM_days(int year, int month)
{
int days[13] = { 28,31,29,31,30,31,30,31,31,30,31,30,31 };
if (is_Leapyear(year) && month == 2)
{
month = 0;
}
return days[month];
}
int Get_YMD_days(int year, int month, int day)
{
int sum = 0;
if (year < 1)return YEAR_ERROR;
if (month < 1 || month>13) return MONTH_ERROR;
if(day<1||day>Get_YM_days(year,month)) return DAY_ERROR;
for (int i = 1; i <= month; ++i)
{
sum += Get_YM_days(year, i);
}
return sum + day;
}
int main()
{
int year,month,day;
int sum = 0;
char ch = '\0';
do
{
printf("please input year month day\n");
scanf_s("%d %d %d", &year, &month, &day);
sum = Get_YMD_days(year, month, day);
switch (sum)
{
case YEAR_ERROR:
printf("year input error \n");
break;
case MONTH_ERROR:
printf("month input error \n");
break;
case DAY_ERROR:
printf("day input error \n");
break;
default:
printf("%d year %d month %d day => total: %d\n", year, month, day, sum);
break;
}
printf("是否继续(y/n)\n");
getchar(); //接收缓冲区的\n
ch = getchar();
} while (ch == 'y' || ch == 'Y');
return 0;
}
运行结果如下:
这个代码还多加了一个循环,告诉用户,输入之后如果还想继续运行程序,就输入y或者Y,否则按其他键直接退出;
在上述代码中,我们就以判断闰年为例,解读一下文章前面所说的练就思路问题;
我们一说判断闰年,正常人都会想到用条件语句,很正常,比如:
int is_Leapyear(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
}
然后我们可以再想一下,怎么可以少一个else语句,就想到了我们的初始化:
int is_Leapyear(int year)
{
int n=0;
if(year%4==0&&year%100!=0||year%400==0)
{
n=1;
}
return n;
}
然后我们又想到返回值是1后者0,我们可以直接用bool类型,所以就有:
bool is_Leapyear(int year)
{
return (year % 100 != 0 && year % 4 == 0 || year % 400 == 0);
}
代码就是这样一步一步完善的,再比如下面的Get_YM_days()函数,我们上面用了数组,这样方便,前面也可以用switch,比如:
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day=31;
breakl
case 4: case 6: case 9 : case 11:
day=30;
break;
dafault :
if (Is_Leapyear(year))
{
day = 29;
}
else
{
day = 28;
}
}
很显然,这个就没有以下标方式表明简洁,所以我们每次写完代码后,完全可以自己再多看几遍,找一些简单的方法或者可读性更好的代码进行表示。