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:
Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.
7 oktober 2005 — http://www.liacs.nl/home/kosters/pm/op3pm05.html