*^-^* 每日一题: 今天是一年中的第几天? *^-^*
1. Question & Analysis
Question: 输入某年某月某日,判断这一天是一年中的第几天?
Analysis: 难点在于二月,是28天还是29天,需要判断是否为闰年;其他
多体会一下 学习一下数组的使用方法
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
bool isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
// 计算天数的方法 1
int calcMonthsDay(int m) {
assert(m > 0 && m < 13);
int days = 0;
// 利用 switch 不跳出的特性进行计算,不推荐使用,但是要明白原理
switch (m) {
case 12: days += 30;
case 11: days += 31;
case 10: days += 30;
case 9: days += 31;
case 8: days += 31;
case 7: days += 30;
case 6: days += 31;
case 5: days += 30;
case 4: days += 31;
case 3: days += 28;
case 2: days += 31;
default: break;
}
return days;
}
// // 计算天数的方法 2
// int calcMonthsDay(int m) {
// assert(m > 0 && m < 13);
// int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
// int totalDays = 0;
// for (int i = 0; i < m - 1; ++i) {
// totalDays += days[i];
// }
// return totalDays;
// }
// 计算天数的方法 3
// int calcMonthsDay(int m) {
// assert(m > 0 && m < 13);
// int days[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
// return days[m - 1];
// }
int main() {
int year, month, day;
printf("请输入您要查询的年月日 >:");
scanf("%d %d %d", &year, &month, &day);
assert(month > 0 && month < 13);
assert(day > 0 && day < 32);
int totalDays = calcMonthsDay(month) + day;
if (isLeapYear(year) && month > 2) {
++totalDays;
}
printf("%d 年 %d 月 %d 日是该年中的第 %d 天\n", year, month, day, totalDays);
return 0;
}
可以参考的点:
bool
类型的使用assert
断言,判断数值是否合法。这只是判断的一种方式,不合法直接中止程序。也可以让用户重新输入。主要是心里要有数,这里是需要判断的break
的 case
也不是不能用,但要标注清楚,让别人一眼就能注意到,不会出现理解错误。C++ 中就添加了 [[ fallthrough ]]
属性来明确这一点总之,写代码时多注意细节,多思考有没有更简洁的表达方式
加油~多尝试跳出舒适区,然后语言的学习可以更系统化一些
做练习应该有针对性,比如要学数组,那就练习一下数组的题目,指针掌握得不好,那就再多练练
之前已经做过并且掌握了要点的练习,遇到类似的就可以不用再做了,花费时间的性价比不高