精華區beta C_and_CPP 關於我們 聯絡資訊
/******************************************************************** Date: 10/27/1999 Compiler: BCB3.0 Reference: 1.NUMERICAL RECIPES in C /The Art of Scientific Computing Second Edition 1992 William H. Press Saul A.Teukolsky William T. Vetterling Brian P.Flannery 2.DiskG's program list at ptt 基本觀念: (第一段譯自NUMERICAL RECIPES in C /The Art of Scientific Computing) 天文學家的計時方法是以二十四小時(中午作為開始與結束),且用一個特別的日子 Julian Day。Julian Day 的第零日的是相當久以前了。但是有個方便的參考的日期為 May 23, 1928是Julian Day的第2440000日。重要的特質是,你若把Julian Day加一後 除以七,若餘0代表那日是星期天,1代表是星期一,....。 Julian Day根據Gregorian Calendar。在Oct. 15, 1582前後有改變。Oct. 14, 1582 是星期天,而Oct. 15, 1582是星期五。 P.S. DickG使用的曆和我找的不大一樣..不過 西元元年一月一日算出來都是星期六 適用日期: 西元前和西元後皆可以。西元前以負號代表! 注意1B.C.後是1A.D. */ #include <math.h> #include <conio.h> #include <iostream.h> long julday(int i_year,int i_month,int i_day) /* 回傳year年month月day日是多少Julian Day 此Function不易了解。 */ { long l_julday; int ia,ib = i_year,ic; if(ib < 0)ib++; if(i_month > 2) ic = i_month+1; else { ib--; ic = i_month+13; } l_julday = (long)(floor(365.25*ib)+floor(30.6001*ic)+i_day+1720995); //計算從西元元年一月一日至今有多少個Julian Day 。 //365.25是因為四年一閏,每月平均30.6001天 //西元元年一月一日是1720995Julian Day //Gregorian Calendar後,閏法改成四年一閨百不閨,四百閨 if(i_day+31L*(i_month+12L*i_year) >= 15+31L*(10+12L*1582)) { ia = (int)(0.01*ib); l_julday += 2-ia+(int)(0.25*ia); } return l_julday; } class Calendar{ /* 處理月曆的Class */ private: static char month[12][4]; // 記錄月的名稱 static int month_days[12]; // 記錄月的日數 int i_year,i_month; private: void display(ostream &os_out) const; public: friend istream &operator>>(istream &is_in,Calendar &ca) { is_in >> ca.i_year >> ca.i_month ; return is_in; } friend ostream &operator<<(ostream &os_out,const Calendar &ca) { ca.display(os_out); return os_out; } bool operator()(){return i_month>0 && i_month<13;} }; char Calendar::month[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int Calendar::month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; void Calendar::display(ostream &os_out) const { /* 畫出月曆 */ long la,lb = 0; os_out << " " << abs(i_year); os_out << ((i_year<0) ? " B.C." : " A.D."); os_out << " " << month[i_month-1] << endl; os_out <<" Su Mo Tu We Th Fr Sa" << endl; for(int ia = 1;ia <= month_days[i_month-1];ia++) { la = (julday(i_year,i_month,ia)+1) % 7; if(la < lb) os_out << endl; gotoxy(2+la*3,wherey()); os_out << ia; lb = la+1; } } int main(void) /* 主程式 */ { Calendar ca; do{ clrscr(); cout << "Please Input the year and the month : "; cin >> ca; if(ca()) break; cout << "Illegal data" << endl; getch(); } while(1); cout << ca; getch(); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: 226.c246.ethome.net.tw