第九週(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 #include
08 #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 //////////////////////