Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering



Like dokumenter
Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

E K S A M E N. Grunnleggende datakunnskap og programmering 02HIND*, 02HINE*, 02HDMU*, 02HING*, 02HGEOMAA, 02HSIV5

Eksamen. Objekt-orientert programmering KLASSE(R): 02HIND* 02HDMU* 02HINE* 02HING* 01HINGA 02HSIV5 02HGEOMAA

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

Eksamen. Objekt-orientert programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

E K S A M E N. Grunnleggende programmering 03HBIND*, 03HBINFA, 03HBINE*, 03HBMETEA, 03HBMEMAA, 03HBGEOA

Eksamen. Grunnleggende programmering. EKSAMENSDATO: 6.desember 2016 TID: 16:00 20:00. (kalkulator er ikke tillatt)

Kontinuasjonseksamen

Kontinuasjonseksamen

Eksamen. Objekt-orientert programmering 04HBIND*, 04HBINFA, 04HBMETEA

Eksamensoppgave i IMT1082 Objekt-orientert programmering

E K S A M E N. - Kontroller at alle oppgavearkene er tilstede. - Les hele oppgaveteksten nøye, før du begynner å besvare noe som helst.

E K S A M E N. Grunnleggende datakunnskap og programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB / 98HINGA

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

KONTINUASJONSEKSAMEN

KONTINUASJONSEKSAMEN

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

E K S A M E N 96HINDA / 96HINDE (1 AA / AE)

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Eksamen. Objekt-orientert programmering 03HBIND*, 03HBINFA, 03HBMETEA

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

KONTINUASJONSEKSAMEN

Høgskolen i Gjøvik. Eksamen. Objekt-orientert programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB

Eksamen 00HINDA / 00HINDB / 00HINEA 00HDMUA / 00HDMUB

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

Eksamen. Objekt-orientert programmering. EKSAMENSDATO: 25. mai HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB TID: Høgskolen i Gjøvik

E K S A M E N. Grunnleggende datakunnskap og programmering 99HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB / 99HINGA

KONTINUASJONSEKSAMEN

E K S A M E N. Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 5. desember HIND*, 01HINE*, 01HDMU*, 01HING* TID:

Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 16. desember 1997

Eksamen. Objekt-orientert programmering

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

GJØVIK INGENIØRHØGSKOLE

K O N T I N U A S J O N S E K S A M E N

KONTINUASJONSEKSAMEN

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 8. august 1995 TID:

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

KONTINUASJONSEKSAMEN

Grunnleggende datakunnskap, programmering og datastrukturer 97HINDA / 97HINDB / 97HDMUA

Høgskolen i Gjøvik E K S A M E N. FAGLÆRER: Frode Haug KLASSE: 1 AA / AE

E K S A M E N. Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 7. desember HINDA / 00HINDB / 00HINEA 00HDMUA / 00HDMUB / 00HINGA

GJØVIK INGENIØRHØGSKOLE

Kontinuasjonseksamen

Kontinuasjonseksamen

E K S A M E N. Grunnleggende programmering 04HBIND*, 04HBINE*, 04HBINFA, 04HBMETEA, 04HBGEOA. ANTALL SIDER UTLEVERT: 8 (inkludert denne forside)

Eksamen 01HIND* / 01HINE* / 01HDMU*

Kontinuasjonseksamen

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB / 2EA / DESY )

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. 04HBIND* / 04HBINFA / div. andre

KONTINUASJONSEKSAMEN

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

UNIVERSITETET I OSLO

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

KONTINUASJONSEKSAMEN

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

