Kontinuasjonseksamen



Like dokumenter
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

Kontinuasjonseksamen

Kontinuasjonseksamen

KONTINUASJONSEKSAMEN

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

Kontinuasjonseksamen

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

Kontinuasjonseksamen

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

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

Kontinuasjonseksamen

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

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

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

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

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Eksamen. Objekt-orientert programmering

KONTINUASJONSEKSAMEN

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

Kontinuasjonseksamen

Kontinuasjonseksamen

Høgskolen i Gjøvik Institutt 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

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 Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

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

Kontinuasjonseksamen

Eksamensoppgave i IMT1082 Objekt-orientert programmering

KONTINUASJONSEKSAMEN

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

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Eksamen. Objekt-orientert programmering

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 informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

KONTINUASJONSEKSAMEN

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

Kontinuasjonseksamen

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. Eksamen. Objekt-orientert programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB

KONTINUASJONSEKSAMEN

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

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

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

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

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

GJØVIK INGENIØRHØGSKOLE

Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 16. desember 1997

Kontinuasjonseksamen

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

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

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

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

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 E K S A M E N. FAGLÆRER: Frode Haug KLASSE: 1 AA / AE

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 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

GJØVIK INGENIØRHØGSKOLE

Kontinuasjonseksamen

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

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

Kontinuasjonseksamen

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

Kontinuasjonseksamen

UNIVERSITETET I OSLO

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

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

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

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:

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

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

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

Transkript:

