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



Like dokumenter
Kontinuasjonseksamen

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

Kontinuasjonseksamen

Kontinuasjonseksamen

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

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

Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

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

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

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

Kontinuasjonseksamen

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

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

KONTINUASJONSEKSAMEN

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

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

Eksamensoppgave i IMT1082 Objekt-orientert 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. Eksamen. Objekt-orientert programmering

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

Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

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

Kontinuasjonseksamen

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

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

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

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

Kontinuasjonseksamen

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.

KONTINUASJONSEKSAMEN

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

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

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

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

Kontinuasjonseksamen

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

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

Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 16. desember 1997

GJØVIK INGENIØRHØGSKOLE

KONTINUASJONSEKSAMEN

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

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

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

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

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

KONTINUASJONSEKSAMEN

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

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

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

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:

Kontinuasjonseksamen

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

Kontinuasjonseksamen

KONTINUASJONSEKSAMEN

GJØVIK INGENIØRHØGSKOLE

Kontinuasjonseksamen

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

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

HØGSKOLEN I SØR-TRØNDELAG

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

KONTINUASJONSEKSAMEN

HØGSKOLEN I SØR-TRØNDELAG

KONTINUASJONSEKSAMEN

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

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

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

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

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

UNIVERSITETET I OSLO

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:

KONTINUASJONSEKSAMEN

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

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

Prosjektoppgave. i «IMT Objekt-orientert programmering» våren 2016

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

