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   *week = (d+dy)%7;    // 星期
   *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天

 

 


 
arrow
arrow
    全站熱搜

    rangerll 發表在 痞客邦 留言(0) 人氣()