·

多体会一下 stuck_out_tongue 学习一下数组的使用方法

#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;
}
Replies
5

可以参考的点:

  • bool 类型的使用
  • assert 断言,判断数值是否合法。这只是判断的一种方式,不合法直接中止程序。也可以让用户重新输入。主要是心里要有数,这里是需要判断的
  • 是闰年且月份大于 2 才能加 1
  • 没有 breakcase 也不是不能用,但要标注清楚,让别人一眼就能注意到,不会出现理解错误。C++ 中就添加了 [[ fallthrough ]] 属性来明确这一点

总之,写代码时多注意细节,多思考有没有更简洁的表达方式 stuck_out_tongue_closed_eyes

嗯嗯,回复得很详细,点子很到位,很细心,感谢啦 smile 努力学习中;

加油~多尝试跳出舒适区,然后语言的学习可以更系统化一些 smile

做练习应该有针对性,比如要学数组,那就练习一下数组的题目,指针掌握得不好,那就再多练练

之前已经做过并且掌握了要点的练习,遇到类似的就可以不用再做了,花费时间的性价比不高

仔细看过你得代码,才知道我自己那个代码是有问题的,就是闰年且小于二月份的日期,会被多加一天,真是个bug sweat_smile

一语中的 smile 的确,不跳出舒适区就有点像温水煮青蛙,很难有大进步的,得大胆往更深的领域迈进才行。阿里嘎多 smile