Programmeermethoden — Werkcollege 8 — Derde opgave

Het achtste werkcollege van het vak Programmeermethoden vindt plaats in zaal 302/304, zaal 306/308 en zalen 307 en 309 (de PC-zalen; 307 en 309 zijn speciaal bestemd voor Wiskunde-studenten). Voor studenten Wiskunde of Informatica is dit werkcollege op dinsdag 17 november 2009, van 13.45 tot 15.30 uur, en voor studenten Natuurkunde of Sterrenkunde, en voor hen die een dubbele propedeuse WN of WA doen op donderdag 19 november 2009, van 11.15 tot 13.00 uur. Het wordt verzorgd door Ramon van Dam, Sjoerd Henstra, Ben Kwint en Jonathan Vis, onder leiding van Mattias Holm, MSc en drs. Tijn Witsenburg.

Het eigenlijke werkcollege

De derde programmeeropgave bestaat uit de menu-opties (in feite Machtig, Galgje en Woordenboek) en uit het eigenlijke menu-programma. Verder wordt al snel duidelijk dat er een nette functie moet komen om getallen foutloos in te lezen. Het schrijven van het programma kan dan ook netjes in een zestal taken verdeeld worden.
Zo kan in eerste instantie een menu gemaakt worden waarbij de keuze Machtig leidt tot een regeltje op het scherm ("hier moet nog ge-Machtig-d worden"). In het programma is dat een functie-aanroep Machtig ( ), waarbij de functie-body uit een cout << ... en wellicht een cin >> ... bestaat. Deze functie kan dan apart uitgewerkt worden, zelfs als een apart programma, en in een later stadium in het menu-programma gezet worden. Als de opgave door twee personen gemaakt wordt kan hier verstandig worden samengewerkt.

In de nu volgende opgaven wordt stap voor stap toegewerkt naar het beoogde eindresultaat. De volgorde ligt helemaal niet vast: zo kun je bijvoorbeeld eerst ook de optie Machtig maken.

  1. Maak een menu-programma dat aan de gebruiker drie opties presenteert: O(ntspanning), (M)achtig en S(toppen). Bij O en M komt alleen een tekstje op het scherm, bij S stopt het programma. Gebruik een switch. Alsjeblieft geen recursie, maar doe het met while-loops! Maak de keuze-opties locale variabelen.
  2. Idem, maar nu leidt O tot een nieuw menu, met opties W(oorden), G(algje) en T(erug), waarbij T terug voert naar het hoofdmenu. Verder leveren W en G weer alleen een tekstje, terwijl je in hetzelfde submenu blijft. Zorg dat er per (sub)menu één functie is.
  3. Schrijf een functie die de optie inleest met cin.get ( ).
  4. Schrijf een functie leesgetal die een getal karakter voor karakter inleest, wederom met cin.get ( ). Denk aan de parameters in de heading.
    Richt het zo in dat alles tot en met de eerstvolgende Enter wordt weggelezen, en dat daarvan een zinnig getal wordt gemaakt. Je kunt het bijvoorbeeld zo maken dat abc12def34gh[Enter] wordt geinterpreteerd als 1234.
  5. Idem, maar nu moet het ingevoerde getal niet groter zijn dan een als value-parameter meegegeven bovengrens.
    Je kunt het bijvoorbeeld zo maken dat abc12def34gh[Enter] wordt geinterpreteerd als 123, als het getal kleiner moet zijn dan 1000.
  6. Maak een random-generator. Gebruik de in het dictaat in Hoofdstuk 3.9.3 van het dictaat, gedeelte "aantekeningen bij de hoorcolleges", gesuggereerde methode. Gebruik een static variabele.
  7. Maak de optie Galgje. Schrijf een functie resultaat (gok,goed,...) die bij gegeven goede woord goed en een gok(letter) de juiste resultaten oplevert. Gebruik ook een array reedsgeraden met de reeds geraden letters op hun juiste plaats.
  8. Voor de optie Machtig: maak een class grootgetal met de juiste "member-variabelen" en "member-functies" (methoden) — zie de opgave. Bouw eerst dubbel-verbonden pointer-lijstjes, vergelijk het pointerpracticum van vorige week.
  9. Schrijf de betreffende functies, allereerst drukaf, en het door de gebruiker laten kiezen van een GROOT getal. Test dit goed!
  10. De functie maal is het lastigst. Er zijn verschillende mogelijkheden; zo kun je bijvoorbeeld gebruik maken van een zelfgemaakte functie optellen (die twee GROTE getallen naar een van de twee, of juist naar een derde, optelt) en/of van een zelfgemaakte functie kopie (die een GROOT getal kopieert).
    Maak eerst met de hand een vermenigvuldiging als 1234 x 5678. Hier gebruik je in feite vakje10 om de losse cijfers te bevatten.
    Je kunt nu één voor één de "cijfers" (in het 10000-tallig stelsel) van het tweede getal met die van het eerste vermenigvuldigen, en de resultaten steeds toevoegen aan het resultaat. Denk eraan geregeld nieuwe vakjes toe te voegen, en denk hierbij aan de overdracht ("carry", als een "cijfer" boven 9999 komt). Verder, let op het juiste vakje waar het resultaat van een vermenigvuldiging van twee "cijfers" terecht moet komen.
  11. Maak de optie Machtig af. Denk ook aan het opruimen! Gebruik een (tijdelijke) globale variabele om te controleren of aan het eind evenveel new's als delete's zijn gedaan.
  12. Maak de optie Woordenboek.
    Tip: maak een string mijnstring leeg met mijnstring.erase (0);. Soms werkt ook mijnstring = ""; wel.
Maak nu de derde programmeeropgave af. Denk aan de eisen voor het verslag, zie elders.


Werkcolleges (in zalen 302/304, 306/308, 307 en 309, of in "gewone" zalen)
1. UNIX 2. Eerste opgave I 3. Eerste opgave II 4. Functies
5. Tweede opgave I 6. Tweede opgave II 7. Op papier  
8. Pointerpracticum 9. Derde opgave 10. Derde/vierde opgave 11. Vierde opgave
12. Qt 13. Oude tentamens    


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

20 oktober 2009 — http://www.liacs.nl/home/kosters/pm/pmwc11.html