1 |
|
---|
2 | Beste allemaal,
|
---|
3 |
|
---|
4 | Bij de tweede opgave Datastructuren najaar 2005 (implementeer een Fibonacci
|
---|
5 | rij) hebben jullie al een hele beschrijving op papier gekregen. Toch valt er
|
---|
6 | nog meer te zeggen en dat wil ik bij deze doen. Eerst zal ik ingaan op deel A)
|
---|
7 | van de opgave, dan kort op deel B) en ten slotte heb ik nog enkele algemene
|
---|
8 | mededelingen.
|
---|
9 |
|
---|
10 | ********************************************************************************
|
---|
11 | ******
|
---|
12 | 2A: *
|
---|
13 | ******
|
---|
14 | Voor opdracht 2A) krijgen jullie een aantal bestanden cadeau, die het (goed)
|
---|
15 | maken van de opgave moeten vergemakkelijken. Ik zal eerst uitleggen waar deze
|
---|
16 | bestanden voor dienen, vervolgens geef ik nog enkele algemene aanwijzingen
|
---|
17 | voor bij het programmeren.
|
---|
18 |
|
---|
19 | * Voor deel A) van de opgave hoef je alleen bestanden `fiboqueue.cc'
|
---|
20 | en `fiboqueue.h' te maken die de Fibonacci rij implementeren. Om te kunnen
|
---|
21 | testen of die een beetje doen wat je mag verwachten, is een eerste
|
---|
22 | testprogramma `test.cc' bijgeleverd. Jullie wordt aangeraden om ook het
|
---|
23 | commentaar bovenin dat programma te lezen.
|
---|
24 | * Tijdens het testen van het programma is het prettig als je de boom die
|
---|
25 | je in de loop van de tijd hebt opgebouwd kunt afbeelden op het scherm.
|
---|
26 | Daarvoor is een methode `Show' voor de klasse `FiboQueue' geschreven,
|
---|
27 | samen met enkele bijbehorende functies. Deze functies vind je in
|
---|
28 | de bestanden `fiboqueue.cc' en `fiboqueue.h' (dat wil zeggen: ik heb
|
---|
29 | deze bestanden voor de zekerheid maar even `fiboqueue0.cc' en `fiboqueue0.h'
|
---|
30 | genoemd; stel namelijk dat je zelf al met het implementeren van de
|
---|
31 | Fibonacci rij was begonnen in eigen bestanden `fiboqueue.cc' en
|
---|
32 | `fiboqueue.h', dan worden die niet meteen overschreven door mijn bestanden).
|
---|
33 | Het is dus de bedoeling dat je deze functies in je eigen implementatie
|
---|
34 | kopieert.
|
---|
35 | De functies maken gebruik van een datastructuur die in `showlist.cc' en
|
---|
36 | `showlist.h' is ge-implementeerd. Daarom moet je `showlist.h' in je eigen
|
---|
37 | `fiboqueue.h' include-n.
|
---|
38 |
|
---|
39 | Om de werking van de methode `Show' te demonstreren, bekijk de volgende
|
---|
40 | uitvoer:
|
---|
41 | 124 363 225
|
---|
42 | 171 176 308 969 491 274
|
---|
43 | 514 533 698 385
|
---|
44 | 943
|
---|
45 | Deze Fibonacci rij bestaat uit drie bomen, een met wortel 124, een met
|
---|
46 | wortel 363 en een met wortel 225. De wortels staan dus op het bovenste
|
---|
47 | niveau. De eerst genoemde wortel is het minimum van de Fibonacci rij.
|
---|
48 |
|
---|
49 | De kinderen van een knoop x0 staan een niveau lager dan x0 zelf.
|
---|
50 | Het eerste kind staat onmiddellijk onder x0; het tweede kind staat daar
|
---|
51 | rechts van, het derde kind daar weer rechts van, enz. totdat je voorbij
|
---|
52 | de broer van x0 loopt. De kinderen van 124 in ons voorbeeld zijn 171, 176
|
---|
53 | en 308. Knoop 969 is het enige kind van 363. Knoop 225 heeft weer twee
|
---|
54 | kinderen: 491 en 274.
|
---|
55 |
|
---|
56 | Om het allemaal van de andere kant te bekijken: 943 is een kind van 698,
|
---|
57 | 698 is een kind van 308 en 308 is een kind van 124.
|
---|
58 |
|
---|
59 | Uiteraard is deze vorm van presenteren slechts overzichtelijk bij een
|
---|
60 | beperkt aantal knopen. Als je te veel knopen hebt, kan een niveau meerdere
|
---|
61 | regels beslaan en is het niet meer eenvoudig na te gaan hoe de vader-kind
|
---|
62 | relaties lopen.
|
---|
63 | * Om `test.cc' te compileren is er `Makefile1'. Deze moet je even naar
|
---|
64 | `Makefile' copyeren, waarna met het commando `make' het compileren begint.
|
---|
65 | Vervolgens kun je het testprogramma aanroepen met `Test'
|
---|
66 |
|
---|
67 |
|
---|
68 | Door met de bovenstaande programma's te testen, kun je denken dat je
|
---|
69 | implementatie van de Fibonacci rij correct is. Juich echter niet te vroeg.
|
---|
70 | Voordat je de bestanden `fiboqueue.cc' en `fiboqueue.h' inlevert, is het
|
---|
71 | verstandig om ze eerst ook te testen met het tweede testprogramma. Dit kan
|
---|
72 | teleurstellingen voorkomen. Voor de tweede test zijn meegestuurd:
|
---|
73 | * Negen C++ bestanden (`storelist.h', `storelist.cc', `standaard.h',
|
---|
74 | `standaard.cc', `leestekst.h', `leestekst.cc', `communiceer.h',
|
---|
75 | `communiceer.cc' en `test2.cc').
|
---|
76 | * Om deze bestanden samen met je implementatie van de Fibonacci rij te
|
---|
77 | compileren, is er `Makefile2'. Even naar `Makefile' kopieren en je kunt
|
---|
78 | compileren. Ook nu kun je het testprogramma aanroepen met `Test'.
|
---|
79 | /***********/
|
---|
80 | /* LET OP: */
|
---|
81 | /***********/
|
---|
82 | - Om een succesvolle compilering uit te kunnen voeren, moet het veld
|
---|
83 | `Min' van de klasse `FiboQueue' (de wijzer naar de FiboNode met de
|
---|
84 | laagste waarde) publiek gedeclareerd zijn. Dit is weliswaar strijdig
|
---|
85 | met het concept van informatie-verhulling, maar dat moet dan maar.
|
---|
86 | - Verder dient het bestand `fiboqueue.h' omgeven te zijn door een `ifndef'-
|
---|
87 | constructie. Anders wordt het namelijk dubbel ge-include in `test2.cc'
|
---|
88 | en krijg je een foutmelding.
|
---|
89 | Zo'n constructie ziet er als volgt uit
|
---|
90 |
|
---|
91 | ifndef FiboQueueVar
|
---|
92 | #define FiboQueueVar
|
---|
93 |
|
---|
94 | // de normale code
|
---|
95 |
|
---|
96 | #endif
|
---|
97 |
|
---|
98 | Om het jullie gemakkelijk te maken, is met deze twee zaken al rekening
|
---|
99 | gehouden in het meegeleverde bestand `fiboqueue0.h'
|
---|
100 | * Het testprogramma leest enkele parameters uit het bestand `test.dat'.
|
---|
101 | - Als de parameter `InterActief=1', verwacht het programma invoer van de
|
---|
102 | gebruiker. Het is aan te raden om dat eerst een paar keer te proberen.
|
---|
103 | - Met `InterActief=0', wordt de invoer uit een bestand gelezen, in het
|
---|
104 | bijzonder uit het bestand dat op de volgende regel staat (in principe is
|
---|
105 | dat `test1.inv'). In dat geval wordt de uitvoer behalve naar het scherm
|
---|
106 | ook naar een bestand `test1.uit' geschreven.
|
---|
107 | - Als dan de parameter `Controleren=0', gebeurt er niets met dit
|
---|
108 | uitvoerbestand.
|
---|
109 | - Met `Controleren=1' wordt echter gekeken of het uitvoerbestand gelijk is
|
---|
110 | aan het controlebestand `test1.con'. Zo ja, dan wordt er `GELIJK' op
|
---|
111 | het scherm afgedrukt. Zo nee, dan wordt aangegeven waar het verschil zit.
|
---|
112 |
|
---|
113 | Het tweede testprogramma heeft de volgende werking:
|
---|
114 | er worden twee Fibonacci rijen tegelijkertijd bijgehouden. Op ieder moment
|
---|
115 | is een van de twee actief.
|
---|
116 | - Met behulp van `Switch' uit het menu kun je de andere rij actief maken.
|
---|
117 | - De optie `Merge' zorgt ervoor dat de niet-actieve Fibonacci rij bij de
|
---|
118 | actieve Fibonacci rij gevoegd wordt.
|
---|
119 | - Met `Reset' kun je opnieuw beginnen, met twee nieuwe, lege Fibonacci
|
---|
120 | rijen.
|
---|
121 | - Ten slotte is er de optie `Empty'. Die is een beetje listig. In hoofdzaak
|
---|
122 | bestaat die eruit dat de actieve Fibonacci rij element voor element wordt
|
---|
123 | leeggemaakt. Er gebeuren echter ook nog wat andere dingen. Wat precies,
|
---|
124 | dat merk je wel bij het testen.
|
---|
125 |
|
---|
126 |
|
---|
127 | Het is mogelijk dat je implementatie van de Fibonacci rij niet door deze
|
---|
128 | test heenkomt. Wellicht kunnen de volgende aanwijzingen dan nog wat helpen:
|
---|
129 | - houd bij de methodes van de Fibonacci rij die je implementeert rekening met
|
---|
130 | randgevallen. Zo kan een Fibonacci rij waarop of waarmee je een operatie
|
---|
131 | wilt uitvoeren, leeg zijn. In dat geval kun je (bijvoorbeeld) niet zomaar
|
---|
132 | de inhoud van de `Min'-pointer inspecteren.
|
---|
133 | Misschien dat dit door het meegeleverde testprogramma `test.cc' al keurig
|
---|
134 | werd afgevangen, maar van `test2.cc' kan ik dat niet beloven ...
|
---|
135 | - op blz. 3 van de specificatie staat als uitleg bij de methode `Merge':
|
---|
136 | "Verplaatst alle elementen van *Fqptr naar de huidige queue."
|
---|
137 | Dat betekent dus dat de Fibonacci rij aangeduid met Fqptr, leeg wordt.
|
---|
138 | - controleer of je overal waar nodig de velden `Mark' en `Degree' aanpast.
|
---|
139 | Door de fixatie op de pointer structuur van de Fibonacci rij, zou je deze
|
---|
140 | velden namelijk gemakkelijk over het hoofd kunnen zien.
|
---|
141 |
|
---|
142 | Los van de testprogramma's is er nog een andere, veelgemaakte fout.
|
---|
143 | Die bestaat eruit dat je geheugen reserveert met `new', maar dat je het niet
|
---|
144 | (op tijd) weer vrijgeeft met `delete'. Hierdoor zou het geheugen van de
|
---|
145 | computer vol kunnen lopen.
|
---|
146 |
|
---|
147 | Je zult merken dat veel van de meegeleverde programma's enigszins
|
---|
148 | versleuteld zijn. De reden hiervoor is dat het eigenlijk niet de bedoeling
|
---|
149 | is dat je je in die bestanden gaat verdiepen, laat staan dat je ze gaat
|
---|
150 | wijzigen. De uitvoer die de bestanden produceren, zou voldoende moeten zijn.
|
---|
151 |
|
---|
152 | Wanneer je implementatie van de Fibonacci rij de tweede test overleeft,
|
---|
153 | heb je een goede kans dat ie goed is, hoewel ik het niet bij voorbaat wil
|
---|
154 | garanderen. Het is dan wel de moeite om de bestanden `fiboqueue.cc' en
|
---|
155 | `fiboqueue.h' in te leveren. Je kunt dit doen met behulp van het commando:
|
---|
156 |
|
---|
157 | tar cvzf - fiboqueue.cc fiboqueue.h | uuencode opdracht2A.gz |
|
---|
158 | elm -s 'opdracht2A' svhaastr@liacs.nl
|
---|
159 | (dit alles op een regel)
|
---|
160 |
|
---|
161 | Een print van de programma's is niet nodig.
|
---|
162 | Stuur alsjeblieft geen executables of zelfs maar object-bestanden mee !!!!!
|
---|
163 |
|
---|
164 | ********************************************************************************
|
---|
165 | ******
|
---|
166 | 2B: *
|
---|
167 | ******
|
---|
168 |
|
---|
169 | Jullie zullen merken dat jullie oplossing voor deel A) van de opdracht
|
---|
170 | aan hoge eisen moet voldoen, wil die door het tweede testprogramma
|
---|
171 | heenkomen, wat toch wel een vereiste lijkt voor goedkeuring.
|
---|
172 |
|
---|
173 | Bij deel B) zullen we minder streng zijn bij de beoordeling. Hoewel we het
|
---|
174 | leuk zou vinden als jullie oplossing voor deel B) met alle mogelijke
|
---|
175 | invoerbestanden (grafen, die aan de opgegeven specificatie voldoen) rekening
|
---|
176 | houdt, zullen we haar niet afkeuren als ze op een randgeval faalt.
|
---|
177 | Het is echter wel de bedoeling dat jullie het algoritme van Dijkstra op een
|
---|
178 | fatsoenlijk manier implementeren.
|
---|
179 |
|
---|
180 | Bij dit onderdeel krijg je twee hulpbestanden mee:
|
---|
181 | * `fibo.grf', dat een graaf van 500 knopen bevat
|
---|
182 | * `fibo.con', de gewenste uitvoer bij `fibo.grf' (uitgaande van beginknoop 1)
|
---|
183 | Hiermee kun je je implementatie van het algoritme van Dijkstra een beetje
|
---|
184 | testen. Bedenk echter dat de nakijker de beschikking heeft over nog veel
|
---|
185 | meer testinstanties. Dus als je programma de juiste uitvoer geeft voor
|
---|
186 | `fibo.grf', zou het nog best verkeerd kunnen werken voor een andere
|
---|
187 | instantie.
|
---|
188 |
|
---|
189 | In te leveren: alle bestanden die je nodig hebt om het programma te kunnen
|
---|
190 | draaien. Testinstanties zijn echter niet nodig. Zoals gezegd, die hebben we
|
---|
191 | zelf genoeg.
|
---|
192 | Zorg ervoor dat je een directory hebt waarin alle benodigde bestanden staan
|
---|
193 | en ga in deze directory staan. Stel dat je alleen `.cc' en `.h' bestanden
|
---|
194 | en een Makefile nodig hebt, dan kun je met de volgende opdracht alles
|
---|
195 | naar de corrector sturen:
|
---|
196 |
|
---|
197 | tar cvzf - *.cc *.h Makefile | uuencode opdracht2B.gz |
|
---|
198 | elm -s 'opdracht2B' svhaastr@liacs.nl
|
---|
199 |
|
---|
200 | Ook nu is een print van de programma's niet nodig en stuur ook nu geen
|
---|
201 | executables en object-bestanden mee !!!
|
---|
202 |
|
---|
203 | ********************************************************************************
|
---|
204 |
|
---|
205 | Ten slotte: niemand is verplicht de opdrachten op de universiteit te maken.
|
---|
206 | Het is echter wel de bedoeling dat jullie oplossingen gecompileerd kunnen
|
---|
207 | worden (en werken) met g++ op de `beast' of op een Linux-pc in de
|
---|
208 | computerzalen beneden. Dan hoeft de nakijker niet eerst het meest geschikte
|
---|
209 | C++ platform uit te zoeken.
|
---|
210 | Daarom, voordat jullie iets inleveren, kijk even of het hier op de `beast'
|
---|
211 | of op een Linux-pc net zo goed werkt als (eventueel) thuis.
|
---|
212 |
|
---|
213 | Omdat opdracht 2B) voortbouwt op 2A) is het aan te raden om eerst 2A)
|
---|
214 | netjes af te ronden en in te leveren (als je denkt dat ie goed is) en
|
---|
215 | dan pas aan 2B) te beginnen. Als er namelijk fouten in de implementatie
|
---|
216 | van de kale Fibonacci rij zitten, hoef je die niet dubbel te verbeteren.
|
---|
217 |
|
---|
218 | ********************************************************************************
|
---|
219 |
|
---|
220 | Mochten jullie na deze uitleg nog vragen hebben, dan kun je die uiteraard
|
---|
221 | altijd stellen. Voor vragen over de bedoeling van de opdracht (of over deze
|
---|
222 | uitleg zelf), kun je je wenden tot mij, Robert Brijder (kamer 156a,
|
---|
223 | telefoonnummer 071-527 7143, rbrijder@liacs.nl). Voor vragen over je eigen
|
---|
224 | programma, kun je je wenden tot Sven van Haastregt.
|
---|
225 |
|
---|
226 | Succes
|
---|
227 |
|
---|
228 | Robert Brijder
|
---|
229 |
|
---|