source: liacs/da/opdr2a/README@ 329

Last change on this file since 329 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

File size: 10.3 KB
RevLine 
[2]1
2Beste allemaal,
3
4Bij de tweede programmeeropdracht Datastructuren, najaar 2007 (Implementatie
5en toepassing van de Trie) hebben jullie al een hele beschrijving op papier
6gekregen, de officiele opdrachtspecificatie.
7Voor onderdeel 2A van de opdracht moet je bestanden `trie.cc' en `trie.h'
8maken die de Trie implementeren. Om te kunnen testen of die een beetje doen
9wat je mag verwachten, is er een aantal testbestanden beschikbaar. De werking
10daarvan zullen we hier uitleggen.
11Aan het eind maken we ook nog een paar kleine opmerkingen over onderdeel 2B.
12
13We beseffen dat het een heel verhaal is, net als de opdrachtspecificatie zelf,
14maar het is toch verstandig om het door te lezen. Je kunt er meer tijd mee
15uitsparen 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
165Om dubbele include-s te voorkomen is het in het algemeen aan te raden om je
166code in `trie.h' en `trie.cc' te omgeven met een `ifndef'-constructie, dus
167iets in de trant van:
168 #ifndef TrieHVar
169 #define TrieHVar
170
171 ... code ...
172
173 #endif
174
175********************************************************************************
176
177Het heeft geen zin om een implementatie van de Trie in te leveren die niet
178door de automatische Test komt. Die krijg je linea recta terug. Vooralsnog
179gaan we er namelijk vanuit dat er geen fouten in de automatische Test zitten.
180Denk je dat er toch fouten in de testprogramma's of de testinstanties zitten,
181dan kun je dit aankaarten bij Robert Brijder.
182
183Wanneer je denkt dat je implementatie van de Trie goed is, kun je haar
184electronisch inleveren bij de corrector, Ruben van Bodegom. In de opdracht-
185specificatie staat aangegeven hoe je dat precies moet / kunt doen.
186
187********************************************************************************
188
189Het is de bedoeling dat je implementatie van de Trie gebruik maakt van
190templates om verschillende types informatieveld mogelijk te maken.
191
192Een neveneffect daarvan is dat je, bij gebruik van de Trie in een bepaalde
193toepassing (ZLW compressie en decompressie bijvoorbeeld) de complete code
194(`trie.cc' dus) moet includen in je programma van die toepassing.
195Wanneer je gewoon de Trie los compileert naar een bestand `trie.o' en je
196probeert 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
Note: See TracBrowser for help on using the repository browser.