Spreekuur in zalen 302 ... 309: dinsdag 27, woensdag 28, donderdag 29 oktober, dinsdag 3, woensdag 4, donderdag 5, vrijdag 6, dinsdag 10, woensdag 11, donderdag 12 en vrijdag 13 oktober 2009, van circa 15.30 tot 17.00 uur.
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 (met cin.get ( ); als je elders ook nog cin >> ... gebruikt krijg je overigens soms problemen met "hangende Enter's"; gebruik dus eigenlijk liever overal cin.get ( )). 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 (tip: verwerk alles tot en met de eerstvolgende enter, en maak hiervan zo goed mogelijk een getal, van een maximale grootte), en een functie leesoptie die netjes één karakter inleest en Enter's afhandelt! 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 Machtig
Doe eerst het Pointerpracticum.
De computer rekent grote machten uit, bijvoorbeeld 21000
of 123412341234123442.
Om dit uit te rekenen moet met GROTE gehele getallen gerekend worden.
Een GROOT geheel getal wordt voorgesteld
met behulp van een dubbelverbonden pointerlijst — met
in ieder vakje (behalve wellicht het eerste)
vier cijfers van het getal,
zie Hoofdstuk 3.12 van het dictaat,
gedeelte "aantekeningen bij de hoorcolleges".
Doe dus, zoals eerder gezegd, om te beginnen het
Pointerpracticum.
Gebruik een extra klasse vakje10000
die een int (voor een getal onder 10000)
en twee pointers (naar vorige en volgende)
bevat.
Maak een class grootgetal met
functies zoals
vul, maal (voor het vermenigvuldigen van twee grote getallen), kopie, ruimop en drukaf,
en member-variabelen ingang, uitgang en aantalcijfers.
De gebruiker kan nu een GROOT begingetal gg
"uitkiezen", en een "eenvoudig"
getal expo, kleiner dan 10000 (gebruik hier de eerder genoemde functie
leesgetal); de exponent is dus een klein getal! Dat GROTE getal gg wordt als volgt door de gebruiker
ingevoerd: 1) de gebruiker kan een getal aantal
invoeren (zeg aantal is 33),
waarna een GROOT getal wordt gemaakt met aantal
int's, de voorste ongelijk 0
(in het voorbeeld tussen 129 en 132 cijfers),
random gevuld; of
2) de gebruiker kan (door een getal
kleiner dan 10000 te geven, zeg 123)
een GROOT getal maken dat uit aantal
(zeg 5)
int's bestaat met in elke int
de waarde getal
(het voorbeeld levert het GROTE getal 1230123012301230123);
of
3) de gebruiker voert alle cijfers in.
Vervolgens wordt ggexpo
uitgerekend (door expo-1 keer gg met zichzelf te vermenigvuldigen)
en getoond.
De gebruiker kan kiezen om de hoeveel tussenstappen een tussenresultaat (getal
en aantal cijfers) getoond moet worden.
Tip: gebruik tijdelijk een globale variabele die elke
new positief telt, en elke delete negatief,
en die aan het eind op 0 moet staan.
De optie Galgje
De gebruiker moet een woord proberen te raden dat de computer
in "gedachten" heeft. De gebruiker mag steeds (bijvoorbeeld tot
acht keer toe, met
maximaal vijf keer een foute letter, afhangend
van de lengte van het te raden woord)
een letter noemen, waarna de
computer onthult of en waar deze letter in het woord voorkomt.
Ook goede letters uit voorgaande stappen blijven steeds zichtbaar
in het te raden woord.
Als een gebruiker een eerdere letter nog eens gokt, kost dat een stap —
maar levert het geen informatie op.
Of de gebruiker hoofdletters of kleine letters invoert
maakt niet uit.
De lengte van het woord is aan de gebruiker bekend.
De woorden — die van verschillende lengtes zijn, maximaal vijftien letters
per woord — komen uit het "woordenboek",
zie verderop. Er moet dus gebruik worden gemaakt
van strings uit de string-klasse. Uiteraard
mogen verder ook gewone char array's benut worden.
De optie Woordenboek
De gebruiker kan hier spelen met het woorden-array,
dat voor Galgje gebruikt wordt.
Als het programma start, wordt dit array
(neem als grootte een constante, bijvoorbeeld
20, en neem aan dat de file minstens 20 woorden bevat) uit een
bijgeleverde file eenmalig ingelezen in het "woordenboek".
Dit "woordenboek",
een object uiteraard,
blijft zolang het programma loopt bestaan.
Er worden alleen kleine letters benut.
De gebruiker kan het array alfabetisch laten
sorteren (gebruik de gewone lexicografische ordening,
en een sorteermethode naar keuze),
of juist random door elkaar gooien
(gebruik een zelfgemaakte random-generator,
zie Hoofdstuk 3.9.3 uit het dictaat, gedeelte "aantekeningen bij de hoorcolleges"),
een woord naar keuze verwijderen (door het invoeren van
het rangnummer van het woord; er ontstaat dan een lege
plek in het array; zo'n "leeg" woord
mag bij Galgje natuurlijk niet gebruikt worden;
en als alle woorden op zijn, moet
er ook iets fatsoenlijks gebeuren) of op een gekozen lege plek
— mits die er is — een woord toevoegen;
als een woord al voorkomt, moet het geweigerd worden.
Na iedere actie wordt het woorden-array geheel afgedrukt,
met rangnummers.
Ook bij dit onderdeel moet een nette klasse
gemaakt worden. Een door Galgje te gebruiken methode van deze klasse
is bijvoorbeeld geefrandomwoord ( )
(gebruik wederom de zelfgemaakte random-generator).
Opmerkingen
Gebruik geschikte functies.
Bij deze opgave mogen bij
elke functie (zelfs main) 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 headerfiles zijn in principe
iostream, fstream en string.
Zeer ruwe indicatie voor de lengte van het C++-programma: 600 regels.
Denk aan het infoblokje.
Uiterste inleverdatum: vrijdag 6 november 2009, 17.00 uur; voor Wiskundigen en Natuur/Sterrenkundigen (of beter gezegd: voor iedereen die niet van plan is de vierde programmeeropgave in te leveren): vrijdag 13 november 2009, 17.00 uur. Manier van inleveren:
Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.
12 oktober 2009 — http://www.liacs.nl/home/kosters/pm/op3pm09.html