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