| 1 |
|
---|
| 2 | Beste allemaal,
|
---|
| 3 |
|
---|
| 4 | Bij de tweede programmeeropdracht Datastructuren, najaar 2007 (Implementatie
|
---|
| 5 | en toepassing van de Trie) hebben jullie al een hele beschrijving op papier
|
---|
| 6 | gekregen, de officiele opdrachtspecificatie.
|
---|
| 7 | Voor onderdeel 2A van de opdracht moet je bestanden `trie.cc' en `trie.h'
|
---|
| 8 | maken die de Trie implementeren. Om te kunnen testen of die een beetje doen
|
---|
| 9 | wat je mag verwachten, is er een aantal testbestanden beschikbaar. De werking
|
---|
| 10 | daarvan zullen we hier uitleggen.
|
---|
| 11 | Aan het eind maken we ook nog een paar kleine opmerkingen over onderdeel 2B.
|
---|
| 12 |
|
---|
| 13 | We beseffen dat het een heel verhaal is, net als de opdrachtspecificatie zelf,
|
---|
| 14 | maar het is toch verstandig om het door te lezen. Je kunt er meer tijd mee
|
---|
| 15 | uitsparen dan dat het lezen je kost.
|
---|
| 16 |
|
---|
| 17 | ********************************************************************************
|
---|
| 18 |
|
---|
| 19 | * Er zijn 12 testbestanden voor onderdeel 2A:
|
---|
| 20 | general0.h -> hernoemen tot general.h
|
---|
| 21 | showlist0.h -> hernoemen tot showlist.h
|
---|
| 22 | showlist0.cc -> hernoemen tot showlist.cc
|
---|
| 23 | leestekst0.h -> hernoemen tot leestekst.h
|
---|
| 24 | leestekst0.cc -> hernoemen tot leestekst.cc
|
---|
| 25 | testtrie0.cc -> hernoemen tot testtrie.cc
|
---|
| 26 | Makefile0 -> hernoemen tot Makefile
|
---|
| 27 | test0.dat -> hernoemen tot test.dat
|
---|
| 28 | test1.inv
|
---|
| 29 | test1.con
|
---|
| 30 | test2.inv
|
---|
| 31 | test2.con
|
---|
| 32 | De reden dat we 0-versies in het pakketje hebben gestopt, die jullie dan
|
---|
| 33 | weer moeten hernoemen, is om ongewenste overschrijvingen te voorkomen bij
|
---|
| 34 | het uitpakken van het pakketje. Je weet bijvoorbeeld maar nooit of jullie
|
---|
| 35 | zelf ook al een bestand `testtrie.cc' hebben geschreven.
|
---|
| 36 |
|
---|
| 37 | * Het belangrijkste bestand is `testtrie.cc'
|
---|
| 38 | Dit programma biedt de gebruiker een menu aan waarin de verschillende
|
---|
| 39 | methodes van de Trie aangeroepen kunnen worden. In het testprogramma is
|
---|
| 40 | gekozen voor integers als informatieveld.
|
---|
| 41 |
|
---|
| 42 | * Bij de methode GotoNode is het handig om te weten dat dan naar de knoop
|
---|
| 43 | gegaan wordt die de laatste keer met GetNode verkregen is, tenzij deze
|
---|
| 44 | knoop inmiddels met RemoveChild verwijderd is.
|
---|
| 45 |
|
---|
| 46 | * Naast het aanroepen van de standaard methodes zijn er nog drie andere
|
---|
| 47 | opties in het menu: `Show', `Show (2)' en `Opnieuw beginnen'. Deze laatste
|
---|
| 48 | optie houdt in dat je opnieuw begint met een lege Trie. De andere twee
|
---|
| 49 | opties zullen we wat uitgebreider toelichten.
|
---|
| 50 |
|
---|
| 51 | * Allereerst: in principe doen `Show' en `Show (2)' exact hetzelfde.
|
---|
| 52 | Alleen bij de automatische Test (zie daarover verderop) zijn ze een
|
---|
| 53 | beetje verschillend, maar daar hoeven jullie niet over in te zitten.
|
---|
| 54 |
|
---|
| 55 | * Tijdens het testen van het programma is het prettig als je de Trie die
|
---|
| 56 | je in de loop van de tijd hebt opgebouwd, kunt afbeelden op het scherm.
|
---|
| 57 | Daarvoor is de optie `Show' aanwezig.
|
---|
| 58 | De optie maakt gebruik van een datastructuur die in `showlist.cc' en
|
---|
| 59 | `showlist.h' is ge-implementeerd.
|
---|
| 60 | Om de werking van de optie `Show' te demonstreren, bekijk de volgende
|
---|
| 61 | uitvoer van de methode:
|
---|
| 62 | 0,
|
---|
| 63 | 0,a 1,b 2,c 3,d
|
---|
| 64 | 6,a 4,b 5,a 8*a
|
---|
| 65 | 9,a 7,c
|
---|
| 66 | 10,a
|
---|
| 67 | Op het eerste niveau staat de wortel. Op het volgende niveau staan de
|
---|
| 68 | kinderen van de wortel. In het voorbeeld zijn dit er vier. Bij deze
|
---|
| 69 | kinderen stelt het getal voor de komma de waarde van het infoveld voor,
|
---|
| 70 | het karakter na de komma geeft de tak aan via welke de knoop bereikt kan
|
---|
| 71 | worden, de vader-tak zogezegd.
|
---|
| 72 | Het eerste kind van de wortel heeft dus een infoveld 0 en kan vanuit
|
---|
| 73 | de wortel bereikt worden via de tak `a', het tweede kind heeft een
|
---|
| 74 | infoveld 1 en kan vanuit de wortel bereikt worden via de tak `b',
|
---|
| 75 | enzovoort.
|
---|
| 76 |
|
---|
| 77 | De kinderen van een knoop x0 staan een niveau lager dan x0 zelf.
|
---|
| 78 | Het eerste kind staat onmiddellijk onder x0; het tweede kind staat daar
|
---|
| 79 | rechts van, het derde kind daar weer rechts van, enz. totdat je voorbij
|
---|
| 80 | de broer van x0 loopt. De kinderen van `0,a' zijn dus `6,a' en `4,b'.
|
---|
| 81 | Ofwel van de knoop `0,a' gaan uit: een tak `a' die eindigt in een knoop
|
---|
| 82 | met infoveld 6 en tak `b' die eindigt in een knoop met infoveld 4.
|
---|
| 83 | De knoop `6,a' heeft zelf geen kinderen, maar knoop `4,b' heeft weer
|
---|
| 84 | twee kinderen: `9,a' en `7,c'.
|
---|
| 85 |
|
---|
| 86 | Om het allemaal van de andere kant te bekijken: `10,a' is een kind van
|
---|
| 87 | `9,a', `9,a' is een kind van `4,b', `4,b' is een kind van `0,a' en
|
---|
| 88 | `0,a' is ten slotte een kind van de wortel van de Trie.
|
---|
| 89 |
|
---|
| 90 | Omdat de wortel geen vader-tak heeft, zul je daar na de komma nooit een
|
---|
| 91 | karakter zien staan (d.w.z.: er staat een spatie).
|
---|
| 92 |
|
---|
| 93 | Bij een (1) knoop in de Trie worden infoveld en karakter niet door een
|
---|
| 94 | komma gescheiden, maar door een sterretje `*'. Dit betekent dat deze knoop
|
---|
| 95 | de huidige knoop is, d.w.z.: hier bevindt zich het venster van de Trie.
|
---|
| 96 |
|
---|
| 97 | Niet geheel toevallig komt het gegeven voorbeeld overeen met de Trie in
|
---|
| 98 | Figuur 1 van de opdrachtspecificatie. Alleen de wortel, die in de
|
---|
| 99 | specificatie geen infoveld heeft, heeft hier een infoveld 0.
|
---|
| 100 |
|
---|
| 101 | Uiteraard is deze vorm van presenteren slechts overzichtelijk bij een
|
---|
| 102 | beperkt aantal knopen. Als je te veel knopen hebt, kan een niveau meerdere
|
---|
| 103 | regels beslaan en is het niet meer eenvoudig na te gaan hoe de vader-kind
|
---|
| 104 | relaties lopen.
|
---|
| 105 |
|
---|
| 106 | N.B.: de optie `Show' maakt gebruik van een heleboel methodes van de Trie.
|
---|
| 107 | Het is dus mogelijk dat ze pas werkt als je voor al die methodes een
|
---|
| 108 | fatsoenlijke implementatie hebt.
|
---|
| 109 |
|
---|
| 110 | * `testtrie.cc' maakt gebruik van enkele algemene constantes in `general.h'.
|
---|
| 111 | Desgewenst kun je deze constantes ook in je eigen implementatie van de
|
---|
| 112 | Trie gebruiken.
|
---|
| 113 |
|
---|
| 114 | * Om `testtrie.cc' te compileren is er `Makefile'. Het compileren begint
|
---|
| 115 | met het commando `make'. Vervolgens kun je het testprogramma aanroepen met
|
---|
| 116 | `Test'
|
---|
| 117 |
|
---|
| 118 | * De default is dat je je Trie interactief test. Dat kun je zien in het
|
---|
| 119 | bestand `test.dat', waarin de variabele `InterActief' op 1 staat.
|
---|
| 120 | Het is aan te raden om eerst op deze wijze een tijdje met het
|
---|
| 121 | testprogramma te spelen en de verschillende opties uit te proberen.
|
---|
| 122 |
|
---|
| 123 | * Als je het na een tijdje zat bent om steeds maar weer zelf menukeuzes
|
---|
| 124 | en karakters in te typen, kun je `InterActief' op 0 zetten. Daarmee kies
|
---|
| 125 | je voor een automatische Test.
|
---|
| 126 | Bij de automatische Test wordt de invoer uit een bestand gelezen, in het
|
---|
| 127 | bijzonder uit het bestand dat op de volgende regel staat (in principe is
|
---|
| 128 | dat `test1.inv'). Verder wordt de uitvoer behalve naar het scherm ook voor
|
---|
| 129 | een deel naar een bestand (`test1.uit') geschreven.
|
---|
| 130 | Met behulp van `test1.inv' wordt de Trie uit ons voorbeeld, die uit
|
---|
| 131 | Figuur 1 van de opdrachtspecificatie dus, opgebouwd en afgebeeld.
|
---|
| 132 |
|
---|
| 133 | * Als dan de parameter `Controleren=0', gebeurt er niets met het
|
---|
| 134 | uitvoerbestand `test1.uit'.
|
---|
| 135 |
|
---|
| 136 | * Met `Controleren=1' wordt echter gekeken of het uitvoerbestand gelijk is
|
---|
| 137 | aan het controlebestand `test1.con'. Zo ja, dan wordt er `GELIJK' op
|
---|
| 138 | het scherm afgedrukt. Zo nee, dan wordt aangegeven waar het verschil zit.
|
---|
| 139 |
|
---|
| 140 | * Om de implementatie van de Trie nog wat serieuzer te testen, is er ten
|
---|
| 141 | slotte nog een tweede testinstantie meegegeven, bestaande uit `test2.inv'
|
---|
| 142 | en `test2.con'. Als je in `test.dat' de naam van het invoerbestand even
|
---|
| 143 | aanpast, kun je het testprogramma voor deze instantie draaien.
|
---|
| 144 | Ook dit is echter geen ultieme test. Het kan best zijn je ook bij
|
---|
| 145 | `test2.inv' GELIJK krijgt, terwijl de corrector nog fouten in je code
|
---|
| 146 | ontdekt. Er kunnen bijvoorbeeld instanties zijn waar jullie implementatie
|
---|
| 147 | de mist mee ingaat, en waar we van tevoren niet aan gedacht hebben.
|
---|
| 148 |
|
---|
| 149 | * We raden je aan om niet te snel tot de automatische Test over te gaan.
|
---|
| 150 | Zorg er eerst voor dat je weet wat alle opties in het menu doen.
|
---|
| 151 | Zorg er vervolgens voor dat je begrijpt wat er zoal in `test1.uit'
|
---|
| 152 | geschreven wordt.
|
---|
| 153 | Als je zover bent, is het gemakkelijker om eventuele foutmeldingen te
|
---|
| 154 | begrijpen.
|
---|
| 155 |
|
---|
| 156 | * Overigens: de code van een aantal bestanden is een beetje versleuteld,
|
---|
| 157 | omdat het eigenlijk niet de bedoeling is dat jullie daarin gaan kijken.
|
---|
| 158 | Ze zijn puur bedoeld om te gebruiken.
|
---|
| 159 |
|
---|
| 160 | * In principe zou het testprogramma (en ook de automatische Test) op ieder
|
---|
| 161 | platform moet werken, dus bijvoorbeeld ook met Visual C++.
|
---|
| 162 |
|
---|
| 163 | ********************************************************************************
|
---|
| 164 |
|
---|
| 165 | Om dubbele include-s te voorkomen is het in het algemeen aan te raden om je
|
---|
| 166 | code in `trie.h' en `trie.cc' te omgeven met een `ifndef'-constructie, dus
|
---|
| 167 | iets in de trant van:
|
---|
| 168 | #ifndef TrieHVar
|
---|
| 169 | #define TrieHVar
|
---|
| 170 |
|
---|
| 171 | ... code ...
|
---|
| 172 |
|
---|
| 173 | #endif
|
---|
| 174 |
|
---|
| 175 | ********************************************************************************
|
---|
| 176 |
|
---|
| 177 | Het heeft geen zin om een implementatie van de Trie in te leveren die niet
|
---|
| 178 | door de automatische Test komt. Die krijg je linea recta terug. Vooralsnog
|
---|
| 179 | gaan we er namelijk vanuit dat er geen fouten in de automatische Test zitten.
|
---|
| 180 | Denk je dat er toch fouten in de testprogramma's of de testinstanties zitten,
|
---|
| 181 | dan kun je dit aankaarten bij Robert Brijder.
|
---|
| 182 |
|
---|
| 183 | Wanneer je denkt dat je implementatie van de Trie goed is, kun je haar
|
---|
| 184 | electronisch inleveren bij de corrector, Ruben van Bodegom. In de opdracht-
|
---|
| 185 | specificatie staat aangegeven hoe je dat precies moet / kunt doen.
|
---|
| 186 |
|
---|
| 187 | ********************************************************************************
|
---|
| 188 |
|
---|
| 189 | Het is de bedoeling dat je implementatie van de Trie gebruik maakt van
|
---|
| 190 | templates om verschillende types informatieveld mogelijk te maken.
|
---|
| 191 |
|
---|
| 192 | Een neveneffect daarvan is dat je, bij gebruik van de Trie in een bepaalde
|
---|
| 193 | toepassing (ZLW compressie en decompressie bijvoorbeeld) de complete code
|
---|
| 194 | (`trie.cc' dus) moet includen in je programma van die toepassing.
|
---|
| 195 | Wanneer je gewoon de Trie los compileert naar een bestand `trie.o' en je
|
---|
| 196 | probeert dat te linken met een object bestand waarin variabelen van type
|
---|
| 197 | `Trie<int>' gebruikt worden, krijg je allemaal foutmeldingen.
|
---|
| 198 |
|
---|
| 199 | ********************************************************************************
|
---|
| 200 |
|
---|
| 201 | * Er zijn 2 testbestanden voor onderdeel 2B:
|
---|
| 202 | testzlw.in
|
---|
| 203 | testzlw3.in
|
---|
| 204 | Het eerste bestand is gewoon het voorbeeldbestand uit de opdracht-
|
---|
| 205 | specificatie, het tweede bestand is een iets groter bestand. Na comprimeren
|
---|
| 206 | en decomprimeren van deze bestanden, moet je exact dezelfde bestanden
|
---|
| 207 | weer teruggekregen hebben.
|
---|
| 208 | Uiteraard testen jullie je compressie- en decompressie ook nog met echt
|
---|
| 209 | grote tekstbestanden.
|
---|
| 210 |
|
---|
| 211 | * Wanneer je een origineel bestand vergelijkt met het uiteindelijke bestand,
|
---|
| 212 | is het verstandig om ze niet alleen in een editor te bekijken, maar ook
|
---|
| 213 | even naar de groottes van de beide bestanden te kijken. Sommige verschillen
|
---|
| 214 | (spaties, End-of-Lines) zie je namelijk niet altijd in een editor, terwijl
|
---|
| 215 | ze wel tot uiting kunnen komen in de bestandsgrootte.
|
---|
| 216 |
|
---|