Transkript:

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk Eksamen EMNENAVN: EMNENUMMER: Objekt-orientert programmering IMT1082 / IMT1182 EKSAMENSDATO: 23. mai 2008 KLASSE(R): 07HBIND*, 07HBPUA, 07HBDRA, 07HBISA, 06HBINE* TID: 09.00-13.00 EMNEANSVARLIG: Frode Haug ANTALL SIDER UTLEVERT: TILLATTE HJELPEMIDLER: 10 (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: Maxi Storsenter Ford Scorpio 2.0 I CL Scorpio Ford 2.0 I CL Storsenter Maxi Stolpe 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 const int LEN = 20; 5 class A { 6 7 char t1[len], t2[len]; 8 9 A(char* t, char* s ) { strcpy(t1, t); strcpy(t2, s); 10 A(A & a) { strcpy(t1, a.t2); strcpy(t2, a.t1); 11 void display() { cout << t1 << ' ' << t2 << ' '; 12 virtual bool operator == (char* t) { return (strcomp(t, t2)); 13 ; 14 class B : public A { 15 16 char t2[len], t3[len]; 17 18 B(char* t, char* s, char* u, char* v) : A(t, s) 19 { strcpy(t2, u); strcpy(t3, v); 20 void display() { A::display(); cout << t2 << ' ' << t3; 21 22 int main() { 23 A ao("maxi", "Storsenter"); 24 B bo("ford", "Scorpio", "2.0 I", "CL"); 25 ao.display(); 26 bo.display(); 27 B bo2 = bo; 28 bo2.display(); 29 A ao2(&ao); 30 ao2.display(); 31 cout << ((ao2 == "Maxi")? "Stolpe" : "Trapp") << '\n'; 32 return 0; 33 2

b) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> #include <cstring> using namespace std; char txt[] = "STEINALDERHILDRINGSTIMEVENTETID"; void funk(int a, int b=10, int c=7) { for (int i = b; i < a+c; ) cout << txt[i++]; char funk(int a, char c) { txt[a%5] = txt[a*2/10] = txt[(a+1)/4] = c; return (txt[a%9]); int main() { char* t = &txt[26]; int n = strlen(txt); for ( ; *t; t++) cout << *t; t = &txt[(n%9)+1]; for ( ; *t!= 'E'; t++) cout << *t; funk(14, 18); funk(6); cout << funk(23, 'X'); return 0; c) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> #include <cstring> using namespace std; const int LEN = 5; class A { char s[len+1]; A(char c) { for (int i=0; i<len; i++) s[i] = c+i+3; s[len] = '\0'; virtual void display() { cout << s << ' '; bool operator!= (char c) { return (s[2]!= c); ; class B : public A { char t[len]; B(char c, char* tt): A(c) { strcpy(t, tt); void display() { A::display(); cout << t << ' '; bool operator!= (char c) { return (t[2]!= c); ; int main() { A* ao = new A('F'); ao->display(); B* bo = new B('R', "MAXI"); bo->display(); A* ao2 = new B('B', "FORD"); ao2->display(); if (*ao!= 'J') cout << '!'; cout << "OK\n"; if (*ao2!= 'R') cout << '!'; cout << "OK\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 alle const ene, de fire klassene (med datamedlemmer og funksjoner), global variabel, main(), de fem ferdiglagde funksjonene (tre stk. les( ), les_klasse() og skriv_dato( )). Legg også merke til alle de ferdiglagde funksjonene inni klassene (destructorer, tre stk. display() og de tre til slutt i Kjoretoy). Bruk alt dette svært aktivt! I denne oppgaven skal du lage et lite program som holder orden på reservering og utleie av ulike kjøretøyer (biler og busser) for et utleiefirma. Datastrukturen Datastrukturen består (som du ser i vedlegget) av kun en enkelt liste. Denne listen inneholder til gjengjeld to ulike typer objekter: Bil og Buss. Begge er subklasser av Kjoretoy. Listen er sortert på registreringsnummer (tekst). Hvert Kjoretoy inneholder en liste med reservasjonene ( Utlaan ) som for øyeblikket er på vedkommende kjøretøy. Alle klasser, det de arver, alle datamedlemmer og alle prototyper for medlemsfunksjoner er komplett og fullstendig deklarert/definert i vedlegget. Din oppgave blir kun å skrive innmaten til en del funksjoner (totalt 20 stk.) inni og utenfor klassene. Oppgaven a) Tegn datastrukturen. Gjør dette detaljert, pent og klart. Skriv innmaten til funksjonen Kategori les_kategori() Brukeren skal velge bil eller buss og funksjonen returnerer med aktuell enum-verdi. b) Skriv innmaten til funksjonene void skriv() og void Utlaan::display() Den første funksjonen får brukeren til å velge kjøretøytype (jfr. funksjonen fra oppgave 2a). Deretter gås det gjennom alle kjøretøyene. De som er av ønsket type (bruk den ferdiglagde = = - funksjonen) skrives ut på skjermen. Tre av display()-funksjonene er jo ferdig laget, du må her altså selv lage den siste som skriver alle utlånets data ut. NB: Datoene er i number lagret på formen ÅÅÅÅMMDD, men skal her skrives ut på formen DD.MM.ÅÅÅÅ. c) Skriv innmaten til funksjonene void nytt() og de tre constructorene i Kjoretoy og dets to subklasser. Den første funksjonen ber om et reg.nr (bruk en relevant les-funksjon). Finnes dette kjøretøyet kommer det en melding. I motsatt fall spørres brukeren om dette er en bil eller buss (jfr. funksjonen fra oppgave 2a). Deretter opprettes aktuelt objekt og legges inn i listen. De tre constructorene skal til sammen sørge for å sette/lese alle relevante data om objektene (bruk les-funksjoner aktivt!). d) Skriv innmaten til funksjonen void hent() Funksjonen ber først om et reg.nr. Finnes ikke dette kjøretøyet, kommer det en melding. I motsatt fall tas kjøretøyet ut av listen. Er det allerede utlånt (bruk ferdiglaget funksjon), kommer det også en melding. Ellers settes det som utlånt (bruk ferdiglaget funksjon), og det skrives/displayes på skjermen før det legges tilbake i listen igjen. 4

e) Skriv innmaten til funksjonene int Utlaan::dager() og de tre virtuelle int faktura()-funksjonene i Kjoretoy og dets to subklasser. Funksjonen void lever() som du her ikke skal lage blir nesten identisk til void hent(). Men, etter at kjøretøyet er satt som ikke-utlånt, og før det legges inn i listen igjen, blir det skrevet ut en faktura for leien/lånet. Dette gjøres vha. de funksjonene du her skal lage. Den første finner ut og returnerer hvor mange dager kjøretøyet har vært lånt ut. For å forenkle litt sier vi at et kjøretøy max. kan være leid ut i 30 dager og max. over ett månedsskifte, samt at alle måneder er på 30 (DAGIMND) dager. Kjoretoy::faktura() tar alltid ut det første utlånet i listen sin. Den får tak i antall dagers utlån (vha. den første funksjonen), skriver dette dagantallet, sletter utlånet og returnerer dagantallet. De to siste virtuelle funksjonene (i subklassene) skriver først BIL / BUSS, samt sine private data, før de tilkaller Kjoretoy::faktura(). Etter at man kommer tilbake fra denne funksjonen skriver de den totale leiekostnaden. For bil er dette: GR_SUM_BIL + (dagstillegg * antall dager lånt), der dagstillegg er: GR_DAG + (KAT_TILLEGG * klassen), der klasse A=1, B=2,.., J=10. For buss er dette: GR_SUM_BUSS + (dagstillegg * antall dager lånt), der dagstillegg er: GR_DAG + BUSS_TILLEGG (her skiller vi ikke på hvor mange passasjerer bussen tar det kan t.o.m. bare være en minibuss!) f) Skriv innmaten til funksjonene void reserver(), void Kjoretoy::reserver() og Utlaan::Utlaan( ) Den første funksjonen spør først om et reg.nr. Melding skrives om dette ikke finnes. Ellers skrives kjøretøyet, det legges inn en reservasjon på det (kaller den andre reserver()), før det til slutt skrives igjen. Kjoretoy::reserver() sørger kun for at det opprettes ett nytt Utlaan-objekt og dette legges inn i dets liste. Constructoren sørger for at alle objektets data settes/leses (bruk les()-funksjoner aktivt!) g) Skriv innmaten til de fem void skriv_til_fil( )-funksjonene. Funksjonene skal til sammen sørge for at hele datastrukturen skrives til filen UTLEIE.DTA. Formatet skal være som angitt i vedlegg 2. (Du skal altså ikke lage les_fra_filfunksjoner!) Annet (klargjørende?): Du skal bruke LISTTOOL ifm. løsningen av denne oppgaven. Det er bl.a foretatt følgende forenklinger ift. et reelt tilfelle: Alle biler har fri kjørelengde og leveres alltid tilbake med full tank, ingen spesielle rabatter og tilbud til enkelte kunder, ikke ekstra kostnader for utvidede forsikringer/barnesete/ekstra fører. Henting/innlevering av kjøretøy stemmer alltid med datoene på 1.utlån i listen. Ikke mulig å bl.a. slette et kjøretøy eller slette/endre en reservasjon. Ingen kontroll på gyldigheten av: reg.nr, dato (20085698 godtas), om reservasjonsdatoen er passert eller at det foretas dobbeltbooking (at fra- og til-datoer for ulike reservasjoner krasjer/overlapper). Bilklasse A-J omhandler slikt som: biltype/-størrelse, bagasjeplass, komfort (A/C), antall dører. 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 - også med leiebilen i sommer! frode_ætt_haugianerne.no 5

Vedlegg 1: Halvferdig programkode #include <iostream> #include <fstream> #include <cstring> #include <cctype> #include <cstdlib> #include "listtool.h" using namespace std; // INCLUDE: // cin, cout // i(f)stream, o(f)stream // strlen, strcpy // toupper // atoi // "Verktøykasse" for listehåndtering. // CONST og ENUM: const int STRLEN = 80; // Max. streng-lengde. const int GR_SUM_BIL = 500; // Fast grunnsum for alle biler. const int GR_SUM_BUSS = 1000; // Fast grunnsum for alle (mini)busser. const int GR_DAG = 100; // Grunntillegg pr.dag (både bil og buss). const int KAT_TILLEGG = 50; // Tillegg pr.dag pr. modellklasse (bil). const int BUSS_TILLEGG = 500; // Fast tillegg pr.dag for buss. const int MINDATO = 20080523; // Første dato det er mulig å reservere fra. const int MAXDATO = 20203012; // Siste dato det er mulig å reservere til. const int DAGIMND = 30; // FAST antall dager i en måned er 30! enum Kategori { bil, buss ; // Objektene er enten 'bil' eller 'buss'. // KLASSER: class Utlaan : public Num_element { // number = fra_dato (leie-/utlånsdato). int til_dato; // Dato det leies/lånes til. char* person_data; // Leiers personalia (navn, adr, tlf,...) // Funksjons-deklarasjoner: Utlaan(int dato); // Lag innmaten ifm. oppgave 2F. ~Utlaan() { delete [] person_data; void display(); // Lag innmaten ifm. oppgave 2B. int dager(); // Lag innmaten ifm. oppgave 2E. void skriv_til_fil(ostream* ut); // Lag innmaten ifm. oppgave 2G. ; class Kjoretoy : public Text_element { // text=regnr (BBTTTTT). Kategori kat; // Kjøretøy-kategori (bil, buss). char* modell; // Modell/type kjøretøy. bool utlaant; // Utlånt for øyeblikket eller ei. List* reservasjoner; // Alle reservasjonene på kjøretøyet. // Funksjons-deklarasjoner: Kjoretoy(char* t, Kategori k); // Lag innmaten ifm. oppgave 2C. ~Kjoretoy() { delete [] modell; delete reservasjoner; virtual void display(); // (Ferdiglaget) virtual int faktura(); // Lag innmaten ifm. oppgave 2E. void reserver(); // Lag innmaten ifm. oppgave 2F. virtual void skriv_til_fil(ostream* ut); // Lag innmaten ifm. oppgave 2G. bool operator == (Kategori k) { return (kat == k); bool utlaant_allerede() { return utlaant; void sett_laan(bool b) { utlaant = b; ; class Bil : public Kjoretoy { char klasse; // Bilklasse (A-J). // Funksjons-deklarasjoner: Bil(char* t); // Lag innmaten ifm. oppgave 2C. virtual void display(); // (Ferdiglaget) virtual int faktura(); // Lag innmaten ifm. oppgave 2E. virtual void skriv_til_fil(ostream* ut); // Lag innmaten ifm. oppgave 2G. ; 6

class Buss : public Kjoretoy { int ant_passasjerer; // Funksjons-deklarasjoner: Buss(char* t); // Lag innmaten ifm. oppgave 2C. virtual void display(); // (Ferdiglaget) virtual int faktura(); // Lag innmaten ifm. oppgave 2E. virtual void skriv_til_fil(ostream* ut); // Lag innmaten ifm. oppgave 2G. ; // DEKLARASJON AV FUNKSJONER: char les(); int les(char* t, const int MIN, const int MAX); void les(const char t[], char s[], const int LEN); char les_klasse(); Kategori les_kategori(); // Lag innmaten ifm. oppgave 2A. void skriv_meny(); void skriv_dato(int d); void skriv(); void nytt(); // Lag innmaten ifm. oppgave 2B og 2C void hent(); void lever(); // Lag innmaten ifm. oppgave 2D (2E = 2D) void reserver(); void skriv_til_fil(); // Lag innmaten ifm. oppgave 2F og 2G List* kartotek; int main() { char valg; // GLOBAL VARIABEL: // HELE datastrukturen - EN liste med ulike objekter. // HOVEDPROGRAM: kartotek = new List(Sorted); skriv_meny(); valg = les(); while (valg!= 'Q') { switch(valg) { case 'D': skriv(); break; // Oppgave 2B case 'N': nytt(); break; // Oppgave 2C case 'H': hent(); break; // Oppgave 2D case 'L': lever(); break; // Oppgave 2E case 'R': reserver(); break; // Oppgave 2F default: skriv_meny(); break; valg = les(); skriv_til_fil(); // Oppgave 2G cout << "\n\n"; return 0; // ****************** DEFINISJON AV MEDLEMS-FUNKSJONER: ****************** // ******************************** UTLAAN: ****************************** Utlaan::Utlaan(int dato) : Num_element(dato) { // Setter/leser alle datamedlemmer: // Oppgave 2F: Lag innmaten void Utlaan::display() { // Oppgave 2B: Lag innmaten int Utlaan::dager() { // Oppgave 2E: Lag innmaten // Skriver ut alle objektets data: // Regner ut antall dager utlånt: void Utlaan::skriv_til_fil(ostream* ut) { // Skriver alle datamedlemmer til fil: // Oppgave 2G: Lag innmaten 7

// ******************************** KJORETOY: ******************************* // Setter/leser alle datamedlemmer: Kjoretoy::Kjoretoy(char* t, Kategori k) : Text_element(t) { // Oppgave 2C: Lag innmaten void Kjoretoy::display() { // Skriver "alle" (ikke 'kat') kjøretøyets data: cout << '\t' << text << " Modell: " << modell << ((!utlaant)? "\tikke ": "\t") << "utlånt" << '\n'; reservasjoner->display_list(); // Alle utlånene skrives. // Lager faktura for det nåværende utlånet. int Kjoretoy::faktura() { // Returnerer antall dager har vært utlånt. // Oppgave 2E: Lag innmaten void Kjoretoy::reserver() { // Oppgave 2F: Lag innmaten // Lager og legger inn et nytt utlån: void Kjoretoy::skriv_til_fil(ostream* ut) { // Skriver alle datamedlemmer til fil: // Oppgave 2G: Lag innmaten // ******************************** BIL: ******************************* Bil::Bil(char* t) : Kjoretoy(t, bil) { // Oppgave 2C: Lag innmaten // Setter/leser alle datamedlemmer: void Bil::display() { // Skriver "alle" bilens data: cout << "\tbil: Klasse " << klasse << '\n'; Kjoretoy::display(); // 'Kjoretoy' gjør det meste av jobben... int Bil::faktura() { // Oppgave 2E: Lag innmaten // Lager faktura for utlånt bil: void Bil::skriv_til_fil(ostream* ut) { // Oppgave 2G: Lag innmaten // Skriver alle datamedlemmer til fil: // ****************************** (MINI)BUSS: ****************************** Buss::Buss(char* t) : Kjoretoy(t, buss) { // Oppgave 2C: Lag innmaten // Setter/leser alle datamedlemmer: void Buss::display() { // Skriver "alle" bussens data: cout << "\tbuss: #Passasjerer: " << ant_passasjerer << '\n'; Kjoretoy::display(); // 'Kjoretoy' gjør det meste av jobben... int Buss::faktura() { // Oppgave 2E: Lag innmaten // Lager faktura for utlånt buss: void Buss::skriv_til_fil(ostream* ut) { // Skriver alle datamedlemmer til fil: // Oppgave 2G: Lag innmaten 8

// ****************** DEFINISJON AV (GLOBALE) FUNKSJONER: ****************** void skriv_meny() { // Skriver alle mulige menyvalg: cout << "\n\nfølgende KOMMANDOER ER TILGJENGELIGE:" << "\n D - skriv/display alle kjøretøy av en viss kategori/type" << "\n N - Nytt kjøretøy" << "\n H - Hente et kjøretøy" << "\n L - Lever et kjøretøy" << "\n R - Reserver et kjøretøy" << "\n Q - Quit / avslutt"; char les() { // Leser og upcaser brukerens valg/ønske: char ch; cout << "\n\nkommando: "; cin >> ch; cin.ignore(); return (toupper(ch)); // Leser et TALL mellom MIN og MAX: int les(char* t, const int MIN, const int MAX) { char text[strlen]; int n; do { cout << '\t' << t << " (" << MIN << '-' << MAX << "): "; cin.getline(text, STRLEN); n = atoi(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. char les_klasse() { // Leser inn en lovlig leiebil-klasse (A-J): char ch; do { cout << "\tbilklasse (A-J): "; cin >> ch; cin.ignore(); ch = toupper(ch); while (ch < 'A' ch > 'J'); return ch; Kategori les_kategori() { // Oppgave 2A: Lag innmaten // Leser Kategori 'bil' eller 'buss': void skriv_dato(int d) { // Gjør om og skriver ÅÅÅÅMMDD til "DD.MM.ÅÅÅÅ": int dag = (d % 100), // Finner/ekstraherer "DD". mnd = ((d / 100) % 100), // Finner/ekstraherer "MM". aar = (d / 10000); // Finner/ekstraherer "ÅÅÅÅ". cout << ((dag < 10)? "0" : "") << dag << '.' // Skriver, evt. med innledende << ((mnd < 10)? "0" : "") << mnd << '.' // '0'foran 'D' og 'M': << aar; void skriv() { // Oppgave 2B: Lag innmaten void nytt() { // Oppgave 2C: Lag innmaten void hent() { // Oppgave 2D: Lag innmaten // Skriv alle biler eller busser: // Nytt kjøretøy: // Et reservert kjøretøy utlånes: 9

void lever() { // Et utlånt kjøretøy innleveres: // Innmaten er "identisk" til "hent" (se rett ovenfor). void reserver() { // Oppgave 2F: Lag innmaten void skriv_til_fil() { // Oppgave 2G: Lag innmaten // Reserver kjøretøy for en periode: // Skriv hele datastrukturen til fil: Vedlegg 2: Eksempel på filen VAREKJOP.DTA (med formatforklaringer til høyre) 2 - Antall kjøretøy I - Bil FS12345 - Reg.nummer Toyota Avensis 2.0 D-4D - Modell + - Utlånt 1 20080101-1.utlåns fra_dato 20080101-1.utlåns til_dato AAA AAAAA AAAAA 1 1111 AAA G - Bilklasse U - Buss JC12345 - Reg.nummer Mercedes Benz Citaro - Modell - - Ikke utlånt 3 20080301-1.utlåns fra_dato 20080303-1.utlåns til_dato CCC CCCCC CCCCC 3 3333 CCC 20080311-2.utlåns fra_dato 20080313-2.utlåns til_dato CCC CCCCC CCCCC 3 3333 CCC CCC 20080321-3.utlåns fra_dato 20080323-3.utlåns til_dato CCC CCCCC CCCCC 3 3333 CCC CCCCC 52 - Antall reservasjoner/utlån - 1.reservatørs person_data - Antall reservasjoner/utlån - 1.reservatørs person_data - 2.reservatørs person_data - 3.reservatørs person_data - Antall passasjerer i bussen 10