輸入年月日,計算該日為當年第幾天(dayOfYear),依 dayOfYear % 3 判斷:
(y%4==0 && y%100!=0) || (y%400==0)#include <stdio.h>
#define OK 0
#define ERROR 1
#define LEAP 1
#define NONLEAP 0
int nonLeap[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int leap[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int isLeap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int validDate(int y, int m, int d) {
if (m < 1 || m > 12) return ERROR;
int dim = isLeap(y) ? leap[m-1] : nonLeap[m-1];
return (d >= 1 && d <= dim) ? OK : ERROR;
}
int dayOfYear(int y, int m, int d) {
int days = 0;
int* tab = isLeap(y) ? leap : nonLeap;
for (int i = 0; i < m-1; ++i) days += tab[i];
days += d;
return days;
}
int main() {
int y, m, d;
printf("請輸入年月日:");
while (scanf("%d%d%d", &y, &m, &d) == 3) {
if (validDate(y, m, d) == ERROR) {
printf("日期不合法,請重新輸入:");
continue;
}
int doy = dayOfYear(y, m, d);
printf("%04d-%02d-%02d : %s\n", y, m, d, (doy % 3 == 1) ? "打魚" : "曬網");
printf("請輸入年月日:");
}
return 0;
}
請輸入年月日:2024 2 29
2024-02-29 : 打魚
請輸入年月日:2023 2 28
2023-02-28 : 曬網
請輸入年月日:2023 13 1
日期不合法,請重新輸入:
isLeap、validDate、dayOfYear 單一職責,易測試、易維護。