【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出计算的结果
【样例输入】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循环。