Programmeermethoden
Werkcollege 5: Op papier I en Tweede opgave II

Het vijfde werkcollege van het vak Programmeermethoden vindt plaats in zaal 302/304, zaal 303, zaal 306/308 en zalen 307 en 309 (de PC-zalen), op maandag 7 oktober 2019, van 13:45 tot 16:00 uur voor de Wiskunde-studenten. In verband met Leidens ontzet vervalt het werkcollege van 3 oktober. Probeer er dus in de eigen tijd aan te werken! Het wordt verzorgd door de vaste staf.

Spreek/Vragenuur in zalen 302 ... 309: maandag 7 oktober 2019, aansluitend op het werkcollege.

Voorbereiding

Als voorkennis wordt bekend verondersteld:

Het eigenlijke werkcollege

Maak van deze A4: En de antwoorden zijn hier te vinden.

Doe nu achtereenvolgens deze opdrachten, die van alles met de tweede programmeeropgave te maken hebben (de eerste opdrachten zijn die van het vorige werkcollege):

  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. Laat de gebruiker voorlopig nog geen 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.
  3. Tel het aantal karakters in de file. Tel hierbij de regelovergangen (LineFeed: '\n') ook apart.
  4. Laat alle cijfers uit de file op het beeldscherm afdrukken. (Iets dergelijks is bij de programmeeropgave ook nodig.)
  5. Print op het beeldscherm de kwadraten van de getallen die in de file voorkomen, één per regel. Pas daartoe het programma subtiel aan!
    Bouw cijfers karakter voor karakter op tot getallen. Tip: als je getal 123 is, en je leest nu een 4 (als karakter!), hoe maak je dan het getal 1234? Gebruik dus een integer die het "huidige" getal bevat, en die meestal gewoon 0 is.
    De ruwe programastructuur is (het kan ook anders ...):
    lees karakter in
    while not einde file
       if karakter is een cijfer
          update een en ander
       else
          print (kwadraat van) getal
          update van alles
       print huidig karakter
       onthoud huidig = binnenkort vorig karakter (altijd handig)
       lees karakter in
  6. Dat afdrukken gebeurt toch wel met een functie verwerkgetal (...)?
  7. Maak geregeld (elk kwartier) een backup van je C++-file, zo nu en dan onder een andere naam!
  8. Zorg ervoor dat je het bovenstaande circa 2 oktober af hebt — of liever eerder!
    ======================================================
  9. 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 (en put's) meer toe! Voorlopig nog niet doen: filenamen kiezen.
  10. Hint: alleen een paar eenvoudige "eigenschappen" zijn nodig, zoals "zit je binnen commentaar?", "hoeveel accolades staan er open?", en later: "wat is de getalswaarde van het getal tot nu toe (vaak 0)?"
  11. Handel eerst het //-commentaar zo eenvoudig mogelijk af. Gebruik het huidige en het vorige karakter. Gaat het goed voor een eenvoudige voorbeeldfile? Tip: dit kost maar een paar regels C++!
  12. En nu de accolades. Houd het kort. De hoofd-while-loop heeft misschien zo'n 30 regels (inclusief de Lychrel-getallen, zie straks).
  13. Doe het Lychrel-gebeuren. Dit heeft eigenlijk niets te maken met het coderen, en kan er eenvoudig bij worden gemaakt. Gebruik de technieken van de punten 4, 5 en 6 hierboven.
    Tip: schrijf een functie die het omgekeerde van het getal x teruggeeft, dus 196 wordt 691. Let op "overflow".
  14. Worden regelovergangen goed afgehandeld?
  15. Binnen de grote while-loop van het file-verwerken staan nu zo'n 30 tot 40 regels.
  16. Zorg ervoor dat je het bovenstaande een week(je) voor de deadline af hebt!
    ======================================================
  17. Gebruik alle testfiles om te controleren of het programma correct werkt.
  18. Laat de gebruiker de namen van in- en uitvoerfile kiezen.
  19. Maak nu de tweede programmeeropgave af. Zijn er duidelijke functies gemaakt — daar had je eerder aan moeten denken!? Heeft main hooguit een regel of tien?
  20. Zie bij het zesde werkcollege hoe het verslag eruit moet zien.

Testfiles

Tip: gebruik eventueel 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 (met markeer-copy-paste) gaan spaties/tabs wellicht fout!):
  1. Zeer eenvoudige invoerfile; en de bijbehorende uitvoerfile, met tab gelijk aan 3. Aantal karakters invoerfile: 67, aantal karakters uitvoerfile 56, getal 60 heeft grootste aantal iteraties (1).
  2. Eenvoudige invoerfile; en de bijbehorende uitvoerfile, met tab gelijk aan 3. Aantal karakters invoerfile: 1007, aantal karakters uitvoerfile 545, getal 196 heeft grootste aantal iteraties (18).
  3. Lastig geval; en de bijbehorende uitvoerfile, met tab gelijk aan 0 (er staan geen accolades en getallen in). De invoerfile heeft 120 karakters, de uitvoerfile heeft er 70.