【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出计算的结果
【样例输入】2015 2 1
【样例输出】32
沈航C语言选择结构作业题。
思路:分为两部分:已经过去的月份+本月份天数。例如,2015年2月1日,便是一月的31天加上2月的1天,共32天。2024年10月25日(本文发布日),为1~9月每月天数和加上本月25天,共299天。
要点:
1.switch() 语句:先计算switch()括号内表达式的值,根据结果跳转到对应的case。
switch()括号内的值可以有变量,case值只能是常值或常值表达式。
如果表达式的值与任一case均不匹配,但存在default,则跳转到default。
跳转到相应case(或default)并执行完对应语句后,不会跳出switch结构,而是会继续向下执行,忽略其他的case,直至遇见 break;跳出switch结构 或余下全部语句执行完毕为止。
2.闰年判断条件:A.年份year可以被400整除 year%400==0
B.年份year可以被4整除,但不能被100整除。year%4==0&&year%100!=0
二者满足其一,即为闰年,否则为平年。(year%4==0&&year%100!=0||year%400==0)值为1闰年,值为0平年。(注:C语言中,&&表示“逻辑与”,||表示“逻辑或”,!表示“逻辑非”)
3.C语言中唯一的三目运算符:条件运算符。
(表达式1)?(表达式2):(表达式3)
其含义为:若表达式1为真,则该式结果为表达式2,否则结果为表达式3.
因此,(year%4==0&&year%100!=0||year%400==0)?语句A:语句B;
等价于:
if(year%4==0&&year%100!=0||year%400==0){
A语句;
}else{
B语句;
}
a=(year%4==0&&year%100!=0||year%400==0)?b:c;
等价于:
if(year%4==0&&year%100!=0||year%400==0){
a=b;
}else{
a=c;
}
有了上面的知识,我们可以写出这样的代码:
方法1:只用switch()
#include <stdio.h>
int main(){
int year,month,day,sum=0;
scanf("%d %d %d",&year,&month,&day);
switch(month-1){ /*已经过去的月份,不算本月份,所以要-1*/
case 11:sum+=30;
case 10:sum+=31;
case 9:sum+=30;
case 8:sum+=31;
case 7:sum+=31;
case 6:sum+=30;
case 5:sum+=31;
case 4:sum+=30;
case 3:sum+=31;
case 2:(year%4==0&&year%100!=0||year%400==0)?sum+=29:sum+=28;/*闰年的2月29天,平年的2月28天*/
case 1:sum+=31;
}
/*因为没有break,在跳到相应的case后会一直递加到1月,符合我们的要求*/
sum+=day;
/*把本月的天数加进来*/
printf("%d",sum);
return 0;
}
//SAU revali3664
//仅供参考 无限进步
方法2:用switch()和for循环。
如果觉得上面的代码太繁琐,可以用for循环使之精炼。
#include <stdio.h>
int main(){
int y,m,d,i,sum=0;
scanf("%d%d%d",&y,&m,&d);
for(i=1;i<=m;i++)
switch(i-1){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:sum+=31;break;
case 2:sum+=y%400==0||y%100!=0&&y%4==0?29:28;break;
case 4:
case 6:
case 9:
case 11:sum+=30;
}
sum+=d;
printf("%d",sum);
return 0;
}
//SAU revali3664
//仅供参考 无限进步
通过空的case,可以让switch()内表达式值的多种情况指向同一句代码。
for内每次循环累加1个月份的天数。
注意:请加上break; 使得累加完该月天数后 避免执行后面的case,进行下一轮for循环。