UNIVERSITETET I OSLO

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag E K S A M E N. EKSAMENSDATO: 12. desember 1995 TID:

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Transkript:

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk Eksamen EMNENAVN: EMNENUMMER: Objekt-orientert programmering IMT1082 EKSAMENSDATO: 4. juni 2010 KLASSE(R): 09HBIND*, 09HBPUA, 09HBDRA, 09HBISA, 09HBSPA TID: 09.00-13.00 EMNEANSVARLIG: Frode Haug ANTALL SIDER UTLEVERT: TILLATTE HJELPEMIDLER: 8 (inkludert denne forside) Alle trykte og skrevne. Kontroller at alle oppgavearkene er til stede. Innføring med penn, eventuelt trykkblyant som gir gjennomslag. Pass på så du ikke skriver på mer enn ett innføringsark om gangen (da det blir uleselige gjennomslag når flere ark ligger oppå hverandre). Ved innlevering skilles hvit og gul besvarelse, som legges i hvert sitt omslag. Oppgavetekst, kladd og blå kopi beholder kandidaten til klagefristen er over. Ikke skriv noe av din besvarelse på oppgavearkene. Men, i oppgavetekst der du skal fylle ut svar i tegning/tabell/kurve, skal selvsagt dette innleveres sammen med hvit besvarelse. Husk kandidatnummer på alle ark. Ta vare på dette nummeret til sensuren faller.

