1. Question & Analysis
- Question: 输入某年某月某日,判断这一天是一年中的第几天?
- Analysis: 难点在于二月,是28天还是29天,需要判断是否为闰年;其他的就是各月份相加;闰年:能被4整除&&不能被100整除 || 能被400整除;
2. Code Modules
代码其实没啥说的,判断定义判断闰年的函数,然后就是每个月天数的累加(可以自己加,也可以for循环累加),比如今天2022.6.15,那么需要算出前五个月天数的和加15即可,如果是闰年再加1就行。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include <stdio.h>
char isLeapYear(int y) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
return 'R';
}
else {
return 'P';
}
}
int calcMonthsDay(int m) {
int i = 0;
int days = 0;
int sum = 0;
for (i = 0; i < m; i++) {
switch (i) {
case 0: days = 0; break;
case 1: days = 31; break;
case 2: days = 28; break;
case 3: days = 31; break;
case 4: days = 30; break;
case 5: days = 31; break;
case 6: days = 30; break;
case 7: days = 31; break;
case 8: days = 31; break;
case 9: days = 30; break;
case 10: days = 31; break;
case 11: days = 30; break;
case 12: days = 31; break;
default: break;
}
sum += days;
}
return sum;
}
int main() {
int year, month, day;
int total = 0;
printf("请输入您要查询的年月日>:");
scanf("%d %d %d", &year, &month, &day);
char ret = isLeapYear(year);
if (ret == 'R') {
total = calcMonthsDay(month) + day + 1;
}
else {
total = calcMonthsDay(month) + day;
}
printf("%d 年 %d 月 %d 日是该年中的第 %d 天\n", year, month, day, total);
return 0;
}
上面的calcMonthsDay()函数也可以用if--else if --else来实现
int calcMonthsDay(int m) {
if (m == 1) {
return 0;
}
else if (m == 2) {
return 31;
}
else if (m == 3) {
return 59;
}
else if (m == 4) {
return 90;
}
else if (m == 5) {
return 120;
}
else if (m == 6) {
return 151;
}
else if (m == 7) {
return 181;
}
else if (m == 8) {
return 212;
}
else if (m == 9) {
return 243;
}
else if (m == 10) {
return 273;
}
else if (m == 11) {
return 304;
}
else {
return 334;
}
}
3. Summary
本题要注意的一点就是,用"switch--case"时,case后面的break不要遗忘了,因为"switch--case"我称之为滑梯语句,而case相当于一个滑梯的入口,从上往下找入口,一旦进入,那就是一滑到底(除非被break强行抱出),直接执行到default后面的语句为止。这一点是跟"if -- else"语句最大的区别。如果判断的断点比较多,而且彼此之间没多大关联,那么在两者之间可以优先考虑switch语句。 ---<来自小白的总结>