*^-^* 每日一题: 今天是一年中的第几天? *^-^*

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语句。 ---<来自小白的总结>

c++·c
173 views
Comments
登录后评论
Sign In
·

多体会一下 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;
}