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

Last change on this file since 365 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
RevLine 
[2]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.