2014-03-02 23 views
1
#include <iostream> 
#include <string> 

using namespace std; 


void dayofweek(int &m, int d, int y); 
int main() 
{ 

int m, d, y, daynum; 
char ans; 

do { 
cout << "Enter a date as mm dd yyyy: \n"; 
cin >> m >> d >> y; 

dayofweek(m, d, y); 

cout << m << d << y; 

daynum=(d + 5 + ((26*(m+1))/10) + ((5*(y%100))/4) + ((21*(y/100))/4))%7; 

cout << daynum; 


switch(daynum) 
{ 
    case 0: 
     cout << m << "/" << d << "/" << y << "is a Monday \n"; 
     break; 
    case 1: 
     cout << m << "/" << d << "/" << y << "is a Tuesday \n"; 
     break; 
    case 2: 
     cout << m << "/" << d << "/" << y << "is a Wednesday \n"; 
     break; 
    case 3: 
     cout << m << "/" << d << "/" << y << "is a Thursday \n"; 
     break; 
    case 4: 
     cout << m << "/" << d << "/" << y << "is a Friday \n"; 
     break; 
    case 5: 
     cout << m << "/" << d << "/" << y << "is a Saturday \n"; 
     break; 
    case 6: 
     cout << m << "/" << d << "/" << y << "is a Sunday \n"; 
     break; 
} 
cout<<"Do you want to continue? (y/n) \n"; 
cin >> ans; 
}while (ans == 'y' || 'Y'); 
return 0; 
} 

void dayofweek(int& m, int d, int y) 
{ 
    if (m==1 || m==2) 
    m=m+12; 

} 

這個編譯和工作正常,但是當我輸入日期,錯誤的週日出現。澤勒的一致性編碼,輸出錯誤的一天

例如,2/28/2014是星期五,但星期六出現。 有什麼建議嗎?我堅持要改變什麼,我也多次檢查方程。

+0

意味着:0 =星期六,1 =週日,2 =週一... – 4pie0

+2

(ANS == 'Y' || 'Y')是與(ans =='y')||相同('Y'!= 0),因此總是如此。因此,你的循環將永遠運行。 – chrizke

+1

'dayofweek' - 告訴我有關誤導性的名字... –

回答

1

在Zeller的一致實施結果表示:0 = Saturday, 1 = Sunday, 2 = Monday ... 您使用的公式還需要更改dayofweek函數和更改以處理年份。我決定拋棄這個dayofweek函數,而不是引入dayNumber

將這種變化switch語句和功能後,我得到了Wikipedia例子爲January 1, 2000March 1, 2000正確的結果。同樣對於你的2 28 2014輸入,我得到Friday作爲正確的答案。

改變的代碼:

#include <iostream> 
#include <string> 
#include <cmath> 

using namespace std; 

int dayNumber(int m, int d, int y) { 
    if (m == 1 || m == 2) { 
     m = m + 12; 
     y = y - 1; 
    } 
    return (d + (int)floor((13 * (m + 1))/5) + y%100 + (int)floor((y%100)/ 4) + (int)floor(((int)floor(y/100))/4) + 5*(int)floor(y/100)) % 7; 
} 

int main() { 

    int m, d, y, daynum; 
    char ans; 

    do { 
     cout << "Enter a date as mm dd yyyy: \n"; 
     cin >> m >> d >> y; 
     daynum = dayNumber(m, d, y); 
     cout << "daynum:" << daynum << "\t"; 

     switch (daynum) { 
      case 2: 
       cout << m << "/" << d << "/" << y << " is a Monday \n"; 
       break; 
      case 3: 
       cout << m << "/" << d << "/" << y << " is a Tuesday \n"; 
       break; 
      case 4: 
       cout << m << "/" << d << "/" << y << " is a Wednesday \n"; 
       break; 
      case 5: 
       cout << m << "/" << d << "/" << y << " is a Thursday \n"; 
       break; 
      case 6: 
       cout << m << "/" << d << "/" << y << " is a Friday \n"; 
       break; 
      case 0: 
       cout << m << "/" << d << "/" << y << " is a Saturday \n"; 
       break; 
      case 1: 
       cout << m << "/" << d << "/" << y << " is a Sunday \n"; 
       break; 
     } 
     cout << "Do you want to continue? (y/n) \n"; 
     cin >> ans; 
    } while ((ans == 'y') || (ans == 'Y')); 

    return 0; 
} 
在蔡勒公式執行的結果
+0

@ user3371528還有其他問題嗎? – 4pie0