Programmeermethoden 1999
Derde programmeeropgave - Het Menu

De derde programmeeropgave van het vak Programmeermethoden in het najaar van 1999 heet Het Menu; zie ook het zesde en achtste werkcollege, en lees geregeld deze pagina op WWW.

Het is de bedoeling om een C++-programma te maken dat aan de gebruiker een zogenaamd menu presenteert. Dat betekent dat de gebruiker van het programma kan kiezen uit een aantal mogelijkheden, de zogeheten opties. Het (hoofd)menu heeft drie opties: Stoppen, Experiment en Ontspanning. De opties worden gekozen door de eerste letter van de betreffende optie in te toetsen, bijvoorbeeld een s of S om te stoppen. Uiteraard wordt een en ander duidelijk en ondubbelzinnig aan de gebruiker meegedeeld. De optie Experiment leidt tot een nieuw menu. Dit menu heeft op zich weer een aantal opties. Allereerst de optie Terug naar het hoofdmenu, en verder de opties E-benaderen en Sorteren. De optie Ontspanning leidt op zijn beurt tot het spelmenu, waarin de opties Terug naar het hoofdmenu, Lingo en Klok aanwezig zijn.

Alle door de gebruiker ingetoetste symbolen moeten gecontroleerd worden, dat wil zeggen dat er binnen redelijke grenzen geen foute invoer geaccepteerd wordt. Zo zal het intoetsen van bijvoorbeeld q of & in het hoofdmenu een waarschuwing opleveren, of genegeerd worden. Verder moet bij getalleninvoer karakter voor karakter ingelezen worden. Er moet ook voor gewaakt worden dat er te grote getallen worden ingevoerd. Schrijf dus een geschikte functie leesgetal! Aan de gebruiker mogen "redelijke" beperkingen worden opgelegd, bijvoorbeeld dat de in te voeren getallen maximaal vier cijfers hebben. Het programma moet dan echter wel bestand zijn tegen pogingen meer dan vier cijfers in te voeren. Ook het invoeren van letters in plaats van cijfers moet geen problemen opleveren. Houd het simpel!

De optie E-benaderen
Aan de gebruiker wordt een geheel getal n gevraagd, kleiner dan zeg 400. Vervolgens wordt een door de gebruiker te kiezen aantal keren een willekeurige volgorde van de getallen 1,2,...,n gegenereerd: dit heet een permutatie. Per permutatie wordt gekeken of er een getal naar zichzelf wordt gestuurd; het percentage permutaties met deze eigenschap wordt afgedrukt. De kans dat een willekeurige permutatie geen getal naar zichzelf laat gaan nadert overigens tot 1/e (met e = 2,718281828..., het grondtal van de natuurlijke logaritme) als n groot wordt. Druk dit percentage ter vergelijking ook af.
Een voorbeeld, met n = 9:
   1 2 3 4 5 6 7 8 9
   3 1 8 4 2 9 6 5 7
Op de tweede rij staat de permutatie; deze betekent het volgende: 1 wordt naar 3 gestuurd, 2 naar 1, ..., 9 naar 7. Merk op dat 4 naar zichzelf gaat.
Voor het genereren van een permutatie is een randomgenerator nodig; kijk hiervoor in het dictaat, Hoofdstuk 5.5.3.

De optie Sorteren
Als bij de optie E-benaderen, maar nu moeten de permutaties alle oplopend gesorteerd worden. Per permutatie wordt het aantal vergelijkingen ("A[j] > temp") benodigd voor het sorteren bijgehouden, en het gemiddelde aantal over alle permutaties wordt afgedrukt. (Is dit ongeveer n2/4 ?) Schrijf hiertoe een functie die een array sorteert, en wel met behulp van invoegsorteer (insertion sort), zie Opgave 53 - en de uitwerking daarvan.

De optie Lingo
De gebruiker moet een woord van vijf letters raden, dat de computer in gedachten heeft. De computer kiest dit "random" uit een array met een twintigtal woorden. De gebruiker raadt maximaal vijf keer een vijfletterwoord, en de computer laat zien welke letters precies goed staan. Is het gezochte woord bijvoorbeeld harpo, en raadt de gebruiker zeppo, dan verschijnt iets als ---PO. Was de gok chico, dan wordt iets als -h--O op het beeldscherm afgedrukt: de h is wel goed, maar staat op een verkeerde plaats. Antwoorden van voorgaande gokken hoeven niet onthouden te worden - het mag wel. Wat te doen bij gokken als ppppp mag zelf gekozen worden.

[FRACTAL] De optie Klok
Afgedrukt wordt de huidige tijd, en wel als uur-minuut-seconde. Gebruik time.h. Er moet daarna een stilstaande analoge klok verschijnen, met een grote en een kleine wijzer, op het scherm (in een ander window). Gebruik de grafische mogelijkheden van UNIX/Linux/X; de benodigde files - met dank aan Siegfried Nijssen - om dit grafische gebeuren op een machine met X-windows tot stand te brengen zijn via WWW op te halen. Kopieer de files makefile, voorbeeld.cc, Xsowl.cc (verbeterd 15 november), Xsowl.h en Xsowldef.h uit http://www.liacs.nl/home/kosters/pm/ naar een eigen subdirectory, bestudeer voorbeeld.cc, en aanpassen maar ...
Tip: de rest van het programma maakt geen gebruik van deze uitgebreide grafische mogelijkheden. Schrijf dus eerst de rest, en maak de klok in zaal 301 of 302/304 achter een Linux-PC of Indy. Liefhebbers mogen de klok laten lopen.

Opmerkingen
Gebruik geschikte functies. Om het gebruik van functies goed te oefenen mogen bij deze opgave bij elke functie tussen begin-{ en eind-} hooguit circa 20 niet al te volle regels staan! Elke functie dient van commentaar voorzien te zijn. Let op goed parametergebruik: alle parameters in de heading doorgeven, en de variabele-declaraties bij het begin van main en andere functies. Er hoeft "geen" gebruik gemaakt te worden van Object geOriënteerd Programmeren. De enige te gebruiken headerfiles zijn: iostream.h, time.h, math.h (voor sinus (sin) en cosinus (cos); het kan ook zonder deze functies) en Xsowl.h. Zeer ruwe indicatie voor de lengte van het C++-programma: 600 regels. Denk aan het infoblokje.

Uiterste inleverdatum: voor voltijdstudenten: vrijdag 12 november 1999, 17.00 uur; voor deeltijdstudenten: dinsdag 16 november 1999. In te leveren: schijfje met het programma en de makefile (of het programma en de makefile per email aan de nakijker (dagstudenten: hoen@liacs.nl; avondstudenten: kosters@liacs.nl) sturen) en listing op papier; beide in de bak in de metalen boekenkast achterin de gang bij de Indyzaal. Overal duidelijk de datum en de namen van de makers vermelden. Te gebruiken compiler: als het maar C++ is.
Normering: layout 1; commentaar 2; modulariteit 3; werking 4.


Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.

13 oktober 1999 - http://www.liacs.nl/home/kosters/pm/op3pm99.html