user3371528
user3371528

Reputation: 75

Zeller's congruence coding, outputing wrong day

#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;

}

This compiles and works fine, but when I input dates, the wrong weekday comes up.

For example, 2/28/2014 is a Friday, but Saturday comes up. Any suggestions? I am stuck on what to change, I checked the equations many times as well.

Upvotes: 1

Views: 5550

Answers (1)

4pie0
4pie0

Reputation: 29744

In Zeller's congruence implementation result means: 0 = Saturday, 1 = Sunday, 2 = Monday ... The formula that you use also requires change in dayofweek function and changes to handle year. I decided to throw this dayofweek function away introducing dayNumber instead.

After applying this changes to switch statement and function, I get correct results for Wikipedia examples for January 1, 2000 and March 1, 2000. Also for your 2 28 2014 input I get Friday as correct answer.

changed code:

#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;
}

Upvotes: 1

Related Questions