打魚曬網C實例:三天打魚兩天曬網寓言故事的實例化,分析:實質上是判斷某年某月某日在當年的第多少天問題,問題的關鍵閏年的判斷,以及輸入年與日的合法性。
代碼:
#include#define OK 0 #define ERROR 1 #define NONLEAP 0 #define LEAP 1 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}; //閏年天數 /* 判斷閏年還是平年,閏年返回1,平年返回0 */ int IsLeap(int y) { if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) //閏年判斷條件 return LEAP; return NONLEAP; } /* 判斷輸入的合法性,合法返回0,不合法返回1 */ int Judge(int y, int m, int d) { if (m > 12 || m < 0) return ERROR; else if (IsLeap(y) == LEAP && m == 2 && d > 29) //判斷閏年的2月輸入是否大於29天 return ERROR; else if (IsLeap(y) == NONLEAP && m == 2 && d > 28) //判斷平年的2月輸入是否大於28天 return ERROR; return OK; } /* 計算輸入年月日到當前的總天數,total為地址引用,返回總天數 */ void Totaldays (int y, int m, int d, int *total) { int i; if (IsLeap(y) == LEAP) { for (i = 0; i < m - 1; i ++) *total += Leap[i]; } else { for (i = 0; i < m - 1; i ++) *total += NonLeap[i]; } *total += d; } int main () { int days = 0, year, mon, dd; printf("請輸入年月日: \n"); scanf("%d%d%d",&year,&mon,&dd); while (Judge(year, mon, dd) == ERROR) { printf("請檢查輸入的年月日是否正確並重新輸入: \n"); scanf("%d%d%d",&year,&mon,&dd); } Totaldays(year, mon, dd, &days); //printf("%d",days); if (days % 3 == 1) printf("%d-%d-%d : 打魚\n",year, mon, dd); else printf("%d-%d-%d : 曬網\n",year, mon, dd); return 0; }
運行結果:
輸入不合法
輸入合法: