close
之前看到網路神人的程式:
正好用到要計算日期的函式,就用來參考別人的想法與做法。
時間計算總是常常用到,學來有益無害。
//------------------
#include
#include // 為了給clearInput()用 numeric_limits
using namespace std;
// 取得天數(回傳值), 並回傳星期幾(*week) 與 當年第幾週(*yw)
int GetDays(int year, int month, int day, int *week, int *yw )
{
int m[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((year%4==0 && year%100!=0)|| year%400==0) m[1]=29; // 閏年2月
if (year<1 || month<1 || month>12 || day<1 || day>m[month-1]) return -1;
int y = year-1;
int d = y*365+y/4-y/100+y/400; // d: 年前總天數
int dy=day;
for(int i=0; i
*yw = (dy+d%7)/7+1; // 第幾週
return (d+dy); // 統計天數
}
// 淨空錯誤輸入 ---
void clearInput()
{
cin.clear();
cin.ignore( numeric_limits ::max(), '\n' );
}
// 主程式 ====
int main()
{
char *week[]= { "日", "一", "二", "三", "四", "五", "六" };
int y1, m1, d1, da1, w1, yw1;
int y2, m2, d2, da2, w2, yw2;
for(y1=m1=d1=0; true; clearInput(), y1=m1=d1=0)
{
cout<< "請輸入第一個日期(西元年﹑月﹑日,請以空白相隔): ";
cin >> y1 >> m1 >> d1;
if ((da1 = GetDays(y1, m1, d1, &w1, &yw1))>0) break;
cout<< "日期輸入錯誤!!"<< endl << "重新";
}
for(y2=m2=d2=0; true; clearInput(), y2=m2=d2=0)
{
cout<< "請輸入第二個日期(西元年﹑月﹑日,請以空白相隔): ";
cin >> y2 >> m2 >> d2;
if ((da2 = GetDays(y2, m2, d2, &w2, &yw2))>0) break;
cout<< "日期輸入錯誤!!"<< endl << "重新";
}
int days = (da1>da2)? da1-da2: da2-da1; // 計算兩天所差天數
cout<< endl << "第一個日期為 星期" << week[w1] << " 為當年的第 "<< yw1 << "週";
cout<< endl << "第二個日期為 星期" << week[w2] << " 為當年的第 "<< yw2 << "週";
cout<< endl << "兩個日期相差 " << days << "天 間隔 " << (days/7) << "週";
if (days%7==0) cout<< "整" << endl << endl;
else cout<< "又 "<< (days%7) << "天" << endl << endl;
system("pause"); // 暫停
return 0;
}
//=====================
執行結果:
請輸入第一個日期(西元年﹑月﹑日,請以空白相隔): 2012 08 14
請輸入第二個日期(西元年﹑月﹑日,請以空白相隔): 2012 08 16
第一個日期為 星期二 為當年的第 34週
第二個日期為 星期四 為當年的第 34週
兩個日期相差 2天 間隔 0週又 2天
全站熱搜
留言列表