NB: Oppgave 1a, 1b, 1c og 2 er totalt uavhengige og kan derfor løses separat. Oppgave 1 (30%) a) Det nedenfor stående programmet var det ønskelig at gav følgende utskrift: Ikaria Bebodd ant.kirker: 29 Samos Bebodd ant.kirker: 41 Chios Bebodd ant.kirker: 66 Nysos Anydros IKKE bebodd ant.kirker: 0 - WHL 1 0 0 1 Men, i koden er det fem feil av typen syntaktiske (som kompilatoren reagerer på) og/eller semantiske (logiske, som gjør at programmet ikke fungerer som ønsket). Hvilke? NB: Tallene helt til venstre på hver linje er ikke en del av koden, men kun ment som linjenummer, slik at du enklere kan henvise til hvor feilene er å finne. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 class Oy { 5 private: 6 char navn[20]; 7 bool bebodd; 8 public: 9 Oy(char*t, bool b) { strcpy(navn, t); bebodd = b; 10 virtual void display() 11 { cout << navn << '\t' << ((!bebodd)? "IKKE b":"b") << "ebodd"; 12 bool operator == (char* t) { return (!strcmp(navn, t)); 13 virtual bool operator <= (int a) = 0; 14 ; 15 class Gresk : public Oy { 16 private: 17 int ant_kirker; 18 public: 19 Gresk(char* t, int k, bool b = false) : Oy(t, b) { ant_kirker = k; 20 virtual void display() 21 { Oy::display(); cout << "\tant.kirker: " << ant_kirker << '\n'; 22 bool operator <= (int ant) { return (ant_kirker <= ant); 23 ; 24 int main() { 25 Oy* oyer[5]; int i; 26 oyer[1] = new Gresk("Ikaria", 29); oyer[2] = new Gresk("Samos", 41); 27 oyer[3] = new Gresk("Chios", 66); 28 oyer[4] = new Gresk("Nysos Anydros", 0, false); 29 oyer[1]->display(); oyer[2]->display(); 30 oyer[2]->display(); oyer[4]->display(); 31 cout << ((*oyer[1] == "Samos")? "WHL" : "-") << " "; 32 cout << ((*oyer[3] == "Chios")? "WHL" : "-") << " "; 33 for (int i = 0; i <= 4; i++) 34 cout << ((int)(oyer[i] <= 40)) << " "; 35 cout << '\n'; 36 return 0; 37 2

b) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> using namespace std; char txt[] = "ARMENISTIS-KOKKARI-EMPORIOS-BAY"; void funk(char* s) { while (*s!= 'A') cout << *s++; void funk(char* s, int a, int b=17, int c=4) { for (int i = a; i < b; i+=c, s+=c ) cout << *s; char* funk(int n) { char* s = &txt[n]; while (*(s-1)!= 'I') s--; return s; int main() { char* t = &txt[11]; funk(t); cout << '\n'; funk(t, 4); cout << '\n'; t = txt; funk(t, 2, 20, 7); cout << '\n'; cout << funk(23) << '\n'; funk(funk(30)); cout << '\n'; return 0; c) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> #include <cstring> using namespace std; class Strand { protected: char navn[30]; int lengde; public: Strand(char* t, int l) { strcpy(navn, t); lengde = l; virtual void display() { cout << navn << ", " << lengde << "m "; virtual bool operator == (char* t) { return (!strcmp(navn, t)); ; class Sand : public Strand { private: char farge[20]; public: Sand(char* t, char* s, int l) : Strand(t, l) { strcpy(farge, s); void display() { Strand::display(); cout << farge << " sand"; virtual bool operator == (int l) { return (lengde == l); virtual bool operator == (char* t) { return (!strcmp(farge, t)); ; int main() { Sand strand1("livadi", "Hvit", 200); Sand* strand2 = new Sand("Karfas", "Gylden", 600); strand1.display(); cout << '\n'; strand2->display(); cout << '\n'; cout << ((strand1 == "Gylden")? "G" : "?") << '\n'; cout << ((*strand2 == 200)? "K" : "L") << '\n'; cout << (!(*strand2 == "Gylden")? "G" : "?") << '\n'; return 0; 3

Oppgave 2 (70%) Les hele teksten for denne oppgaven nøye, før du begynner å besvare noe som helst. Studér vedlegget, som inneholder mange viktige opplysninger som du trenger/skal bruke. Legg spesielt merke til: const ene, de to totalt ferdiglagde(!) klassene, globale variable, main()og de syv etterfølgende og ferdiglagde funksjonene. at i medlemsfunksjonenes kommentarer står det når de brukes/kalles. hvordan skriv_navn( ), hent_maxhg( ) og reduser(, ) brukes av medlemsfunksjoner inni Bestilling. Innledning Din greske venn Dimitri (fra Komopokilos) driver et lite frukt- og grønnsaksfirma som tar i mot bestillinger fra og leverer til et visst antall (max. 20 stk) faste kunder (restauranter/tavernaer). Han har nå bedt deg om å lage et lite program som daglig holder orden på beholdningen han har av sine varer, samt hvilke kunder som har bestilt hva og hvor mye (i kg). Programmet bruker han på en bærbar PC som han har med rundt. Som hans gode venn og Hellas-fan, så har du selvsagt gladelig sagt ja til oppdraget. Datastrukturen Datastrukturen består (som du ser i vedlegget) av en sortert liste (fruksaker) med alle fruktene/ grønnsakene Dimitri totalt har i sitt vareutvalg. Bestillingene fra kundene ligger i FIFO-listene tilpekt av arrayen restauranter, der indeks nr.i er kunde nr.i, Vi bruker her indeksene 1-20. Legg merke til at både en Fruksak (number) og en kunde (indeksen) kun er identifisert vha. et nummer/tall (disse har Dimitri i hodet). Oppgaven a) Skriv innmaten til funksjonen void ny_fruksak() Dimitri blir først bedt om navnet på den nye frukten/grønnsaken. Funksjonen finner så ut om noen Fruksak-objekt allerede har dette navnet (bla gjennom lista inntil evt. navnematch vha. den allerede ferdiglagde == -funksjonen). Om så er tilfelle, kommer en melding. I motsatt fall opprettes en ny Fruksak og legges inn i lista. Denne får automatisk (av koden din) et nytt fruksaknr en høyere enn forrige innlagte frukt/grønnsak. b) Skriv innmaten til funksjonen void totalmengde() Funksjonen går gjennom hele listen fruksaker. For hvert objekt vises/displayes det, og Dimitri blir tilbudt å endre mengden (antall kilo) som er av frukten/grønnsaken på lager. c) Skriv innmaten til funksjonen void leveranse() Dimitri skriver først inn et kundenummer (0-20). Velges 0 (null), så hoppes det bare over resten av funksjonens innmat. Om kunden ikke har noen bestillinger, kommer det en melding. I motsatt fall gås det gjennom alle kundens bestillinger. For hver av dem blir den skrevet på skjermen, og antallet i bestillingen nullstilles. 4

d) Skriv innmaten til funksjonen void bestilling() Dimitri skriver først inn et kundenummer (0-20). Velges 0 (null), så hoppes det bare over resten av funksjonens innmat. Om kunden ikke har noen bestillinger, kommer det en melding. I motsatt fall gås det deretter gjennom alle kundens bestillinger, og Dimitri blir, for hver av dem, tilbudt enten å endre mengden på bestillingen av vedkommende vare eller å slette den. Uansett om listen er tom eller ei, så blir Dimitri til slutt tilbudt å legge inn nye bestillinger (på varer) så lenge han ønsker. For hver nye bestilling må det først spørres om hvilket varenummer det gjelder. Finnes ikke denne varen kommer det en melding, ellers legges en ny bestilling inn i kundens liste. Du skal slippe å sjekke om det i listen allerede ligger bestilling(er) på en vare med samme nummer. Dette oppdages nok neste gang B kjøres, og da kan den bare slettes igjen. NB: Oppgave 2d teller dobbelt så mye som de andre deloppgavene. e) Skriv innmaten til funksjonen void skriv_til_fil() Filen FRUKSAK.DTA har følgende utseende og format (det er en blank mellom hvert felt): 2 <fruksaknr> 1 111.1 Paprika <Varenr> <Mengde> <Navn> 2 222.2 Tomat ------------------ ---------------- 1 2 1 11.1 2 11.2 <Kundenr> <Ant.bestillinger> <Varenr1> <Mengde1> 2 1 2 12.2 --------------------------------- ------------------------------- Funksjonen skal skrive til en slik fil, og bruke den ferdiglagde koden i vedlegget. f) Skriv innmaten til funksjonen void les_fra_fil() Funksjonen leser fra en fil med formatet gitt ovenfor, og bruker den ferdiglagde koden. Annet (klargjørende?): Du skal bruke LISTTOOL ifm. løsningen av denne oppgaven. Dimitri bruker programmet på følgende måte: Tidlig hver morgen (eller sent kvelden før) bruker han kommandoen M. Da legger han inn totalmengden han har av alle varene for neste leveranse til alle kundene. Muligens bruker Dimitri også kommandoen N for å legge inn nye varer i utvalget sitt. Deretter brukes kommandoen B, for å legge inn kundenes bestillinger (for den neste forestående leveransen). Til slutt, og i det han ankommer kunden kjøres kommandolen L. Da får Dimitri en oversikt over hva som skal leveres vedkommende kunde. Ifm dette siste så skal (i oppgave 2C) altså mengden for vedkommende kundes ulike bestillinger nullstilles selve listen skal ikke slettes. Ifm. en kunde så er følgende å bemerke: Kunden er kun identifisert vha. sin indeks i arrayen restauranter. Kun bestillingene lagres, og ikke andre data som f.eks. navn, adresse og telefon. Slutter en kunde, så blir alle vedkommendes bestillinger slettet (vha B ). Kundens indeks i arrayen blir ledig (Dimitri husker dette), og kan tas i bruk av en ny kunde senere. Det skal ikke lages funksjoner som gjør at Dimitri f.eks. kan: slette/fjerne eller endre en Fruksak. Ordet vare brukes i teksten synonymt med frukt/grønnsak. Kunde brukes synonymt med restaurant/taverna. Gjør dine egne forutsetninger og presiseringer av oppgaven, dersom du skulle finne dette nødvendig. Gjør i så fall klart rede for disse i starten av din besvarelse av oppgaven. Lykke til, og god tur til Hellas - i hvert fall for FrodeH 5

Vedlegg: Halvferdig programkode #include <fstream> #include <iostream> #include <iomanip> #include <cstring> #include <cctype> #include <cstdlib> #include "listtool.h" using namespace std; // INCLUDE: // i(f)stream, o(f)stream // cin, cout // setw // strlen, strcpy, strcmp // toupper // atof // "Verktøykasse" for listehåndtering. // CONST: const int STRLEN = 80; // Standard streng-lengde (i array). const int MAXRESTAU = 20; // Max. antall restauranter/kunder. const int MAXKILO = 500; // Max. antall kilo av en frukt/grønnsak. void skriv_meny(); // DEKLARASJON AV FUNKSJONER: char les(const char* t); float les(const char* t, const int MIN, const int MAX); void les(const char t[], char s[], const int LEN); void skriv_navn(int nr); float hent_maxkg(int nr); void reduser(int nr, int mengd); void ny_fruksak(); // Lag innmaten ifm. oppgave 2A void totalmengde(); // Lag innmaten ifm. oppgave 2B void leveranse(); // Lag innmaten ifm. oppgave 2C void bestilling(); // Lag innmaten ifm. oppgave 2D void skriv_til_fil(); // Lag innmaten ifm. oppgave 2E void les_fra_fil(); // Lag innmaten ifm. oppgave 2F // KLASSER M/DEFINISJON AV MEDLEMSFUNKSJONER: class Fruksak : public Num_element { private: // number = fruktens/grønnsakens unike nr/id char* navn; // Navn på frukten/grønnsaken float tot_mengde; // Total mengde tilgjengelig. public: Fruksak(int n, char* nvn) : Num_element(n) { // Initierer data: navn = new char[strlen(nvn)+1]; strcpy(navn, nvn); // Brukes i 2A. tot_mengde = 0.0F; // Leser alt om objektet fra fil: Fruksak(int n, istream* inn) : Num_element(n) { // Brukes i 2F. char nvn[strlen]; *inn >> tot_mengde; (*inn).ignore(); (*inn).getline(nvn, STRLEN); navn = new char[strlen(nvn)+1]; strcpy(navn, nvn); ~Fruksak() { delete [] navn; void display() { // Skriver alle objektets data: cout << setw(8) << number << ": " // Brukes i 2B. << setw(8) << tot_mengde << " kg, " << navn << '\n'; // Skriver kun navnet: void display2() { cout << navn; // Brukes av "skriv_navn". void endre_mengde() { // Endrer totalmengde: Brukes i 2B. tot_mengde = les("nye antall kilo", 0, MAXKILO); // Henter/returnerer totalmengde: float hent_mengde() { return tot_mengde; // Brukes av "hent_maxkg". // Reduserer gjenværende totalmengde. void reduser(int mengd) { tot_mengde -= mengd; // Brukes av "reduser". void skriv_til_fil(ostream* ut) { // Skriver obj. til fil: Brukes i 2E. *ut << number << ' ' << tot_mengde << ' ' << navn << '\n'; ; bool operator == (char* nvn) // Brukes i 2A. { return(!strcmp(navn, nvn)); 6

class Bestilling : public Element { private: int nr; // Bestilling av frukt/grønnsak nr."nr". float mengde; // Bestilt mengde av EN frukt/grønnsak. public: // Initierer data: Bestilling(int n) { nr = n; endre(); // Brukes i 2D. // Leser alt om objektet fra fil: Bestilling(istream* inn) { *inn >> nr >> mengde; // Brukes i 2F. // Skriver objektets data, pluss void display() { // fruktens/grønnsakens navn: Brukes i 2C/2D. cout << "\tvarenr." << setw(3) << nr << setw(8) << mengde << " kg" << " ("; skriv_navn(nr); cout << ")\n"; void nullstill() { mengde = 0.0F; // Brukes i 2C. // Endre bestilling, pluss gjenværende void endre() { // totalmengde av varen: Brukes i 2D. mengde = les("\tmengde ny bestilling", 0, (int) hent_maxkg(nr)); reduser(nr, mengde); void skriv_til_fil(ostream* ut) { // Skriver objektet til fil: *ut << ' ' << nr << ' ' << mengde; // Brukes i 2E. ; // GLOBALE VARIABLE: int fruksaknr = 0; // Autonummerering av ny frukt/grønnsak. List* restauranter[maxrestau+1]; // Lister med restaurantenes bestillinger. List* fruksaker; // Liste med fruktene/grønnsakene. int main() { char valg; // HOVEDPROGRAM: // Brukerens valg/ønske. fruksaker = new List(Sorted); // Initierer alle listene: for (int i = 1; i <= MAXRESTAU; i++) restauranter[i] = new List(FIFO); les_fra_fil(); // Oppgave 2F skriv_meny(); valg = les("\n\nkommando"); while (valg!= 'Q') { switch(valg) { case 'N': ny_fruksak(); break; // Oppgave 2A case 'M': totalmengde(); break; // Oppgave 2B case 'L': leveranse(); break; // Oppgave 2C case 'B': bestilling(); break; // Oppgave 2D default: skriv_meny(); break; valg = les("\n\nkommando"); skriv_til_fil(); cout << "\n\n"; return 0; // Oppgave 2E // **************************************************************************** // ****************** DEFINISJON AV (GLOBALE) FUNKSJONER: ****************** // **************************************************************************** void skriv_meny() { // Skriver alle mulige menyvalg: cout << "\n\nfølgende KOMMANDOER ER TILGJENGELIGE:" << "\n N - Ny frukt/grønnsak" << "\n M - totalmengde av en frukt/grønnsak" << "\n L - Leveranse til en restaurant/kunde" << "\n B - Bestilling fra en restaurant/kunde" << "\n Q - Quit / avslutt"; char les(const char* t) { // Leser og upcaser brukerens valg/ønske: char ch; cout << t << ": "; cin >> ch; cin.ignore(); return (toupper(ch)); float les(const char* t, const int MIN, const int MAX) { 7

char text[strlen]; // Leser en FLOAT mellom MIN og MAX: float n; do { cout << '\t' << t << " (" << MIN << '-' << MAX << "): "; cin.getline(text, STRLEN); n = atof(text); // Leser som tekst - omgjør: while (n < MIN n > MAX); return n; // Leser inn en ikke-blank tekst: void les(const char t[], char s[], const int LEN) { do { cout << '\t' << t << ": "; // Skriver ledetekst. cin.getline(s, LEN); // Leser inn tekst. while (strlen(s) == 0); // Sjekker at tekstlengden er ulik 0. void skriv_navn(int nr) { // Skriver KUN navnet for et gitt Fruksak-nr: Fruksak* fs; // Peker til evt. uttatt objekt. if ((fs = (Fruksak*) fruksaker->remove(nr))!= NULL) { // Finnes: fs->display2(); // Viser Fruksak'en fruksaker->add(fs); // Legger tilbake igjen. // Henter gjenværende totalmengde float hent_maxkg(int nr) { // for et gitt Fruksak-nr: float max = 0.0F; Fruksak* fs; // Peker til evt. utatt objekt. if ((fs = (Fruksak*) fruksaker->remove(nr))!= NULL) { // Finnes: max = fs->hent_mengde(); fruksaker->add(fs); // Legger tilbake igjen. return max; // Reduserer gjenværende totalmengde void reduser(int nr, int mengd) { // for et gitt Fruksak-nr: Fruksak* fs; // Peker til evt. uttatt objekt. if ((fs = (Fruksak*) fruksaker->remove(nr))!= NULL) { // Finnes: fs->reduser(mengd); fruksaker->add(fs); // Legger tilbake igjen. void ny_fruksak() { // Oppgave 2A: Lag innmaten // Oppgave 2A - Helt ny frukt/grønnsak: // Dagens totalmengde for ALLE fruktene/grønnsakene void totalmengde() { // legges inn/registreres: // Oppgave 2B: Lag innmaten void leveranse() { // Oppgave 2C: Lag innmaten void bestilling() { // Oppgave 2D: Lag innmaten void skriv_til_fil() { // Oppgave 2E: Lag innmaten void les_fra_fil() { // Oppgave 2F: Lag innmaten // Leveranse av ALT hos EN kunde: // Dagens bestilling for/av en kunde: // Skriv HELE datastrukturen til fil: // Les HELE datastrukturen fra fil: 8