/* ********************************************************* VKONPV2.CPP Lukee ensin näppäimistöltä päivämäärän, ja sitten laskee ja tulostaa näytölle vastaavan viikonpäivän. ********************************************************* */ #include struct paivamaara { int pp, kk, vvvv; }; void lue_paivamaara(paivamaara &pvm) { cout << "Anna päivämäärä muodossa pp kk vvvv > "; cin >> pvm.pp >> pvm.kk >> pvm.vvvv; // järkevyys pitäisi tarkistaa! } int laske_viikonpaiva(paivamaara pvm) { int a, b, c, dd; if (pvm.kk <= 2) { // ei haittaa vaikka kenttämuuttujien arvoja pvm.kk = pvm.kk + 10; // muutetaan; muutokset eivät välity tämän pvm.vvvv = pvm.vvvv - 1; // funktion ulkopuolelle } else pvm.kk = pvm.kk - 2; a = pvm.vvvv/100; b = pvm.vvvv%100; c = (13*pvm.kk - 1)/5 + a/4 + b/4; dd = pvm.pp - 2*a + b + c; while (dd < 0) // muunnetaan dd ei-negatiiviseksi, sillä %-operaattoria dd = dd + 7; // on syytä käyttää vain ei-negatiivisille operandeille; // muutoin tulos riippuu kääntäjästä return (dd%7); } void tulosta_viikonpaiva(int vkonpv, paivamaara pvm) { cout << pvm.pp << "." << pvm.kk << "." << pvm.vvvv << " on "; switch (vkonpv) { case 1: cout << "maanantai." << endl; break; case 2: cout << "tiistai." << endl; break; case 3: cout << "keskiviikko." << endl; break; case 4: cout << "torstai." << endl; break; case 5: cout << "perjantai." << endl; break; case 6: cout << "lauantai." << endl; break; case 0: // tapaukset vkonpv < 0 ja cout << "sunnuntai." << endl; // vkonpv > 6 eivät mahdollisia, break; // siksi ei default-osaa } } int main(void) { paivamaara tanaan; int viikonpaiva; lue_paivamaara(tanaan); viikonpaiva = laske_viikonpaiva(tanaan); tulosta_viikonpaiva(viikonpaiva, tanaan); return 0; }