请用循环语句进行程序设计(也可能用到if或switch语句),实现从键盘上输入一个日期,日期格式为:2018-7-9,判断这一天是这一年中的第几天。 注:本题涉及到闰年、平年的判断,已知符合下列条件之一者是润年: (1)能被4整除,但不能被100整除; (2)能被400整除。 输入提示信息:"Please Input the Date:\n" 输入格式:"%d-%d-%d" 输出格式:"Result=%d\n" 如果输入月份不在1到12月份之间输出错误提示信息"Input error!\n" 如果输入的日期不符合规定,输出:"Input error!\n" 输入输出用例1: Please Input the Date: 2010-10-2 Result=275 输入输出用例2: Please Input the Date: 2000-4-5 Result=96 输入输出用例3: Please Input the date: 2017-17-2 Input error!
解答如下:
//判断是否是闰年:
//输入某年,返回0则不是闰年,1则是闰年
int judge_leap_year(int year)
{
if (year % 4 == 0 && year % 100 != 0)//能被4整除,但不能被100整除;
{
return 1;
}
if (year % 400 == 0)//能被400整除
{
return 1;
}
return 0;
}
//判断是一年中的第几天:
int which_day(int year, int month, int day)
{
if (month > 12 || month < 1)
{
printf("Input error!\n");
return 0;
}
else //符合月份规定
{
int A = judge_leap_year(year);
switch (month) //这里很多case是对于大月中日的合法性判断
{
case 1:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 2:
if (A == 1)//是闰年
{
if (day > 29 || day < 1)
{
printf("Input error!\n");
return -1;
}
}
else
{
if (day > 28 || day < 1)
{
printf("Input error!\n");
return -1;
}
}
break;
case 3:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 5:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 7:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 8:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 10:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
case 12:
if (day > 31 || day < 1)
{
printf("Input error!\n");
return -1;
}
break;
default://其余小的月份
if (day > 30 || day < 1)
{
printf("Input error!\n");
return -1;
}
}
switch (month)
{
case 1:
return day;
case 2:
return 31 + day;
case 3:
return 31 + 28 + day+A;
case 4:
return 31 + 28 + 31 + day+A;
case 5:
return 31 + 28 + 31 + 30 + day + A;
case 6:
return 31 + 28 + 31 + 30 + 31 + day + A;
case 7:
return 31 + 28 + 31 + 30 + 31 + 30 + day + A;
case 8:
return 31 + 28 + 31 + 30 + 31 + 30 + 31 + day + A;
case 9:
return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day + A;
case 10:
return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day + A;
case 11:
return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day + A;
case 12:
return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day + A;
}
}
}
int main()
{
//读取和保存数据
int year, month, day;
printf("Please Input the Date:\n");
scanf("%d-%d-%d",&year,&month,&day);
//调用函数判断:
int A = judge_leap_year(year);
int B = which_day(year, month, day);
//合法之后在进行下一步
if (B != 0&&B!=-1)
{
printf("Result=%d\n", B);
}
return 0;
}
原题目没有考虑日期的合法性,这里用了switch-case对其进行合法性判断的补充,更加全面.对于代码的注释写的都很详细,希望大家喜欢.