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:
-
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.
-
Tel het aantal karakters in de file. Tel hierbij
de regelovergangen (LineFeed: '\n') ook apart.
-
Laat alle cijfers uit de file op het beeldscherm afdrukken.
- Maak geregeld (elk kwartier)
een backup van je C++-file, steeds onder een andere naam!
-
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.
-
Zorg ervoor dat je het bovenstaande rond 25 september al af hebt!
======================================================
-
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.
- 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
- 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.
-
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 ...)
- Wordt bij een regelovergang de buffer netjes afgewerkt?
-
Maak de statistiekjes in orde.
-
Zorg ervoor dat je het bovenstaande rond 2 oktober al af hebt!
======================================================
-
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.
- 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
-
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.
- 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).
- Maak delen door 0 "in orde".
- En worden breuken als 4/1 netjes afgedrukt (namelijk als 4)?
-
Gebruik alle
testfiles
om te controleren
of het programma correct werkt.
-
Werkt het programma tussen de door de gebruiker
aangegeven grenzen (beginregel/eindregel)?
NB Gebruik geen for-loop!
-
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.
-
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 ;-)
- Zie bij het
zesde werkcollege hoe het verslag eruit moet zien.
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!):
- Met de invoerfile
42ina.txt
krijg je deze
scherm-uitvoer,
en deze uitvoerfile:
42uita.txt
(hele file behandeld).
- Met de invoerfile
42inb.txt
krijg je deze
scherm-uitvoer,
en deze uitvoerfile:
42uitb.txt
(hele file behandeld).
- 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.
Vragen en/of opmerkingen kunnen worden gestuurd
naar: kosters@liacs.nl.
21 september 2009 — http://www.liacs.nl/home/kosters/pm/pmwc5.html