// datum.cc // Asking questions about date-of-birth // Author Pascal Vos Rick van der Zwet #include #include using namespace std; struct Datum {int Jaar, Maand, Dag, Weekdag;}; //Toelatingsberekeing //ACTIE: Print logo op het scherm void Logo() { cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << "+ +" << endl << "+ University of Leiden +" << endl << "+ Programeermethoden 1 +" << endl << "+ Programeeropdracht Beta-Test +" << endl << "+ +" << endl << "+ ---FREE TO USE--- +" << endl << "+ +" << endl << "+ \\\\ _ -- _.d888888b._ +" << endl << "+ `/\\ - _o8P^' `^?8o_ +" << endl << "+ `/\\ - - .8P' `?8. +" << endl << "+ `/\\ dP' -,d8888888, `?b +" << endl << "+ \\ `/\\ - dP' -,8P' `?8 `?b +" << endl << "+ \\ _- `/\\ _.--. dP' -,8' `?b +" << endl << "+ \\ _- `/`-..--\\ ) d8' ,8' `8b +" << endl << "+ \\ \\ _- `,',' / ,')88 -88 88 +" << endl << "+ `-_ - ` -- ~ ,',' 88 88 88 +" << endl << "+ \\ `- ,',' 88 - 88 88 +" << endl << "+ \\ \\,--. ____==-~ ?8, `8, ,8P +" << endl << "+ \\ \\_-~\\ - ?b, `8, ,dP +" << endl << "+ `_-~_.-' ?b, `8b, ,d8 ,dP +" << endl << "+ \\-~ - - ?b, `88888888' ,dP +" << endl << "+ `8b, ,d8' +" << endl << "+ Created at 21-09-2004 by: - - `^8b._ _.d8^' +" << endl << "+ -Pascal de Vos - _ `^?888888P^' +" << endl << "+ -Rick van der Zwet +" << endl << "+ +" << endl << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; } //end Logo //Tijd uit het bestand ophalen en in locale variablen opslaan Datum TijdOphalen() { Datum Huidige = {0, 0, 0, 0}; time_t ruwetijd; struct tm * tijd_tm; time ( &ruwetijd ); tijd_tm = localtime ( &ruwetijd ); Huidige.Jaar = tijd_tm->tm_year + 1900; Huidige.Maand = tijd_tm->tm_mon + 1; Huidige.Dag = tijd_tm->tm_mday; Huidige.Weekdag = tijd_tm->tm_wday; return Huidige; } //INPUT: jaar, maand ,dag //ACTIE: Bepaal dag van de week //Voorwaarden: alles geldig //UITVOER: dag van de week (integer) int DagvandeWeek (int Jaar, int Maand, int Dag) { time_t ruwetijd; struct tm * tijd_tm; time ( &ruwetijd ); tijd_tm = localtime ( &ruwetijd ); tijd_tm->tm_wday = 0; tijd_tm->tm_mday = Dag; tijd_tm->tm_mon = Maand -1; tijd_tm->tm_year = Jaar - 1900; mktime(tijd_tm); int tmp_wday = tijd_tm->tm_wday; tijd_tm =localtime ( &ruwetijd ); return tmp_wday; } //INPUT: maand, jaar //ACTIE: bepalen hoeveel dagen de maand bevat //VOORWAARDEN: schikkeljaar is een jaar die te delen is door 4, en //als ie te delen is door 100, dan moet door 400 ook kunnen int DageninMaand(int Maand, int Jaar) { const int daginmaand[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (Maand == 2) //Maand is februari { int SchrikkelTest = 4; while ( SchrikkelTest <= Jaar ) { if ( SchrikkelTest == Jaar ) //Jaar deelbaar door 4 { SchrikkelTest = 100; while ( SchrikkelTest <= Jaar ) { if ( SchrikkelTest == Jaar ) { //Jaar is deelbaar door 100, dus testen SchrikkelTest = 400; //of ook deelbaar door 400 is while ( SchrikkelTest <= Jaar ) { if ( SchrikkelTest == Jaar ) { //Jaar is deelbaar door 4, 100, 400 return (29); //dus schikkeljaar } SchrikkelTest = SchrikkelTest + 400; } return (28); } SchrikkelTest = SchrikkelTest + 100; } return (29); } SchrikkelTest = SchrikkelTest + 4; } return (28); } else { //Maand is geen februri, haal het max aantal dagen dus uit daginmaand tabel return (daginmaand[Maand]); } return (99); //error in function } //end DageninMaand Datum GeboorteDatumInvoer(Datum Huidige) { const char * month[] = { "", "Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "October", "November" , "December" }; Datum Geboorte = {0, 0, 0, 0}; //Geboortejaar invoer. Testen op ouder dan 150, jonger dan huidige jaar cout << "Geef uw: \n" << "-Geboortejaar [yyyy]: "; cin >> Geboorte.Jaar; if (Geboorte.Jaar > Huidige.Jaar) { cout << "We leven in " << Huidige.Jaar << ", komt u later maar eens terug" << endl; return (Geboorte); } else { if (Geboorte.Jaar <= (Huidige.Jaar - 150)) { cout << "Sorry " << (Huidige.Jaar - Geboorte.Jaar) << " jaar is te oud voor deze studie" <> Geboorte.Maand; if ( (Geboorte.Maand > 12) | (Geboorte.Maand < 1) ) { cout << "Sorry, deze maand bestaat niet" << endl; return (Geboorte); } //Geboortedag. Testen op geldige geboortedag cout << "-Geboortedag [1-" << DageninMaand(Geboorte.Maand , Geboorte.Jaar) << "]: "; cin >> Geboorte.Dag; if ( (Geboorte.Dag > DageninMaand(Geboorte.Maand, Geboorte.Jaar) ) | (Geboorte.Dag < 1) ) { cout << "Sorry, " << month[ Geboorte.Maand ] << " heeft geen " << Geboorte.Dag << " dagen" <= Huidige.Maand) && (Geboorte.Dag > Huidige.Dag) ) { cout << "Sorry, u kunt u pas inschrijven als u geboren bent"; Geboorte.Dag = 0; return (Geboorte); } return (Geboorte); } int GeboorteDatumUitvoer(Datum Geboorte, Datum Huidige) { //uitrekenen, leeftijd const char * weekday[] = { "Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag" }; const char * month[] = { "", "Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "October", "November" , "December" }; int JarenOud = 0; int MaandenOud = 0; if ( Huidige.Maand == Geboorte.Maand ) { if ( Huidige.Dag >= Geboorte.Dag ) { JarenOud = Huidige.Jaar - Geboorte.Jaar; MaandenOud = (JarenOud * 12) + (Huidige.Maand - Geboorte.Maand); } else { JarenOud = (Huidige.Jaar - Geboorte.Jaar) - 1; MaandenOud = (JarenOud * 12) + (Huidige.Maand - Geboorte.Maand) - 1; } } else { if (Huidige.Maand > Geboorte.Maand) { if ( Huidige.Dag >= Geboorte.Dag ) { JarenOud = Huidige.Jaar - Geboorte.Jaar; MaandenOud = (JarenOud * 12) + (Huidige.Maand - Geboorte.Maand); } else { JarenOud = (Huidige.Jaar - Geboorte.Jaar); MaandenOud = (JarenOud * 12) + (Huidige.Maand - Geboorte.Maand) - 1; } } else { if ( Huidige.Dag >= Geboorte.Dag ) { JarenOud = (Huidige.Jaar - Geboorte.Jaar) - 1; MaandenOud = (12 - Geboorte.Maand) + (JarenOud * 12) + (Huidige.Maand); } else { JarenOud = (Huidige.Jaar - Geboorte.Jaar) -1; MaandenOud = (12 - Geboorte.Maand) + (JarenOud * 12) + (Huidige.Maand - 1); } } } //Gegevens weergeven cout << "Het is vandaag : " << weekday[Huidige.Weekdag] << " " << Huidige.Dag << " " << month[Huidige.Maand] << " " << Huidige.Jaar <> WiB1; cout << "Geef je Wiskunde B2 eindcijfer[1-10], 0 = niet gedaan: "; cin >> WiB2; cout << "Geef je Natuurkunde eindcijfer[1-10], 0 = niet gedaan: "; cin >> Na; // aantal onvoldoendes wordt getelt if ( WiB1 <= 5 ) Aantalonvoldoendes++; if ( WiB2 <= 5 ) Aantalonvoldoendes++; if ( Na <= 5 ) Aantalonvoldoendes++; // Alle 3 de vakken niet gedaan is meteen het einde // Bij 2 of meer onvoldoendes of wanneer er 2 van de 3 vakken niet gedaan zijn // volgt er een meerkeuze vraag. if ( ( WiB1 + WiB2 + Na ) == 0 ) { cout << "U bent niet geschikt voor deze opleiding" << endl; return(1); } else { if ( Aantalonvoldoendes >= 2 ) { cout << " U zal de volgende meerkeuzenvraag moeten beantwoorden" << endl << " Wat is de afgeleide van de volgende functie: 2 * e^3x + e^x^2," << "kies uit de volgende opties" << endl << " A) 6 * e^3x + 2x * e^x" << endl << " B) 6 * e^3x + 2x * e^x^2" << endl << " C) 3 * e^3x + 2x * e^x^2" << endl << " D) 9 * e^2x + 4x * e^x^3" << endl << "Kies nu [A/B/C/D]: "; cin >> antwoord; if ( antwoord != 'B' ) { cout << " Dat is niet correct" << endl; return(1); } } } cout << "U heeft talent ;)" << endl << "U mag door naar de controlevraag!" << endl; //Bij de controlevraag wordt er om een reeel getal gevraagt //Ouderen (20+) krijgen een 2e kans while (TweedeKans < 3) { cout << "Poging " << TweedeKans <> antwoordreeel; if ( ( antwoordreeel > (antwoord2 - marge) ) && ( antwoordreeel < (antwoord2 + marge) ) ) { TweedeKans = 3; cout << "Het Correcte antwoord: " << antwoord2 << endl << "Marge: " << marge << endl << "U bent toegelaten." << endl << endl; } else { if (JarenOud > 19) TweedeKans = TweedeKans + 1; if ((JarenOud < 20) || (TweedeKans == 3)) { cout << "Incorrect, U bent niet geschikt voor deze opleiding" << endl; return(1); } } } if (antwoord2 > antwoord) { tmp_CollegeGeld = (antwoord2 - antwoordreeel) * 10000; } else { tmp_CollegeGeld = (antwoordreeel - antwoord2) * 10000; } if ((WiB1 >= WiB2) && (WiB1 >= Na )) HoogsteCijfer = WiB1; if ((WiB2 >= WiB1) && (WiB2 >= Na )) HoogsteCijfer = WiB2; if ((Na >= WiB1) && (Na >= WiB2)) HoogsteCijfer = Na; tmp_CollegeGeld = tmp_CollegeGeld + (JarenOud * 123.45) - (HoogsteCijfer * 42); if ( (int(tmp_CollegeGeld) % 10) < 5) { //collegegeld afronden naar beneden CollegeGeld = ((int(tmp_CollegeGeld)) - (int(tmp_CollegeGeld) % 10)); } else { //collegegeld afronden naar boven CollegeGeld = ((int(tmp_CollegeGeld)) - (int(tmp_CollegeGeld) % 10)) + 10; } if ((tmp_CollegeGeld < 0) | (CollegeGeld < 0) ) { tmp_CollegeGeld = 0; CollegeGeld = 0; } cout << "Collegegeld onafgerond: E " << tmp_CollegeGeld << endl << "Collegegeld afgerond: E " << CollegeGeld << ",-" << endl; return (0); } int main( ) { int JarenOud = 0; Datum Huidige = {0, 0, 0, 0}; Datum Geboorte = {0, 0, 0, 0}; Logo(); Huidige = TijdOphalen(); Geboorte = GeboorteDatumInvoer(Huidige); JarenOud = GeboorteDatumUitvoer(Geboorte, Huidige); cout << JarenOud; ToelatingEnCollegeGeld(JarenOud); return(0); }