Programmeermethoden 2005
Derde programmeeropgave — Het Menu

De derde programmeeropgave van het vak Programmeermethoden in het najaar van 2005 heet Het Menu; zie ook het negende werkcollege, en lees geregeld deze pagina op WWW.
Spreekuur in zalen 302 ... 309: van 31 oktober tot en met 18 november 2005, iedere werkdag van circa 15.30 tot 17.00 uur.

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, Algoritmen en Lingo. De opties worden gekozen door de eerste letter van de betreffende optie in te toetsen (gevolgd door Enter), bijvoorbeeld een s of S om te stoppen. Uiteraard wordt een en ander duidelijk en ondubbelzinnig aan de gebruiker meegedeeld. De optie Algoritmen 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 Lychrel en Sorteren. De optie Lingo laat de gebruiker zolang hij/zij wil Lingo kan spelen, waarna hij/zij weer in het hoofdmenu terugkomt. Gebruik hiervoor geen recursie!
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. Er mag wel worden aangenomen dat de gebruiker op de juiste momenten de Enter-toets bedient. Verder moet bij getalleninvoer karakter voor karakter ingelezen worden (met cin.get ( ); als je elders ook nog cin >> ... gebruikt krijg je overigens soms problemen met "hangende Enter's"). Er moet ook op gelet worden dat er geen te grote getallen worden ingevoerd. Schrijf dus een geschikte functie leesgetal die de gelezen karakters (cijfers) omzet in een getal! 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!
Kijk voor de zelf te schrijven en bij verschillende opties benodigde randomgenerator in het dictaat, Hoofdstuk 4.9.3.

De optie Lychrel
De computer rekent aan het palindroomprobleem. Een getal heet een palindroomgetal als het van voor naar achter gelezen hetzelfde is als van achter naar voor — in het tientallig stelsel. Een voorbeeld: 52677625.
Start nu met een positief geheel getal, door de gebruiker ingegeven. Zolang het getal geen palindroomgetal is, doen we het volgende: tel bij het getal het van achter naar voor geschreven getal op. De vraag is of/wanneer dit proces eindigt. Voor zover nu bekend stopt het bij 196 nooit — zo'n getal heet een Lychrel-getal.
Een voorbeeld: 175 wordt 175 + 571 = 746 wordt 746 + 647 = 1393 wordt 1393 + 3931 = 5324 wordt 5324 + 4235 = 9559, een palindroomgetal. Om dit door te rekenen voor verschillende startwaardes moet met GROTE gehele getallen gerekend worden. Een GROOT geheel getal wordt voorgesteld met behulp van een dubbelverbonden pointerlijst — met in ieder vakje één cijfer van het getal, zie dictaat, Hoofdstuk 4.12. Doe dus eerst het Pointerpracticum. TIP Gebruik een extra klasse cijfervakje die een cijfer en twee pointers (naar vorige en volgende) bevat.
Maak een class grootgetal met functies zoals vul, ispalindroomgetal, telop en drukaf, en member-variabelen ingang, uitgang en aantalcijfers. De functie vul bouwt een lijst op met het door de gebruiker gegeven getal. De functie telop telt eerst de cijfers van het "omgekeerde" getal bij zichzelf op, en loopt er dan doorheen om alle "cijfers" groter dan 9 goed te maken: 7-4-6 + 6-4-7 = 13-8-13 = 1-3-9-3; er komt dus soms een nieuw cijfer (vakje) bij!
De gebruiker kiest een begingetal, een maximaal aantal iteraties, en om de hoeveel iteraties tussenstappen (inclusief hun aantal cijfers) moeten worden afgedrukt. Voor bijvoorbeeld 175, 1000 en 2 zou worden afgedrukt zoiets als 2: 1393 (4 cijfers), 4: 9559 (4 cijfers).

De optie Sorteren
De gebruiker krijgt een klein submenutje, waarin hij/zij met drie even lange arrays met positieve gehele getallen (zeg A1, A2 en A3) kan spelen. Tip: gebruik een array met drie arrays. De gebruiker mag het bereik van de getallen kiezen, zeg min..max, bijvoorbeeld 65 tot 934. De lengte van de arrays ligt vast, zeg 50. In een array kunnen dezelfde getallen voorkomen. De opties zijn: stoppen (terug naar het Algoritmen-menu), vul A1 random (of A2 of A3), sorteer A1 met insertion sort (invoegsorteer; zie dictaat, Hoofdstuk 5.2.5) oplopend (of A2 of A3), en permuteer Ai naar Aj. Dus Aj wordt een random "verwisseling" van Ai (i,j=1,2,3). Gebruik hiervoor voorbeeldprogramma 18 uit het dictaat, Hoofdstuk 4.9.3.
Tot slot is er een optie maakgetal, waarbij de gebruiker een positief geheel getal invoert. Er moet gekeken worden of dit getal te maken is door uit elk array één getal te nemen, en deze drie met optellingen en aftrekkingen te combineren — elk getal moet precies één keer gebruikt worden. Afgedrukt moet worden iedere combinatie die het ingevoerde getal oplevert.
Bij het sorteren moet worden afgedrukt hoeveel vergelijkingen er zijn uitgevoerd. Bedoeld wordt het aantal vergelijkingen dat betrekking heeft op array-elementen dat bij insertion sort gedaan wordt. Na iedere actie worden de inhouden van de drie arrays afgedrukt.
Ook bij dit onderdeel moet een nette class gemaakt worden.

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. Als je ppppp gokt, krijg je ---P-. Voor iedere nieuwe gok krijg je de ooit perfect geraden letters (die op de juiste plek staan) te zien.

Opmerkingen
Gebruik geschikte functies. Om het gebruik van functies goed te oefenen mogen bij deze opgave (zelfs main) 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 zowel bij main als bij de andere functies aan het begin. De enige te gebruiken headerfile is in principe iostream, en eventueel string. Zeer ruwe indicatie voor de lengte van het C++-programma: 600 regels. Denk aan het infoblokje.
Uiterste inleverdatum: vrijdag 11 november 2005, 17.00 uur; voor Wiskundigen en Natuur/Sterrenkundigen (of beter gezegd: voor iedereen die niet de vierde programmeeropgave van plan is in te leveren): vrijdag 18 november 2005, 17.00 uur. Manier van inleveren:

  1. Email aan de hoofdnakijker pm@liacs.nl sturen met als attachment de C++-code. Stuur geen executable's per email!
  2. En ook een listing/afdruk op papier deponeren in de speciaal daarvoor bestemde oranje doos "Programmeermethoden" in computerzaal 302/304 of kamer 156. Vorig jaar is deze doos tot twee maal toe "gestolen", en staat daarom voortaan waarschijnlijk (als witte doos) in de postkamer van Informatica, kamer 156. Overal duidelijk datum en namen van de (maximaal twee) makers vermelden, in het bijzonder als commentaar in de eerste regels van de C++-code. Zijn spaties/tabs goed "afgedrukt" (voor een nette linker kantlijn)!?
Te gebruiken compiler: als het maar C++ is; het programma moet in principe zowel op een Linux-machine (met g++) als onder Visual C++ of Dev-C++ draaien. Test dus in principe op beide systemen! Het programma wordt doorgaans nagekeken met behulp van de compiler die (uiteraard) in het commentaar bovenin het programma vermeld staat. Normering: layout 1; commentaar 2; modulariteit 3; werking 4. Eventuele aanvullingen en verbeteringen: lees deze WWW-bladzijde.


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

7 oktober 2005 — http://www.liacs.nl/home/kosters/pm/op3pm05.html