-
Notifications
You must be signed in to change notification settings - Fork 0
/
gren.cpp
411 lines (343 loc) · 14.2 KB
/
gren.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
//gren.cpp alex + mats
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <iostream>
#include <cstring>
#include "GREN.H"
#include "OVELSE.H" // fungerer ikke?
#include"FUNKSJONER.H"
#include"GRENER.H"
using namespace std;
extern Grener grenenerObj;
Gren::Gren() // Constructor uten arg.
{
cout << "\nAdvarsel GrenConstructor uten arg, skal ikke brukes\n";
}
Gren::Gren(char * a) : TextElement(a) // Constructor med string argument.
{
char buffer[STRLEN];
int tilEnum;
// leser inn egne datamedlemmer
antOvelser = les("Skriv antall ovelser", 1, MAXOVELSER);
antallRegistrerteOvelser=0;
//lar brukeren vele hva slags maaling denne grenen har
cout << "\nskriv type maaling: "
<< "\n(1) MinSECTidel"
<< "\n(2) MinSecHundredel"
<< "\n(3) MinSekTusendel"
<< "\n(4) PoengX"
<< "\n(5) PoengXX";
tilEnum = les("\nskriv type (1),(2),(3),(4),(5)", 1, 5);
switch (tilEnum) //setter verdien til enumen basert paa inten tilEnum
{
case 1: typeMaaling = MinSECTidel; antSifre = 1; break;
case 2: typeMaaling = MinSecHundredel; antSifre = 2; break;
case 3: typeMaaling = MinSekTusendel; antSifre = 3; break;
case 4: typeMaaling = PoengX; antSifre = 1; break;
case 5: typeMaaling = PoengXX; antSifre = 2; break;
}
les("Skriv inn annet: ", buffer, STRLEN); //les inn informajon til annet
annet = konverter(buffer); // lagre informajonen til i buffer til annet via NEW
}
// Constructor med filargument.
Gren::Gren(ifstream & inn, char * a) : TextElement(a)
{
int tilEnum;
//leser inn egne datamedlemer
annet = lesTxt(inn);
antOvelser = lesInt(inn);
antSifre = lesInt(inn);
antallRegistrerteOvelser = lesInt(inn);
tilEnum = lesInt(inn);
switch (tilEnum)//konverterer int fra fil til enum
{
case 1: typeMaaling = MinSECTidel; break;
case 2: typeMaaling = MinSecHundredel; break;
case 3: typeMaaling = MinSekTusendel; break;
case 4: typeMaaling = PoengX; break;
case 5: typeMaaling = PoengXX; break;
}
if (antallRegistrerteOvelser > 0) //hvis det er registrert noen ovelser i det hele tatt
{
//leser inn ovelser fra fil
for (int i = 1; i <= antallRegistrerteOvelser; i++)
{
array[i]= new Ovelse(inn);
}
}
}
void Gren::endreNavn()// til komado G E
{//sletter exsisterende navn først og så hentes et nytt navn
char buffer[NVLEN];
les("Skriv nytt unikt navn: ", buffer, NVLEN);
delete []text;
text = konverter(buffer);
//grenenerObj.skrivTilFIl();
}
void Gren::display() //til komando G A skriver alle data om denne grenen
{
skriv("\nGrenens navn er: ", text);
skriv("Antall registrerte ovelser er:", antallRegistrerteOvelser);
skriv("Maks antall ovelser: ", antOvelser);
skriv("Annet: ", annet);
if (typeMaaling == MinSECTidel)
{ skriv("Maalingstype er: ","MinSECTidel"); }
if (typeMaaling == MinSecHundredel)
{ skriv("Maalingstype er: ","MinSecHundredel"); }
if (typeMaaling == MinSekTusendel)
{ skriv("Maalingstype er: ","MinSekTusendel"); }
if (typeMaaling == PoengX)
{ skriv("Maalingstype er: ","PoengX"); }
if (typeMaaling == PoengXX)
{ skriv("Maalingstype er: ","PoengXX"); }
}
void Gren::skrivOvelse() // Skriver ut all data for alle ovelser : G S og O A
{
for (int i = 1; i <= antallRegistrerteOvelser; i++)
{ array[i]->skrivHovedData(); } // skal kansjke skrives: *(array+i)->skrivHovedData();
}
//til fil
void Gren::skrivTilFIl(ofstream & ut)
{
//skriver egne datamedlemmer til fil
skriv(ut, text); //navnet
skriv(ut, annet);
skriv(ut, antOvelser);
skriv(ut, antSifre);
skriv(ut, antallRegistrerteOvelser);
//skriver enum til fil som en int mellom 1 til 5
if (typeMaaling == MinSECTidel)
{ skriv(ut, 1); }
if (typeMaaling == MinSecHundredel)
{ skriv(ut, 2); }
if (typeMaaling == MinSekTusendel)
{ skriv(ut, 3); }
if (typeMaaling == PoengX)
{ skriv(ut, 4); }
if (typeMaaling == PoengXX)
{ skriv(ut, 5); }
if (antallRegistrerteOvelser > 0) //hvis det er registrer noen ovelser i det hele tatt
{
//skriver ovelsesobjekter til fil
for (int i = 1; i <= antallRegistrerteOvelser; i++)
{ array[i]->skrivTilFil(ut); }
}
}
void Gren :: skrivGrenNavn() { // Skriver ut navnet på grenen.
cout << text << '\t';
}
int Gren::hentAntalOvelser()
{
return antallRegistrerteOvelser;
}
void Gren::menyValgOvelse() // MainSwitch for Ovelse.
{
char valg;
skrivOvelseMeny();
valg = les("\nOvelser: ");
while (valg != 'Q')
{
switch (valg)
{
case 'N': registrerNyOvelse(); break; // Registrerer en ny Ovelse.
case 'E': endreOvelse(); break; // Endrer informasjon i ne Ovelse.
case 'F': fjernOvelse(); break; // Fjerner en Ovelse.
case 'A': skrivHoveddataOvelser(); break; // Viser hoveddata for alle Ovelser.
case 'L': ovelseDelMeny(); break; // Sender til deltagerListeSwitch.
case 'R': ovelseResMeny(); break; // Sender til resultatListeSwitch.
}
skrivOvelseMeny();
valg = les("\nOvelser: ");
}
}
void Gren::skrivOvelseMeny() // KommandoMeny for Ovelser.
{
cout << "\n\nOVELSEMENY FOR GRENEN: '" << text << "' "
<< "\n\tN - Ny ovelse"
<< "\n\tE - Endre ovelse"
<< "\n\tF - Fjern ovelse"
<< "\n\tA - Skriv ut alle ovelser"
<< "\n\tL - Deltagerliste"
<< "\n\tR - Resultatliste"
<< "\n\tQ - Tilbake til hovedmeny";
}
void Gren::ovelseDelMeny() //finner riktig Ovelses objekt og sender brukeren til riktig meny
{
int buffer, temp;
if (antallRegistrerteOvelser > 0) //hvis det er registrert noen ovelser
{
skrivIdTilRegistrerteOvelser(); //skriver oversik over alle aktulle ovelser
buffer = les("\n\nSkriv inn IDen til ovelsen du onsker a finne", 1000, 9999);
for (int i = 1; i <= antallRegistrerteOvelser; i++) //gaar gjennom hele arrayen
{
temp = array[i]->hentId(); //hvis riktig nummer display meny
if (temp == buffer)
{
array[i]->menyValgDelListe();
}
}
}
else //feilmelding
{ skriv("Ingen ovelser er registrert", ""); }
}
void Gren::ovelseResMeny() //finner riktig Ovelses objekt og sender brukeren til riktig meny
{
int buffer, temp;
if (antallRegistrerteOvelser > 0) //hvis det er registrert noen ovelser
{
skrivIdTilRegistrerteOvelser(); //skriver oversik over alle aktulle ovelser
buffer = les("\n\nSkriv inn IDen til ovelsen du onsker a finne", 1000, 9999);
for (int i = 1; i <= antallRegistrerteOvelser; i++) //gaar gjennom hele arrayen
{
temp = array[i]->hentId();
if (temp == buffer) //hvis riktig nummer display meny
{
array[i]->menyValgResListe();
}
}
}
else //feilmelding
{ skriv("Ingen ovelser er registrert", ""); }
}
void Gren::skrivIdTilRegistrerteOvelser() //skriver oversik over alle aktulle ovelser
{
int temp;
char buffer[NVLEN];
skriv("ID-en til ovelser registrert pa denne gren: ", "");
for (int i = 1; i <= antallRegistrerteOvelser; i++)
{
array[i]->sjekkID(temp, buffer); //henter en ovelses nr og navn
cout << "\n" << temp << ": " << buffer;
}
}
void Gren::skrivListGrenTilFil() //skriv et grenobjekt utenfor listen til fil
{
Gren *ptr;
ptr = this;
grenenerObj.addTilLIst(ptr); //legger dette objektet tilbake i listGren
grenenerObj.skrivTilFIl(); //skriver alt i listGren til fil
grenenerObj.fjernFraList(text); //tar dette objektet ut av listGren
}
void Gren :: registrerNyOvelse() { // Registrerer ny Ovelse. : O N
char buffer[STRLEN];
char *ovelseNavn;
if (antallRegistrerteOvelser < antOvelser ) { // Hvis det er plass i array.
les ("\nNavnet paa ovelsen", buffer, NVLEN); // Leser inn navnet på ovelsen.
if (!finnesOvelse(buffer)) { // Hvis Ovelsen ikke finnes i array:
ovelseNavn = konverter(buffer); // Lager ny char og setter korrekt lengde.
// Lager peker til ny Ovelse på neste ledige indeks,
array[++antallRegistrerteOvelser] = // oppretter Ovelse-objekt, sender med navn og enum,
new Ovelse(ovelseNavn, typeMaaling); // +1 i array-teller.
skrivListGrenTilFil(); //skriv endringer til fil
}
else // Hvis Ovelsen allerede finnes:
cout << "\n\tDet finnes allerede en ovelse med dette navnet";
}
else // Hvis array er full:
cout << "\n\tDet er ikke plass til flere ovelser for denne grenen";
}
void Gren :: endreOvelseMeny() { // Meny for hva som kan endres for en Ovelse.
cout << "\n\nMENY FOR AA ENDRE PAA EN OVELSE:"
<< "\n\tN - Navnet paa ovelsen"
<< "\n\tE - Datoen ovelsen er"
<< "\n\tA - Klokkeslett ovelsen starter"
<< "\n\tQ - Tilbake til Ovelsers meny";
}
void Gren :: endreOvelse() { // Endrer data for en Ovelse. : O E
int indeks;
char valg;
Gren *ptr;
ptr = this;
if (antallRegistrerteOvelser != 0) { // Hvis array med Ovelser ikke er tom:
cout << "\nTilgjengelige ovelser:\n";
skrivUtRegistrerteOvelser(); // Skriver ut nr og navn paa ovelser i array.
indeks = les("\n\nHvilke ovelse vil du endre paa?", 1, antallRegistrerteOvelser);
array[indeks]->skrivHovedData(); // Skriver ut hoveddata for ovelsen.
endreOvelseMeny(); // Skriver ut hvilke valg som kan foretas.
valg = les("\nOvelser/Endre ovelse: ");
while (valg != 'Q') {
switch (valg) {
case 'N' : endreOvelseNavn(indeks); break;
case 'E' : array[indeks]->endreDato(); break;
case 'A' : array[indeks]->endreKlokkeslett(); break;
}
array[indeks]->skrivHovedData(); // Skriver ut hoveddata for ovelsen.
endreOvelseMeny();
valg = les("\nOvelser/Endre ovelse: ");
}
grenenerObj.addTilLIst(ptr); // Legger gren tilbake i liste for å
grenenerObj.skrivTilFIl(); // skrive ut datastruktur.
grenenerObj.fjernFraList(text); // Fjerner fra liste igjen.
}
else
cout << "\n\tDet er ikke registrert noen ovelser for denne grenen";
}
void Gren :: endreOvelseNavn(int indeks) { // Endrer navnet for en Ovelse.
char buffer[NVLEN];
char *navn;
les ("\nNavn paa ovelse", buffer, NVLEN); // Leser inn navnet på ovelsen.
if (!finnesOvelse(buffer)) { // Hvis navnet er unikt:
array[indeks]->endreNavn(buffer); // Setter navn paa ovelse.
}
else
cout << "\n\t" << buffer << " finnes allerede, velg et nytt navn.";
}
void Gren :: fjernOvelse() { // Fjerner en Ovelse. : O F
int indeks;
char valg;
if (antallRegistrerteOvelser != 0) { // Hvis gren har en eller flere ovelser:
cout << "\nTilgjengelige ovelser:\n";
skrivUtRegistrerteOvelser(); // Skriver ut nr og navn paa ovelser i array.
indeks = les("\n\nHvilke ovelse vil du fjerne?", 1, antallRegistrerteOvelser);
cout << "\n\tFjerne '" << array[indeks]->hentNavn() << "' (j/N): ";
valg = les();
if (valg == 'J') { // Sletter ovelsen:
array[indeks]->fjernResultatliste(); // Sletter resultatListen.
array[indeks]->fjernDelListe(); // Sletter deltagerListen.
//delete array[indeks]; // Sletter objektet fra array. Fungerer ikke.
if (indeks < antallRegistrerteOvelser) // Hvis objektet sin indeks er mindre enn siste brukte i array:
array[indeks] = array[antallRegistrerteOvelser]; // Setter den slettede peker til aa peke paa siste.
array[antallRegistrerteOvelser] = nullptr; // Siste indeks brukt peker naa til nullptr.
antallRegistrerteOvelser--; // Teller ned siste brukte indeks.
cout << "\nOvelsen har blitt fjernet";
skrivListGrenTilFil(); // Skriver endringer til fil.
}
else // Hvis ikke 'J' blir valgt over.
cout << "\n\tFjerning av ovelse ble avbrutt av bruker";
}
else
cout << "\n\tDet er ikke registrert noen ovelser for denne grenen";
}
void Gren :: skrivHoveddataOvelser() { // Skriver hoveddata for alle Ovelser. : O A
if (antallRegistrerteOvelser == 0)
cout << "\n\tDet er ikke registrert noen ovelser for denne grenen";
else
skrivOvelse(); // Skriver ut alle ovelser.
}
bool Gren :: finnesOvelse(char* navn) { // Sjekk om Ovelsen finnes i array med param. navn.
char *navnIarray;
navn = konverterTilStore(navn); // Gjør om parameters navn til store bokstaver.
fjernBlankeForanOgBak(navn); // Fjerner blanke.
if (antallRegistrerteOvelser == 0) // Hvis arrayen er tom.
return false;
for (int i = 1; i <= antallRegistrerteOvelser; i++) { // Looper gjennom array.
navnIarray = konverterTilStore(array[i]->hentNavn()); // Gjør om til store bokstaver.
fjernBlankeForanOgBak(navnIarray); // Fjerner blanke.
if (strcmp(navn, navnIarray) == 0) // Hvis medsendt param er lik Ovelses navn.
return true;
else
return false;
}
}
void Gren :: skrivUtRegistrerteOvelser() { // Skriver ut alle registrerte ovelser.
int newLineTeller = 1;
// Looper gjennom array med ovelser.
for (int i = 1; i <= antallRegistrerteOvelser; i++) {
cout << "\tnr " << i; // Skriver ut indeks i array.
array[i]->skrivNavn(); // Skriver ut navnet paa ovelsen.
if (newLineTeller % 2 == 0) // Legger paa linjeskift hvis 6 ovelser
cout << '\n'; // ligger etter hverandre på skjermen.
newLineTeller ++; // Teller opp med en.
}
}