Programmeermethoden 2009
Derde programmeeropgave
Menu

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

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.

De opgave

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, Machtig en Ontspanning. 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 Machtig laat de gebruiker zolang hij/zij wil machten uitrekenen, waarna hij/zij weer in het hoofdmenu terugkomt. De optie Ontspanning 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 Galgje en Woordenboek. Gebruik 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. 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:

  1. Digitaal de C++-code inleveren: stuur een email naar pm@liacs.nl.
    Stuur geen executable's, lever alleen de C++-file digitaal in! Noem deze bij voorkeur zoiets als JansenTilanus3.cc, dit voor de derde opdracht van het duo Jansen-Tilanus. De laatst voor de deadline ingeleverde versie wordt nagekeken.
  2. En ook een papieren versie van het verslag (inclusief de C++-code) deponeren in de speciaal daarvoor bestemde doos "Programmeermethoden" in de postkamer van Informatica, kamer 156 van het Snellius-gebouw. Overal duidelijk datum en namen van de (maximaal twee) makers vermelden, in het bijzonder als commentaar in de eerste regels van de C++-code.
    Het verslag moet het volgende bevatten: een zeer korte beschrijving van het programma, een plaatje dat een pointerlijst voorstelt (met zeer beknopte uitleg), een beschrijving van punten waarop het programma faalt, en een tabel met gewerkte uren, uitgesplitst per week en per onderdeel (menu, Machtig, Galgje, Woordenboek).
Te gebruiken compiler: als hij maar C++ vertaalt; 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.

12 oktober 2009 — http://www.liacs.nl/home/kosters/pm/op3pm09.html