Høgskolen i Gjøvik Avdeling for teknologi Kontinuasjonseksamen FAGNAVN: FAGNUMMER: Objekt-orientert programmering IMT1082 / ELE2092 EKSAMENSDATO: 5. januar 2007 KLASSE(R): 05HBIND*, 05HBINFA, 05HBISA, 05HBMETEA, 04HBINE* TID: 09.00-13.00 FAGLÆRER: 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 nedenforstående programmet var det ønskelig at gav følgende utskrift: 3-gangen: 3 6 9 12 15 5-gangen: 5 10 15 20 25 10-gangen: 10 20 30 40 50 Tallet 20 finnes i gangetabellen for: 5-gangen 10-gangen 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 4 using namespace std; 5 const int MAX = 5; 6 const int TAL = 20; 7 class Data { 8 private: 9 char text[max*4]; 10 int tall[max]; 11 public: 12 Data(char* t, int j) 13 { strcpy(text, t); for (int i = 1; i <= MAX; i++) tall[i] = i*j; 14 void display1() { cout << text << " "; 15 void display2() 16 { cout << text << ": "; 17 for (int i = 1; i <= MAX; i++) cout << setw(3) << tall[i]; 18 cout << '\n'; 19 bool finn(int n) 20 { for (int i = 1; i <= MAX; i++) if (tall[i] == n) return true; 21 else return false; 22 ; 23 int main() { 24 Data d1(" 3-gangen", 3), d2("5-gangen", 5), d3("10-gangen", 10); 25 d1.display2(); 26 d2.display2(); 27 d3.display2(); 28 cout << "Tallet " << TALL << " finnes i gangetabellen for: "; 29 if (d1.finn(tall)) d1.display1(); 30 if (d2.finn(tall)) d2.display1(); 31 if (d3.finn(tall)) d3.display1(); 32 cout << "\n\n"; 33 return 0; 34 2

b) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> using namespace std; char text[] = "EMIRATES-STADIUM-THE-BEST-PLACE-IN-THE-WORLD"; void funk(char* t, int n) { cout << *(t+n+2) << '\n'; int funk(char c) { return (int(c - 'A' - 2)); char funk(int n, int m) { return text[n - m / 3]; int main() { funk(text, 13); cout << funk(text[19]) << '\n'; cout << funk(11, 32) << '\n'; cout << funk(6, funk(text[26])) << '\n'; funk(text, funk(text[12])); return 0; c) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> using namespace std; class A { private: int t; char c; public: A(int tt) { t = tt; c = 'X'; virtual void display() { cout << c << ' ' << t << '\n'; bool operator <= (int tt) { return (t <= tt); ; class B : public A { private: char c; public: B(char cc, int tt): A(tt) { c = cc; virtual void display() { cout << c << '\n'; bool operator <= (char cc) { return (c <= cc); ; int main() { A* obj[3]; obj[0] = new A(8); obj[1] = new B('P', 39); obj[2] = new B('W', 21); obj[0]->display(); obj[1]->display(); (*obj[2]).display(); cout << (*obj[0] <= int('f'-'a')) << '\n'; cout << (*obj[2] <= 'V') << '\n'; return 0; 3

Oppgave 2 (70%) Les hele teksten for denne oppgaven nøye, før du begynner å besvare noe som helst. Studer vedlegget, som inneholder mange viktige opplysninger som du trenger/skal bruke. Legg spesielt merke til const ene, klassene (med sine datamedlemmer og (ferdiglagde) funksjoner), globale variable, main() og de tre ferdiglagde funksjonene på den siste siden i vedlegget. Bruk alt dette aktivt! I denne oppgaven skal du lage et lite program som holder orden på hvilke personer som deltar i trekningen, og har vunnet, på de ulike dagene i advent (1.-24.desember). Datastrukturen Datastrukturen består (som du ser i vedlegget) av arrayen dagene med pekere til Dag -objekter (vi bruker alle indeksene 1-ANTDAGER). Hvert slikt objekt inneholder bl.a. to lister: en med alle deltagerne som er (har vært) med i trekningen av premien(e) for denne dagen, og en med vinnerne som har fått premiene/vunnet denne dagen. En Deltager inneholder kun dataene: telefonnummer (som listen deltagere er sortert etter), navn og adresse (gate, postnr, poststed). Listen vinnere er en FIFO-liste (dermed ligger de sortert etter hvilken premie de fikk). 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 litt manglende kode i main(), innmaten til noen hovedfunksjoner og medlemsfunksjonene inni de ulike klassene. Oppgaven a) Tegn datastrukturen. Gjør dette detaljert, pent og klart. Skriv innmaten til funksjonene void initier() og Dag::Dag() Funksjonene skal sørge for at alle dag -objektenes trukket blir satt til false, samt at hver av deres to listepekere blir initiert til aktuelle tomme lister. b) Skriv innmaten til de to void display() -funksjonene i klassene og kode(linje)n i main() som sørger for at alt om en viss dag vises/displayes. Funksjonene skal sørge for at alle dataene inni de to klassene blir skrevet ut på skjermen med et passende utseende. Kode(linje)n i main() skal sørge for at display()-funksjonen for den dagen brukeren ønsker å se blir kalt. NB: Husk å bruke les( ) funksjonen! c) Skriv innmaten til funksjonen void bytt_dag() Funksjonen leser først et lovlig dagnummer mellom 1 og ANTDAGER. Om det allerede er foretatt trekning på/for denne dagen, kommer det en melding om det. I motsatt fall settes den globale variabelen idag til denne verdien. ( idag brukes primært i oppgave 2d og 2g.) d) Skriv innmaten til funksjonene void Dag::ny() og Deltager::Deltager( ) og kodelinjen i main() som sørger for at den første funksjonen kalles. Funksjonen Dag::ny() kommer kun med en melding om vinnerne på/for denne dagen allerede er trukket. I motsatt fall leses det inn et telefonnummer (i intervallet 10000000 til 99999999). Det kommer også bare en melding om denne allerede finnes i deltagere. I motsatt fall lages en ny 4

Deltager som legges inn i aktuell liste. Constructoren skal sørge for at telefonnummeret settes, og at vedkommendes navn og adresse blir lest inn. Husk også manglende kodelinje i main! NB: En person (ut fra sitt telefonnummer) kan altså delta med kun en stemme /sjanse pr.dag, men kan selvsagt delta på flere (alle de) ulike dager. e) Skriv innmaten til funksjonene void skriv_til_fil(), void Dag::skriv_til_fil( ) og void Deltager::skriv_til_fil( ) Funksjonene skal til sammen sørge for at alt om alle Dag ene og alle deres Deltager e med alle sine data blir skrevet til en og samme fil ( ADVENT.DTA ). Formatet bestemmer du selv, men du må angi/beskrive dette som en del av din besvarelse. Hint: Sikkert lurt å bl.a. skrive ut antall deltagere og vinnere for hver dag til filen. f) Skriv innmaten til funksjonene void les_fra_fil(), void Dag::les_fra_fil( ) og void Deltager::Deltager( ) Funksjonene skal til sammen sørge for at hele datastrukturen (Dag ene og Deltager ne) blir lest inn fra filen ADVENT.DTA. (Formatet bestemte du selv i oppgave 2e.) NB: En Deltager kan først lese resten om seg selv etter at telefonnummeret er lest inn. Hint: Husk at det alltid er ANTDAGER dager på filen. g) Skriv innmaten til funksjonene void trekk() og void Dag::trekk() Funksjonene skal sørge for at det foretas trekning av premier på dagen angitt i/av idag. trekk() kommer kun med en melding om vinnerne på/for denne dagen allerede er trukket. I motsatt fall spør den om brukeren virkelig ønsker å foreta en trekning ( J / N ). Om så er tilfelle, kalles den aktuelle dagens trekk(). Denne siste funksjonen kommer med en melding om det ikke finnes noen deltagere. I motsatt fall spør den om antall premier som skal fordeles/ trekkes (som maksimum kan være halvparten av antall deltagere). trukket settes så til true. Den går så gjennom alle premiene som skal fordeles, trekker et tilfeldig tall (vha. rand()), finner denne blant deltagere, skriver premienummeret, vedkommendes data til/på skjermen og legger han/hun over i vinnere. NB: Husk at antall deltagere minsker etter hvert som premier trekkes (siden de flyttes til vinnere). Dette medfører også at en Deltager max. kan vinne en gang pr.dag. Annet (klargjørende?): Du skal bruke LISTTOOL ifm. løsningen av denne oppgaven. Den globale variabelen idag inneholder indeksen for den aktuelle/relevante dagen. Denne brukes hovedsakelig i funksjonene main(), bytt() og trekk(). En ny Deltager legges alltid inn i deltagere for/på den aktuelle dagen. Vedkommende flyttes kun til vinnere om han/hun vinner/får premie på den aktuelle dagen. Alle premiene har ulikt nummer, dvs. det finnes f.eks. ikke flere 3. eller 5.premier på samme dag. 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. Jeg håper alle deltagerne på eksamen blir vinnere! Lykke til! frode_ætt_haugianerne.no 5

Vedlegg: Halvferdig programkode #include <iostream> #include <fstream> #include <cstring> #include <cctype> #include <cstdlib> #include <ctime> #include "listtool.h" // INCLUDE: // cin, cout // i(f)stream, o(f)stream // strlen, strcpy // toupper // (s)rand // time (ifm. srand) // "Verktøykasse" for listehåndtering. using namespace std; // CONST: const int STRLEN = 80; // Max. streng-lengde. const int ANTDAGER = 24; // Antall dager i desember (til julekvelden). // KLASSER: class Deltager : public Num_element { private: // Deltagerens telefon ligger i "number". char* navn, *adr; // Deltagerens navn og adresse. public: // Funksjons-deklarasjoner: Deltager(int n); Deltager(int n, istream* inn); void display(); void skriv_til_fil(ostream* ut); ; class Dag { // En ukedag i desember (1.-24.). private: bool trukket; // Er dagens trekning foretatt eller ei. List* deltagere, // Liste av trekningsdeltagere. * vinnere; // Liste av trekningsvinnere. public: Dag(); // Funksjons-deklarasjoner: bool er_trukket() { return trukket; void display(); void ny(); void trekk(); void skriv_til_fil(ostream* ut); void les_fra_fil(istream* inn); ; // DEKLARASJON AV FUNKSJONER: void skriv_meny(); char les_kommando(); int les(char* t, const int MIN, const int MAX); void initier(); void bytt_dag(); void skriv_til_fil(); void les_fra_fil(); void trekk(); // GLOBALE VARIABLE: Dag* dagene[antdager+1]; // Alle desemberdagene, bruker fra indeks nr.1-24. int idag = 0; // Aktuell/relevant som det egges inn deltagere på. 6

int main() { char valg; // HOVEDPROGRAM: srand((unsigned)time( NULL )); // Tall trekkes HELT tilfeldig. initier(); // Oppgave 2A les_fra_fil(); // Oppgave 2F bytt_dag(); // Oppgave 2C skriv_meny(); valg = les_kommando(); while (valg!= 'Q') { switch(valg) { case 'S': /* Oppgave 2B: Lag manglende kode(linje) */ break; case 'B': bytt_dag(); break; // Oppgave 2C case 'N': /* Oppgave 2D: Lag manglende kodelinje case 'T': trekk(); break; // Oppgave 2G default: skriv_meny(); break; valg = les_kommando(); */ break; skriv_til_fil(); cout << "\n\n"; return 0; // Oppgave 2E // DEFINISJON AV MEDLEMS-FUNKSJONER: //*************************** DELTAGER: *************************** Deltager::Deltager(int n) : Num_element(n) { // Setter/leser ALLE dets data: // Oppgave 2D: Skriv innmaten // Leser ALLE dets data fra fil: Deltager::Deltager(int n, istream* inn) : Num_element(n) { // Oppgave 2F: Skriv innmaten void Deltager::display() { // Oppgave 2B: Skriv innmaten void Deltager::skriv_til_fil(ostream* ut) { // Oppgave 2E: Skriv innmaten // Skriver ALLE dets data: // Skriver ALLE dets data til fil: //****************************** DAG: ***************************** Dag::Dag() { // Oppgave 2A: Skriv innmaten void Dag::display() { // Oppgave 2B: Skriv innmaten void Dag::ny() { // Oppgave 2D: Skriv innmaten // Initierer ALLE dets data: // Skriver ALLE dets data: // Legger inn ny deltager: 7

void Dag::skriv_til_fil(ostream* ut) { // Oppgave 2E: Skriv innmaten void Dag::les_fra_fil(istream* inn) { // Oppgave 2F: Skriv innmaten void Dag::trekk() { // Oppgave 2G: Skriv innmaten // Skriver ALT om EN dag til fil: // Leser ALT om EN dag fra fil: // Foretar evt. trekning av vinnere: // DEFINISJON AV (GLOBALE) FUNKSJONER: void skriv_meny() { // Skriver alle mulige menyvalg: cout << "\n\nfølgende KOMMANDOER ER TILGJENGELIGE:" << "\n S - Skriv en dag" << "\n B - Bytt til/sett ny aktuell dag" << "\n N - Ny deltager" << "\n T - foreta Trekning på aktuell dag" << "\n Q - Quit / avslutt" << "\n\n Aktuelt/nåværende dagnummer: " << idag; char les_kommando() { char ch; cout << "\n\nkommando: "; cin >> ch; cin.ignore(); return (toupper(ch)); // Leser og upcaser brukerens valg/ønske: // Leser et tall mellom MIN og MAX: int les(char* t, const int MIN, const int MAX) { int n; do { cout << '\t' << t << " (" << MIN << '-' << MAX << "): "; cin >> n; cin.ignore(); while (n < MIN n > MAX); return n; void initier() { // Oppgave 2A: Skriv innmaten void bytt_dag() { // Oppgave 2C: Skriv innmaten void skriv_til_fil() { // Oppgave 2E: Skriv innmaten void les_fra_fil() { // Oppgave 2F: Skriv innmaten void trekk() { // Oppgave 2G: Skriv innmaten // Initierer alle de 24 dagene: // Bytter til annen/ny aktuell dag: // Skriver HELE datastrukturen til fil: // Leser HELE datastrukturen fra fil: // Foretar evt. trekning på aktuell dag: 8