第九週(11/8-11/14)繼續完成上週的萬年曆程式! 雖然是期中考週還是要吃飯, 還是要做練習 :-) 但是體諒大家心情, 繼續做萬年曆程式就好:-) 請注意本題基本要求是要做出英美等國用的西元萬年曆! 也就是照英美等國在1752年9月2日週三隔天為9月14日週四! 在1752年9月之前只要除以四除的盡的年都是閏年! 所以公元100, 200, .., 1500, 1600, 1700等都是閏年。 美國月曆做好了, 再修改成也能正確處理中國的西元月曆。 其實, 要同時可考慮美國月曆與中國的西元月曆也沒很難, 只要注意兩者調整點不同, 所以, 負責檢查閏年的函數 isLeap(year) 要小心寫, 還有, 負責填寫一個月小月曆的函數也要有 if( )特別處理。 還沒寫好或還不會寫的請: (a)先看看並測試 p80.c; 請輸入 1752 看看。 (b)拿 p81.c 去測試並修改! (c)若還是有困難, 再看看 p82.c 和 p83.c 並測試, 然後回頭繼續改 p81.c 到滿意為止。 有問題當然要舉手請助教來跟你解釋 ! 還有, 最後一次提醒: 今天晚上 2010/11/07 20:42:21 是立冬 時序正式進入冬天, 注意衣服不要感冒! 這樣進入期中考週才不會念不下書! 祝大家身體健康, 考試沒煩惱!
//=== //======== 01 //p82.c -- another reference program for Lab08 Calendar 02 // 算出 yyyy/mm/01 離 0001/01/01 有幾天 03 // 至於從 1752/10/01 算到某天有幾天一樣簡單吧? 04 // 以及中國西元曆 1912/01/01 算到某天有幾天自己想 05 // 注意此範例故意寫成輸入 year month 06 // 與原來習題規定不同喔! 07 #include08 #include 09 #include 10 #define C_USA 0 11 #define C_CN 2 12 int country = C_USA; 13 int yyyy, mm, dd, what; // year, month, day 14 long hehehe(int, int), days; 15 int dayOfWeek, REF_DAY_ONE = 6; // 注意 1/1/1 是週六 16 char buf[999]; // 不信你會打那麼多字 ? 17 char dName[ ][66]={"Sunday", "星期一", "Tuesday", "Wed", 18 "週四", "Friday", "Saturday週六" }; 19 int main( ) { 20 int i, k; 21 for( ;; ) { 22 printf("Year month(年 月): "); // 注意現在是 年 月 23 fgets(buf, sizeof(buf), stdin); 24 what = sscanf(buf, "%d %d", &yyyy, &mm); 25 if(yyyy <= 0) break; // 不玩了 26 if(what !=2 ) continue; // 必須兩個數 27 if(mm > 12) continue; // 月 <= 12 啊 28 if(mm <=0 ) continue; // 這也是亂來 29 days = hehehe(yyyy, mm); 30 printf("From 0001/01/01 to %4.4d/%02d/01:", yyyy, mm); 31 printf(" Total 過 %ld weeks + %ld days.", 32 days/7, days%7); // long 喔 33 dayOfWeek = (int)(REF_DAY_ONE+ (days%7)) % 7; 34 printf("\n %4.4d/%02d/01 is %s\n", yyyy, mm, 35 dName[dayOfWeek]); 36 }// for 37 printf("Hit ENTER key..."); 38 getchar( ); // waiting he to hit ENTER 39 return 0; 40 } 41 int isLeap(int y) { 42 int ans = 0; 43 if( (y%4) == 0) ans = 1; 44 // todo .. 45 return ans;; 46 } 47 int dayTbl[ ] = {0, 31, 28, 31, 30, 31, 30, 48 31, 31, 30, 31, 30, 31 }; // July..Dec 49 long hehehe(int year, int month) { 50 int dd = 1; // 1/1/1 算到 year/month/01 幾天 51 long ans = 0; 52 int i, k; 53 ans = 365 * (year -1); 54 for(i=1; i< year; i++) if( isLeap(i) ) ++ans; 55 // 閏年多一天 56 for(i=1; i< month; ++i) ans += dayTbl[i]; 57 if( (month > 2) && isLeap(year) ) ++ans; //今年閏年 58 ans = ans + dd -1; // 這個月 1 日 (dd == 1) 59 return ans; 60 }// 61 /*************** 62 D:\testc> path c:\Dec-Cpp\bin;%path% 63 D:\testc> gcc p82.c 64 D:\testc> a 65 Year month(年 月): 1 1 66 From 0001/01/01 to 0001/01/01: Total 過 0 weeks + 0 days. 67 0001/01/01 is Saturday週六 68 Year month(年 月): 1 2 69 From 0001/01/01 to 0001/02/01: Total 過 4 weeks + 3 days. 70 0001/02/01 is Tuesday 71 Year month(年 月): 1 3 72 From 0001/01/01 to 0001/03/01: Total 過 8 weeks + 3 days. 73 0001/03/01 is Tuesday 74 Year month(年 月): 1752 8 75 From 0001/01/01 to 1752/08/01: Total 過 91395 weeks + 0 days. 76 1752/08/01 is Saturday週六 77 Year month(年 月): 1752 9 78 From 0001/01/01 to 1752/09/01: Total 過 91399 weeks + 3 days. 79 1752/09/01 is Tuesday 80 Year month(年 月): 2010 11 81 From 0001/01/01 to 2010/11/01: Total 過 104870 weeks + 1 days. 82 2010/11/01 is Sunday <===== 這是錯的, Why? Why ?? 83 Year month(年 月): -1 84 Hit ENTER key... 85 86 D:\testc> 87 ****************/ 88 //////////////////////