/********************************************************************
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