Programmeermethoden — Werkcollege 5 — Tweede opgave

Het vijfde 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 29 september 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 1 oktober 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.
Spreekuur in zalen 302 ... 309: dinsdag 29, woensdag 30 september, donderdag 1, dinsdag 6, woensdag 7, donderdag 8 en vrijdag 9 oktober 2009, van circa 15.30 tot 17.00 uur.

Voorbereiding

Als voorkennis wordt bekend verondersteld:

Het eigenlijke werkcollege

Doe achtereenvolgens deze opdrachten, die van alles met de tweede programmeeropgave te maken hebben:
  1. Schrijf een programma dat een gegeven (invoer)file, zeg invoer.txt, onveranderd kopieert naar een uitvoerfile, zeg uitvoer.txt. Maak zelf een geschikte invoerfile als testfile.
    Hint: dictaat, gedeelte "aantekeningen bij de hoorcolleges", Hoofdstuk 3.7.
  2. Tel het aantal karakters in de file. Tel hierbij de regelovergangen (LineFeed: '\n') ook apart.
  3. Laat alle cijfers uit de file op het beeldscherm afdrukken.
  4. Maak geregeld (elk kwartier) een backup van je C++-file, steeds onder een andere naam!
  5. Tot nu toe was dit om er een beetje in te komen. Nu de opgave, waarvoor je het bovenstaande grotendeels kunt gebruiken. Verander steeds weinig aan je programma. In het bijzonder, voeg geen get's meer toe!!! Voorlopig nog niet doen: invoeren nummer beginregel en eindregel; filenamen kiezen; statistieken; delen door nul.
  6. Zorg ervoor dat je het bovenstaande rond 25 september al af hebt!
    ======================================================
  7. Bewerkstellig dat het programma getallen als geheel herkent. Tip: wat gebeurt er met het opgebouwde getal als je een nieuw cijfer binnenkrijgt? Als je getal bijvoorbeeld 712 was, en je leest nu een 5? Dan word je 7125; hoe zit dat in het algemeen? Druk de getallen ter controle op aparte regels af.
  8. De ruwe programastructuur wordt nu (het kan ook anders ...):
    while not einde file
       if cijfer
          leeg buffer
          update getal
       else
          analyseer en update buffer
       update buffer
  9. Nu de speciale combinaties herkennen. Begin met alleen PLU, bijvoorbeeld. Gebruik een buffer met drie karakters waarin de drie laatst gelezen karakters zitten. Als een nieuw karakter wordt gelezen: doorschuiven. Houdt ook de lengte van de buffer bij: 0, 1, 2 of 3. Als ze met zijn drieën precies PLU zijn, druk dit feit dan af. Zorg ervoor dat alle "andere" karakters naar de uitvoerfile gaan, en doe ook de drie andere operatoren.
  10. Druk tijdens het herkennen de expressies af (met plussen, minnen, etc., vooralsnog zonder eindwaarde), één per regel. Controleer dit met de testfiles: de expressies zijn geheel herkend — als het goed is! Zijn schermuitvoer en de uitvoerfile precies goed? (En houd dat zo ...)
  11. Wordt bij een regelovergang de buffer netjes afgewerkt?
  12. Maak de statistiekjes in orde.
  13. Zorg ervoor dat je het bovenstaande rond 2 oktober al af hebt!
    ======================================================
  14. Stop de operatoren als een char in variabelen die dan +, -, *, / of ? ("niks") kunnen zijn. Tip: gebruik twee variabelen: één, zeg oper1, die een +, - of ? kan bevatten, en één, zeg oper2, die een *, / of ? kan bevatten.
  15. Nu gaan we de (tussen)waarde van een expressie uitrekenen.
    De ruwe programastructuur gaat worden (het kan ook anders ...):
    while not einde file
       if cijfer
          leeg buffer
          update getal
       else
          if direct na cijfer
             update factor
          analyseer en update buffer
          update zonodig accumulator
       update buffer
  16. Eerst nog maar zonder breuken. Stel je hebt gehad accu oper1 factor oper2, bijvoorbeeld 12 + 2 / 2 *. In oper1 zit een +, in oper2 een *. In accu(mulator) en factor zitten getallen: 12 en 1. Het eerstvolgende getal wordt nu tegen factor aan vermenigvuldigd, en het wachten is op een nieuwe operator. Als dit een * of / is, zitten we weer in de bovenstaande situatie. Bij een + of - kunnen we accu updaten met de factor. De operatoren kunnen ook nog "leeg" (een ?) zijn.
    Als je een niet-cijfer, direct na een getal, tegenkomt, wat moet je dan doen? Met behulp van oper2 moet je nu factor updaten.
  17. Maak nu de breuken in orde: pas de uitvoering van de operatoren aan, en vervang sommige variabelen door een duo met teller en noemer. Gebruik de functies van het vorige werkcollege. Het "breukloze" geval is een zeer eenvoudige aanpassing van het geval met breuken (alleen de deling is iets anders).
  18. Maak delen door 0 "in orde".
  19. En worden breuken als 4/1 netjes afgedrukt (namelijk als 4)?
  20. Gebruik alle testfiles om te controleren of het programma correct werkt.
  21. Werkt het programma tussen de door de gebruiker aangegeven grenzen (beginregel/eindregel)? NB Gebruik geen for-loop!
  22. Laat de gebruiker de namen van in- en uitvoerfile kiezen. Bij het testen is het namelijk handig niet steeds die namen te hoeven invoeren. En noem je testfiles bijvoorbeeld x, dat scheelt typewerk.
  23. Maak nu de tweede programmeeropgave af. Zijn er duidelijke functies gemaakt — daar had je eerder aan moeten denken!? Bijvoorbeeld de functie die een breuk vereenvoudigt? Heeft main hooguit een regel of tien-vijftien? De grootste functie mag wel groot zijn ;-)
  24. Zie bij het zesde werkcollege hoe het verslag eruit moet zien.

Testfiles

Tip: gebruik het UNIX-commando diff om je eigen uitvoerfiles te vergelijken met de correcte: diff jouwfile goedefile moet "niks" opleveren (mits de onze goed is :-).
Voorbeeldfiles (let op: kopiëren door met rechter muisknop op de links te klikken, anders gaan spaties wellicht fout!):
  1. Met de invoerfile 42ina.txt krijg je deze scherm-uitvoer, en deze uitvoerfile: 42uita.txt (hele file behandeld).
  2. Met de invoerfile 42inb.txt krijg je deze scherm-uitvoer, en deze uitvoerfile: 42uitb.txt (hele file behandeld).
  3. Idem, met regel 4 tot en met 9 behandeld: scherm-uitvoer, en deze uitvoerfile: 42uitb.txt.

Huiswerk

De antwoorden op de opgaven worden tevens via WWW verspreid, evenals de uitwerkingen van oude tentamens. Als er vragen over de opgaven zijn, stel deze dan (ook) op het college.


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.

21 september 2009 — http://www.liacs.nl/home/kosters/pm/pmwc5.html