source: liacs/da/fibo_queue/examples/readme05.txt@ 52

Last change on this file since 52 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: 11.3 KB
RevLine 
[2]1
2Beste allemaal,
3
4Bij de tweede opgave Datastructuren najaar 2005 (implementeer een Fibonacci
5rij) hebben jullie al een hele beschrijving op papier gekregen. Toch valt er
6nog meer te zeggen en dat wil ik bij deze doen. Eerst zal ik ingaan op deel A)
7van de opgave, dan kort op deel B) en ten slotte heb ik nog enkele algemene
8mededelingen.
9
10********************************************************************************
11******
122A: *
13******
14Voor opdracht 2A) krijgen jullie een aantal bestanden cadeau, die het (goed)
15maken van de opgave moeten vergemakkelijken. Ik zal eerst uitleggen waar deze
16bestanden voor dienen, vervolgens geef ik nog enkele algemene aanwijzingen
17voor 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
68Door met de bovenstaande programma's te testen, kun je denken dat je
69implementatie van de Fibonacci rij correct is. Juich echter niet te vroeg.
70Voordat je de bestanden `fiboqueue.cc' en `fiboqueue.h' inlevert, is het
71verstandig om ze eerst ook te testen met het tweede testprogramma. Dit kan
72teleurstellingen 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
113Het 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
127Het is mogelijk dat je implementatie van de Fibonacci rij niet door deze
128test 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
142Los van de testprogramma's is er nog een andere, veelgemaakte fout.
143Die 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
145computer vol kunnen lopen.
146
147Je zult merken dat veel van de meegeleverde programma's enigszins
148versleuteld zijn. De reden hiervoor is dat het eigenlijk niet de bedoeling
149is dat je je in die bestanden gaat verdiepen, laat staan dat je ze gaat
150wijzigen. De uitvoer die de bestanden produceren, zou voldoende moeten zijn.
151
152Wanneer je implementatie van de Fibonacci rij de tweede test overleeft,
153heb je een goede kans dat ie goed is, hoewel ik het niet bij voorbaat wil
154garanderen. 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
157tar cvzf - fiboqueue.cc fiboqueue.h | uuencode opdracht2A.gz |
158 elm -s 'opdracht2A' svhaastr@liacs.nl
159(dit alles op een regel)
160
161Een print van de programma's is niet nodig.
162Stuur alsjeblieft geen executables of zelfs maar object-bestanden mee !!!!!
163
164********************************************************************************
165******
1662B: *
167******
168
169Jullie zullen merken dat jullie oplossing voor deel A) van de opdracht
170aan hoge eisen moet voldoen, wil die door het tweede testprogramma
171heenkomen, wat toch wel een vereiste lijkt voor goedkeuring.
172
173Bij deel B) zullen we minder streng zijn bij de beoordeling. Hoewel we het
174leuk zou vinden als jullie oplossing voor deel B) met alle mogelijke
175invoerbestanden (grafen, die aan de opgegeven specificatie voldoen) rekening
176houdt, zullen we haar niet afkeuren als ze op een randgeval faalt.
177Het is echter wel de bedoeling dat jullie het algoritme van Dijkstra op een
178fatsoenlijk manier implementeren.
179
180Bij 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)
183Hiermee kun je je implementatie van het algoritme van Dijkstra een beetje
184testen. Bedenk echter dat de nakijker de beschikking heeft over nog veel
185meer testinstanties. Dus als je programma de juiste uitvoer geeft voor
186`fibo.grf', zou het nog best verkeerd kunnen werken voor een andere
187instantie.
188
189In te leveren: alle bestanden die je nodig hebt om het programma te kunnen
190draaien. Testinstanties zijn echter niet nodig. Zoals gezegd, die hebben we
191zelf genoeg.
192Zorg ervoor dat je een directory hebt waarin alle benodigde bestanden staan
193en ga in deze directory staan. Stel dat je alleen `.cc' en `.h' bestanden
194en een Makefile nodig hebt, dan kun je met de volgende opdracht alles
195naar de corrector sturen:
196
197tar cvzf - *.cc *.h Makefile | uuencode opdracht2B.gz |
198 elm -s 'opdracht2B' svhaastr@liacs.nl
199
200Ook nu is een print van de programma's niet nodig en stuur ook nu geen
201executables en object-bestanden mee !!!
202
203********************************************************************************
204
205Ten slotte: niemand is verplicht de opdrachten op de universiteit te maken.
206Het is echter wel de bedoeling dat jullie oplossingen gecompileerd kunnen
207worden (en werken) met g++ op de `beast' of op een Linux-pc in de
208computerzalen beneden. Dan hoeft de nakijker niet eerst het meest geschikte
209C++ platform uit te zoeken.
210Daarom, voordat jullie iets inleveren, kijk even of het hier op de `beast'
211of op een Linux-pc net zo goed werkt als (eventueel) thuis.
212
213Omdat opdracht 2B) voortbouwt op 2A) is het aan te raden om eerst 2A)
214netjes af te ronden en in te leveren (als je denkt dat ie goed is) en
215dan pas aan 2B) te beginnen. Als er namelijk fouten in de implementatie
216van de kale Fibonacci rij zitten, hoef je die niet dubbel te verbeteren.
217
218********************************************************************************
219
220Mochten jullie na deze uitleg nog vragen hebben, dan kun je die uiteraard
221altijd stellen. Voor vragen over de bedoeling van de opdracht (of over deze
222uitleg zelf), kun je je wenden tot mij, Robert Brijder (kamer 156a,
223telefoonnummer 071-527 7143, rbrijder@liacs.nl). Voor vragen over je eigen
224programma, kun je je wenden tot Sven van Haastregt.
225
226Succes
227
228 Robert Brijder
229
Note: See TracBrowser for help on using the repository browser.