source: liacs/da/fibo_queue/test.cc@ 9

Last change on this file since 9 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)

  • Property svn:executable set to *
File size: 8.6 KB
Line 
1// Dit programma biedt de gebruiker een menustructuur om met Fibonacci rijen
2// te werken. Het dient om de oplossingen van onderdeel A van de tweede
3// opgave Datastructuren, najaar 2005, enigszins uit te proberen.
4//
5// Het is echter geen ultieme correctheidstest. Zo laat dit programma niet
6// toe dat een getal meerdere malen in de Fibonacci rij voorkomt, terwijl dat
7// in principe wel mogelijk is.
8//
9// Bij het toevoegen van getallen heeft de gebruiker de gelegenheid om deze
10// getallen random te laten generen. Zo kan hij/zij lekker snel een grote
11// Fibonacci rij creeren.
12// Tevens bevat het programma de mogelijkheid om de Fibonacci rij op het
13// scherm af te beelden. Dit is een aparte optie in de menustructuur en wordt
14// niet automatisch na iedere operatie op de Fibonacci rij uitgevoerd. De
15// reden hiervoor is dat dit in het geval van een volle Fibonacci rij zoveel
16// regels op het beeldscherm zou kosten, dat eventuele foutmeldingen van het
17// scherm af zouden schieten.
18// Overigens heeft het sowieso niet zo heel veel zin om deze afbeeldfunctie
19// voor een volle Fibonacci rij aan te roepen, omdat de breedte van een
20// venster (window) op een beeldscherm toch al gauw te klein is om alle
21// getallen en spaties te bevatten die naast elkaar afgedrukt dienen te worden.
22
23// Indien je meer toelichting nodig hebt over de opdracht of over de werking
24// van dit programma, kom dan langs bij Robert Brijder, kamer 143.
25// Ook als je fouten of inconsistenties (afgezien van de keuze voor Engels,
26// respectievelijk Nederlands) in de code of het commentaar ontdekt, houdt
27// Robert zich van harte aanbevolen.
28
29// Heb je vragen over je eigen programma, wend je dan tot Sven van Haastregt:
30// svhaastr@liacs.nl
31
32
33#include <iostream>
34#include <cstdlib> // om random getallen te kunnen genereren
35using namespace std;
36#include "fiboqueue.h"
37#define MaxWaarde 999
38
39int RandomRij [MaxWaarde+1], // een rij randomgetallen
40 RandomPositie [MaxWaarde+1], // de positie van een getal in `RandomRij'
41 RandomN; // het aantal getallen dat nog in de randomrij staat
42FiboNode *KnoopMetWaarde [MaxWaarde+1]; // een rij met pointers naar getallen
43 // in de Fibonacci rij
44
45//****************************************************************************
46
47void InitRijen ()
48 // initialiseer de rij van random getallen
49 // en die van pointers naar knopen in de Fibonacci rij
50{ QValueTp Waarde;
51
52 RandomN = MaxWaarde;
53 for (Waarde=1;Waarde<=RandomN;Waarde++)
54 { RandomRij [Waarde] = Waarde;
55 RandomPositie [Waarde] = Waarde;
56 }
57
58 for (Waarde=1;Waarde<=MaxWaarde;Waarde++)
59 KnoopMetWaarde[Waarde] = NULL;
60
61} // InitRijen
62
63//****************************************************************************
64
65void GenereerRandomGetallen (FiboQueue *q, int N)
66 // genereer `N' random getallen en voeg die toe aan de Fibonacci rij
67{ int i,
68 r, p;
69 float fr;
70 QValueTp Waarde,
71 Hulp;
72
73 for (i=1;i<=N;i++)
74 { // bepaal een random getal p tussen 1 en RandomN
75 r = rand ();
76 fr = ((float) r)/(((float) RAND_MAX)+1.0);
77 // bij gewoon `RAND_MAX + 1' zou je over MAXINT heen kunnen lopen
78 // en aldus een negatief getal krijgen
79 fr *= RandomN;
80 p = (int) fr+1;
81
82 // we pakken nu het p-de random getal uit `RandomRij'
83 Waarde = RandomRij [p];
84 Hulp = RandomRij [RandomN];
85 RandomRij [p] = Hulp;
86 RandomPositie [Hulp] = p;
87 RandomN --;
88 KnoopMetWaarde [Waarde] = q -> Insert (Waarde);
89 } // for
90
91} // GenereerRandomGetallen
92
93//****************************************************************************
94
95void VoerGetallenIn (FiboQueue *q, int N)
96 // voer met de hand `N' getallen in in de Fibonacci rij
97{ int i,
98 p;
99 QValueTp Waarde,
100 Hulp;
101
102 for (i=1;i<=N;i++)
103 { cout << "Geef een waarde voor de " << i << "-e in te voeren knoop,\n";
104 cout << " minimaal 1, maximaal " << MaxWaarde << " : ";
105 cin >> Waarde;
106 if ((Waarde < 1) || (Waarde > MaxWaarde))
107 cout << "Verkeerde waarde.\n";
108 else
109 if (KnoopMetWaarde [Waarde] != NULL)
110 { cout << "Sorry, deze waarde stond al in de rij.\n";
111 cout << "Ze is dus niet nog een keer ingevoegd.\n";
112 }
113 else
114 { // haal `Waarde' uit `RandomRij' en voeg haar toe aan de Fibonacci rij
115 p = RandomPositie [Waarde];
116 Hulp = RandomRij [RandomN];
117 RandomRij [p] = Hulp;
118 RandomPositie [Hulp] = p;
119 RandomN --;
120 KnoopMetWaarde [Waarde] = q -> Insert (Waarde);
121 }
122 } // for
123
124} // VoerGetallenIn
125
126//****************************************************************************
127
128void VerwerkKeuze1 (FiboQueue *q)
129 // geef de gebruiker de gelegenheid om een of meer waardes
130 // in de Fibonacci rij in te voegen (Insert)
131{ int N;
132 char Keuze = 'j';
133
134 cout << "Hoeveel knopen wilt u invoeren, nog maximaal " << RandomN << " mogelijk : ";
135 cin >> N;
136
137 if ((N<0) || (N>RandomN))
138 cout << "Verkeerd aantal.\n";
139 else
140 if (N>=1)
141 { cout << "U kunt de waarde(s) zelf invoeren, of u kunt ze random laten genereren.\n";
142 cout << "Wilt u ze zelf invoeren, j/n : ";
143 cin >> Keuze;
144 if ((Keuze=='n') || (Keuze=='N'))
145 GenereerRandomGetallen (q, N);
146 else
147 VoerGetallenIn (q, N);
148 }
149
150} // VerwerkKeuze1
151
152//****************************************************************************
153
154void VerwerkKeuze2 (FiboQueue *q)
155 // verwijder het minimum uit de Fibonacci rij en laat de gebruiker weten
156 // welke waarde dit was (DeleteMin)
157{ QValueTp Waarde;
158
159 if (! q -> IsEmpty())
160 { Waarde = q -> DeleteMin ();
161 KnoopMetWaarde [Waarde] = NULL;
162 // we mogen `Waarde' een volgende keer weer invoeren ->
163 // voeg haar toe aan `RandomRij'
164 RandomN ++;
165 RandomRij [RandomN] = Waarde;
166 RandomPositie [Waarde] = RandomN;
167 cout << "We hebben de (minimale) waarde " << Waarde <<
168 " uit de Fibonacci rij gehaald.\n";
169 }
170 else
171 cout << "De Fibonacci rij was al leeg.\n";
172
173} // VerwerkKeuze2
174
175//****************************************************************************
176
177void VerwerkKeuze3 (FiboQueue *q)
178 // geef de gebruiker de gelegenheid om een waarde in de Fibonacci rij
179 // te verlagen (Decrease)
180{ QValueTp OudeWaarde,
181 NieuweWaarde;
182 int p;
183
184 cout << "Geef de oude waarde van de knoop die u wilt verlagen : ";
185 cin >> OudeWaarde;
186 if ((OudeWaarde <= 1) || (OudeWaarde > MaxWaarde))
187 cout << "Verkeerde waarde.\n";
188 else
189 if (KnoopMetWaarde[OudeWaarde] == NULL)
190 { cout << "Deze waarde stond nog niet in de Fibonacci rij.\n";
191 cout << "We kunnen haar dus zeker niet verlagen.\n";
192 }
193 else
194 { cout << "Geef een nieuwe waarde voor deze knoop,\n";
195 cout << " minimaal 1, maximaal " << OudeWaarde-1 << " : ";
196 cin >> NieuweWaarde;
197 if ((NieuweWaarde < 1) || (NieuweWaarde >= OudeWaarde))
198 cout << "Verkeerde waarde.\n";
199 else
200 if (KnoopMetWaarde [NieuweWaarde] != NULL)
201 { cout << "Sorry, deze waarde stond al in de rij.\n";
202 cout << "We hebben de oude waarde dus niet verlaagd.\n";
203 }
204 else
205 { q -> Decrease (KnoopMetWaarde[OudeWaarde], NieuweWaarde);
206 KnoopMetWaarde [NieuweWaarde] = KnoopMetWaarde [OudeWaarde];
207 KnoopMetWaarde [OudeWaarde] = NULL;
208 // vervang `NieuweWaarde' in `RandomRij' door `OudeWaarde'
209 p = RandomPositie [NieuweWaarde];
210 RandomRij [p] = OudeWaarde;
211 RandomPositie [OudeWaarde] = p;
212 }
213 } // else: OudeWaarde OK
214
215} // VerwerkKeuze3
216
217//****************************************************************************
218
219void VerwerkKeuze4 (FiboQueue *q)
220 // geef de gebruiker de gelegenheid om een waarde uit de Fibonacci rij
221 // te verwijderen (Delete)
222{
223
224 cout << "Helaas ... deze methode hoeft niet ge-implementeerd te worden\n";
225
226} // VerwerkKeuze4
227
228//****************************************************************************
229
230int main ()
231{ int Keuze;
232 FiboQueue *q;
233
234 InitRijen ();
235 q = new FiboQueue;
236
237 do
238 { cout << '\n';
239 cout << "0. Stop\n1. Insert\n2. DeleteMin\n3. Decrease\n4. Delete\n5. Show\n";
240 cout << "Maak een keuze : ";
241 cin >> Keuze;
242 cout << '\n';
243 switch (Keuze)
244 { case 1: VerwerkKeuze1 (q);
245 break;
246 case 2: VerwerkKeuze2 (q);
247 break;
248 case 3: VerwerkKeuze3 (q);
249 break;
250 case 4: VerwerkKeuze4 (q);
251 break;
252 case 5: q -> Show ();
253 break;
254 case 0: break;
255 default: cout << "Verkeerde invoer. Probeer het nog eens.\n";
256 }
257 } while (Keuze != 0);
258
259 delete q; // deze instructie is expliciet nodig om
260 // de destructor aan het werk te zetten (getest)
261
262 return 0;
263
264}
265
Note: See TracBrowser for help on using the repository browser.