|
Deze opgave probeert te bepalen of iemand geschikt is voor een studie aan de universiteit: er is immers geen loting. Daartoe moeten enkele vragen beantwoord worden; zo moet de kandidaat weten op welke dag hij/zij geboren is. En als je 42 en 17 niet met elkaar kunt vermenigvuldigen, is een beta-studie misschien niet verstandig.
Om te beginnen moet de
gebruiker zijn/haar geboortejaar als geheel getal invoeren,
en daarna de geboortemaand, ook als geheel getal.
Vervolgens voert hij/zij de geboortedag in,
wederom als geheel getal.
Het programma berekent dan de leeftijd van de gebruiker,
zowel in aantal jaren als in maanden
(bijvoorbeeld: 10 jaar en 3 maanden; 123 maanden);
beide worden op het beeldscherm getoond.
De leeftijd in maanden wordt analoog aan die in jaren bepaald
(als je op de 31ste geboren bent, wordt je iedere maand
een maand ouder, maar je bent niet zo vaak "maandig" — dat ben je namelijk alleen
op iedere 31ste).
Jarige en maandige gebruikers worden gefeliciteerd.
Aangenomen mag worden dat het programma op de peildatum
21 september 2020 draait (gebruik const;
liefhebbers
mogen met ctime de echte huidige dag
opvragen en gebruiken). Let op: het
programma moet in principe ook op andere
peildata vanaf heden tot 2100 correct werken!
Gebruikers jonger dan 10 jaar (de 10-de verjaardag nog niet gevierd)
of ouder dan 100 jaar
(dus 101-ste verjaardag reeds gevierd) worden
meteen geweigerd.
Als uit het geboortejaar direct al duidelijk is dat het met de leeftijd
niets gaat worden, hoeven de vragen naar maand en/of dag
niet gesteld te worden. Maar soms biedt pas de dag uitsluitsel!
Nu moet de gebruiker zijn/haar geboortedag
(zondag, maandag, ..., zaterdag) weten.
Als deze fout is, wordt men meteen "verwijderd",
en stopt het programma.
Het antwoord moet met één letter (de eerste letter van de dag; geen cijfer dus) worden gegeven,
bijvoorbeeld w voor woensdag. In het geval van d/z wordt nog
om de tweede letter gevraagd.
Het is niet de bedoeling ctime
te gebruiken om deze dag uit te rekenen.
Het programma moet een zelf bedachte berekening bevatten
om deze dag te bepalen!
Gebruik bijvoorbeeld dat 1 januari 1901
op een dinsdag viel.
Gebruik niet het
Doomsday algoritme
(zie ook hier),
en ook niet allerlei ingewikkelde formules.
Voor de periode 1901–2099 geldt dat een jaar een schrikkeljaar
is precies dan als het jaartal door 4 deelbaar is.
De echte test bestaat uit enkele vragen. Mensen van 30 jaar of ouder worden hierbij
twee maal "netter" aangesproken dan jongeren.
Splits de C++-code in het programma niet onnodig vaak!
Er wordt gekeken of de aanstaande student
enigszins kan vermenigvuldigen.
Wiskundig inzicht is namelijk vereist voor een beta-studie.
Mocht dat niet zo zijn, wordt er getest hoe
het met de kunst- of literatuurkennis staat.
De gebruiker moet allereerst het product van twee willekeurige gegeven positieve gehele getallen schatten, zeg 42 en 17. Beide getallen moeten tussen 10 en 99 liggen, grenzen inbegrepen. De gebruiker krijgt, of diens antwoord goed of fout is, de bekende vermenigvuldiging te zien. In ons voorbeeld:
42
Elk programma moet bij het "runnen"
aan het begin op het beeldscherm laten zien wie
de makers zijn, wat
hun jaar van aankomst, studierichting en studentnummer is, welke opgave het is,
wat de gebruiker te wachten en te doen staat,
de datum waarop het programma gemaakt is,
enzovoorts.
Dit noemen we het infoblokje.
Probeer dit er netjes uit te laten zien.
Maak geen al te complexe kaders eromheen;
gebruik liefst alleen de eerste 128 gewone karakters.
Denk aan het gebruik van lege regels, inspringen, commentaar, constanten, enzovoorts.
Bovenaan het programma dient zoals gezegd commentaar over het programma te staan,
speciaal bestemd voor andere programmeurs (en nakijkers),
bijvoorbeeld kort wat het programma doet, en welke compiler gebruikt is:
gebruikers van het programma vinden dat laatste niet interessant.
Het infoblokje moet tijdens het "runnen" van het programma op het scherm
komen, en is bestemd voor gebruikers van het programma.
Lees ook eens
over richtlijnen bij het maken van programmeeropgaven,
en bestudeer de huisregels.
Er hoeft geen gebruik van functies, arrays en het while- en for-statement
gemaakt te worden.
Alleen de headerfiles iostream
mag en moet gebruikt worden —
en eventueel ctime voor liefhebbers;
en misschien cstdlib voor het gebruik van de random-generator.
Ruwe indicatie voor de lengte van het C++-programma: 200 regels
(300 mag ook wel).
Letters moeten als char worden ingelezen, dus niet met strings, die mogen
namelijk niet gebruikt worden.
Uiterste inleverdatum: maandag 21 september 2020, 17:00 uur.
Te gebruiken compiler: als hij maar C++ vertaalt;
het programma moet in principe zowel op een Linux-machine
(met g++) als onder Windows met Code::Blocks draaien.
Test dus zo mogelijk op beide systemen!
Normering: (consequente) layout 2; commentaar 2; infoblokje 1; verslag 1; werking 4.
Eventuele aanvullingen en verbeteringen: lees de WWW-bladzijde die je nu ziet:
www.liacs.leidenuniv.nl/~kosterswa/pm/op1pm.php. Recente aanvullingen en/of wijzigingen staan in rood.
17 x
--
294
420 +
---
714
Liefhebbers mogen spelen met aantal en plaats van de horizontale streepjes. De getallen moeten wel verticaal goed uitgelijnd staan. Als een rij 0 zou worden (bijvoorbeeld bij 42 maal 20) bestaat het antwoord alleen uit de andere rij: de optelling hoeft dan niet.
De verhouding tussen het gegeven en het juiste antwoord mogen hoogstens EPSILON (een zekere waarde, een double, bijvoorbeeld 0.1) van 1 verschillen. Anders wordt het fout gerekend. In het voorbeeld (42 maal 17, foutmarge 0.1) moet het antwoord tussen 643 en 785 liggen, grenzen inbegrepen.
Voor het fabriceren van willekeurige gehele getallen moet gebruik worden gemaakt van de random-generator uit C++. Gebruik bijvoorbeeld
x = rand ( ) % 20; om een "willekeurig" getal tussen 0 en 19 (grenzen inbegrepen) in de int variabele x te krijgen.
Zet bovenaan in main:
Is het antwoord goed,
dan wordt de kandidaat tot een exacte studie toegelaten, en stopt het programma.
Anders wordt één meerkeuzevraag (Aa/Bb/Cc/Dd) over kunst of literatuur
gesteld, die uitsluitsel biedt over de toelating
tot een alpha-studie. Als het daar ook mis gaat,
is men helaas niet geschikt voor een universitaire studie.
Gebruikers tot of tot en met (kies zelf) 30 jaar krijgen hier
een andere vraag dan de oudere gebruikers
— maar bij beiden is "hetzelfde" antwoord, bijvoorbeeld steeds B, goed.
Of het antwoord goed of fout is, het juiste antwoord wordt steeds op het
scherm afgedrukt.
Opmerkingen
Als de gebruiker een niet bestaande maand invoert,
bijvoorbeeld −8,
of een jaartal als 4242 (in de toekomst dus),
stopt het programma met de mededeling dat dit niet kan
(gebruik return 1;).
Evenzo voor een niet bestaande dag, bijvoorbeeld 31 april
of 42 december.
We nemen aan dat de gebruiker zo vriendelijk is verder geen fouten te maken
bij het invoeren van gegevens: hij/zij voert niet al te gekke
getallen of letters
in, etcetera.
Vanzelfsprekend worden hem/haar wel duidelijke vragen gepresenteerd.
Bovenaan het programma (in de C++-code dus) staat uiteraard commentaar,
waarin een aantal van deze elementen ook weer terugkomen,
maar dan meer gericht op programmeurs,
bijvoorbeeld de naam van de gebruikte compiler.
De manier van inleveren (één exemplaar per koppel,
dat — ter herinnering —
uit maximaal twee personen bestaat) is als volgt.
Digitaal de C++-code en het verslag
inleveren: stuur een email naar
pm@liacs.leidenuniv.nl.
Stuur geen executable's en geen TeX-files,
lever alleen één C++-file en één PDF-file digitaal in! Noem deze bij voorkeur
bidenobama1.cc, dit voor de eerste opdracht van het duo Donald Obama / Hillary von Biden.
Analoog voor de PDF-file.
De laatst voor de deadline ingeleverde versie wordt nagekeken.
Tip: maak een nette e-mail, met een korte maar zinnige tekst
als inhoud, en de C++-file en de PDF-file als attachments.
Overal duidelijk datum en namen van de twee makers vermelden,
in het bijzonder als commentaar in de eerste regels van de C++-code.
Lees bij het
derde werkcollege hoe het verslag
eruit moet zien.
Zijn spaties/tabs goed verwerkt?