Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Like dokumenter
Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Eksamen. Objekt-orientert programmering

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

Kontinuasjonseksamen

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

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

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

Kontinuasjonseksamen

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

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

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

Kontinuasjonseksamen

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

Kontinuasjonseksamen

Kontinuasjonseksamen

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

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

Kontinuasjonseksamen

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

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

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

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

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

Kontinuasjonseksamen

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

GJØVIK INGENIØRHØGSKOLE

KONTINUASJONSEKSAMEN

Eksamen. Objekt-orientert programmering

KONTINUASJONSEKSAMEN

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

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

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 99HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB / 99HINGA

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 96HINDA / 96HINDE (1 AA / AE)

KONTINUASJONSEKSAMEN

Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 16. desember 1997

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

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

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

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

KONTINUASJONSEKSAMEN

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:

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

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

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

Kontinuasjonseksamen

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

GJØVIK INGENIØRHØGSKOLE

HØGSKOLEN I SØR-TRØNDELAG

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

HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING

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

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

HØGSKOLEN I SØR-TRØNDELAG

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:

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

1. Grunnleggende C Introduksjon til kurset og til C++ Innhold

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

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:

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

HØGSKOLEN I SØR-TRØNDELAG

Kapittel 1 En oversikt over C-språket

Transkript:

Institutt for datateknologi og informatikk Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering Faglig kontakt under eksamen: Frode Haug Tlf: 950 55 636 Eksamensdato: 14.august 2018 Eksamenstid (fra-til): Hjelpemiddelkode/Tillatte hjelpemidler: 09:00-13:00 (4 timer) F - Alle trykte og skrevne. (kalkulator er ikke tillatt) Annen informasjon: Målform/språk: Antall sider (inkl. forside): 8 Bokmål Informasjon om trykking av eksamensoppgaven Originalen er: 1-sidig X 2-sidig sort/hvit X farger Skal ha flervalgskjema Kontrollert av: Dato Sign

NB1: Oppgave 1a, 1b, 1c og 2 er totalt uavhengige og kan derfor løses separat. NB2: I hele oppgavesettet forutsetter vi at bruken av strcpy virker problemfritt - uten melding fra kompilatoren. Oppgave 1 (30%) a) Det nedenfor stående programmet var det ønskelig at gav følgende utskrift: Marchesi, Barolo Pio Cesare, Alba Cantina Terre, Uccellaccio Cantina Terre del Barolo, Uccellaccio 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 Vingaard { 5 private: 6 char navn[30], sted[30]; 7 public: 8 Vingaard(char *n, char s[]) { strcpy(navn, n); strcpy(sted, s); 9 void display() { cout << navn << "- " << sted << '\n'; 10 void operator += (char *t[]) { strcat(navn, t); 11 ; 12 int main() { 13 Vingaard * gaarder[3]; 14 gaarder[2] = new Vingaard("Cantina Terre", "Uccellaccio"); 15 gaarder[1] = new Vingaard = ("Pio Cesare", "Alba"); 16 gaarder[3] = new Vingaard("Marchesi", "Barolo"); 17 for (int i = 0; i <= 2; i++) gaarder[i]->display(); 18 gaarder[2] += " del Barolo"; 19 gaarder[2]->display(); 20 return 0; 21 2

b) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> using namespace std; char txt[] = "PIEMONTE-ALBA-NOVELLO-CARZELLO-RODELLO"; void funk(char* t) { while (*t!= 'E') cout << *t++; void funk(int m, int n, char* t) { while (m >= n) { m--; n++; cout << *++t; void funk(char* t, int n) { while (*t!= '-') { cout << *t; t += n; void funk(char* t1, char* t2, int n) { while (*t1 >= *t2) { cout << *t1-- << *t2 << ' '; t2 -= n; ++t2; char funk(char* t1, char* t2) { while (*t1 == *t2) { t1++; t2++; ; return *++t1; int main() { funk(txt + 18); cout << '\n'; funk(txt, 6); cout << '\n'; cout << funk(txt + 17, txt + 26) << '\n'; funk(txt + 20, txt + 37, 2); cout << '\n'; funk(33, 7, txt); 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 Tekst { private: char txt[200]; public: Tekst(char t[]) { strcpy(txt, t); virtual void display() { cout << txt << '\n'; void operator += (char t[]) { strcat(txt, t); void operator += (Tekst & t) { strcat(txt, t.txt); ; class Tekst2 : public Tekst { private: int antall; public: Tekst2(char t[], int ant) : Tekst(t) { antall = ant; void display() { cout << antall << '\n'; void display2() { Tekst::display(); display(); ; int main() { Tekst t1("millwall"), t2 = "AstonVilla"; Tekst2 t3("fulham", 25700), t4("arsenal", 60000); t1.display(); t1 += " - "; t1 += t2; t1.display(); t3 += " - "; t3 += t4; t3.display(); t3.display2(); 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 consten, klassene med datamedlemmer og (ferdiglagde) funksjoner, globale variable, main, finnby og de to les-funksjonene. Bruk disse siste svært aktivt. Det skal lages et program som holder orden på ulike byer (i ulike land) og status for hvilke severdigheter i byene som er besøkt/sett eller ei. Datastrukturen Datastrukturen består (se vedlegget) av arrayen byene med By-objekter (indeksene t.o.m sisteby er i bruk, nr.0 brukes ikke). Inni hvert slikt objekt er det bl.a. en liste med Severdighet-objekter. Globale variable, klassene, deres arv, data-medlemmer og prototyper for medlemsfunksjoner er stort sett deklarert/definert i vedlegget. Din oppgave blir å skrive innmaten til funksjoner inni og utenfor klassene. Oppgaven a) Skriv innmaten til funksjonene void nyby() og By::By(char* nvn) Den første funksjonen kommer med en melding om det er fullt med byer allerede. I motsatt fall spør den brukeren om den nye byens navn. Finnes denne allerede (bruk ferdiglaget funksjon), kommer det også en melding. Ellers opprettes en ny by, og dens constructor leser inn verdier til de to char-pekerne, samt at de andre datamedlemmene initieres/nullstilles. NB: Det skal her ikke leses inn severdigheter i byen (dette gjøres i oppgave 2C). Arrayen byene er ikke sortert på navn. b) Skriv innmaten til funksjonene void skrivseverdigheterienby(), void By::skrivSeverdigheter() og void Severdighet::display() Den første funksjonen spør brukeren først om et bynavn. Finnes ikke byen, kommer det en melding. I motsatt fall kalles den andre funksjonen. Denne funksjonen igjen skriver byens land, antall severdigheter i den, samt alle severdighetene, bl.a. vha. den tredje funksjonen, som: skriver severdighetens navn (med en * foran navnet for de som ikke er besøkt ennå) og dens webside (husk å legge til «www.» i starten av denne utskriften). c) Skriv innmaten til funksjonene void nyseverdighetienby(), void By::nySeverdighet() og Severdighet::Severdighet(char* t) Den første funksjonen spør brukeren først om et bynavn. Finnes ikke byen, kommer det en melding. I motsatt fall kalles den andre funksjonen. Denne funksjonen igjen leser severdighetens navn. Finnes denne allerede (vi tillater ikke duplikate severdigheter i en og samme by), kommer det en melding. I motsatt fall opprettes og legges det inn en ny severdighet i datastrukturen. Constructoren i severdigheten leser inn dens webside og setter at den ikke er besøkt. NB: Alle severdigheter har alltid en webside (også selv om den er aldri så liten, er bare et torg/ en gate/en statue,.). Webadressen skriver brukeren uten innledende «www.». Dette legges jo automatisk på i utskriften i oppgave 2B. Men, du trenger ikke å sjekke om dette allikevel skrives inn, eller at webadressen er rimelig/lovlig/på rett format. 4

d) Skriv innmaten til funksjonene void settbesoktienby(), void By::settBesokt() og bool Severdighet::endreBesokt() Den første funksjonen spør brukeren først om et bynavn. Finnes ikke byen, kommer det en melding. I motsatt fall kalles den andre funksjonen. Denne funksjonen igjen går gjennom alle severdighetene. For de som ikke er besøkt (og kun dem), får brukeren mulighet (i den tredje funksjonen) til å sette at den nå er besøkt. NB: Det er ikke noe funksjonalitet i programmet for å sette at kun en severdighet er besøkt. Funksjonene her går altså gjennom alle severdigheter i en og samme by, og oppdaterer evt. ikke-besøkte til besøkt. e) Skriv innmaten til funksjonen void statusallebyer() og all annen kode/funksjon(er) for å: Funksjonen og annen kode/funksjon(er) skal gå gjennom alle byene. For hver skal det skrives byens navn og land, antall severdigheter i byen og antallet av dem som er besøkt. f) Skriv innmaten til funksjonen void finnseverdighet() og all annen kode/funksjon(er) for å: Funksjonen og annen kode/funksjon(er) skal til sammen sørge for at: Det spørres etter navnet for en severdighet. Alle byer som inneholder denne severdigheten (f.eks. «Domkirke» eller «Nasjonal Galleri» kan jo forekomme i flere ulike byer) skal skrive navnet og landet sitt. Er det ingen byer som inneholder denne severdigheten, skal det komme en egen melding om dette. g) Skriv innmaten til funksjonen void lesfrafil() og constructoren som tar filobjekt som parameter i begge klassene Funksjonene skal til sammen sørge for at hele datastrukturen blir lest inn fra filen SEVERDIGHETER.DTA. Formatet bestemmer du helt selv, men den skal oppgis som en del av besvarelsen. Annet (klargjørende): Du skal bruke ListTool2A ifm. løsningen av denne oppgaven. Du skal ikke bruke string-klassen (læreboka side 302-310), kode fra STL, templates eller andre større hjelpebiblioteker. Men, de vanligste includer brukt i hele 1.klasse er tilgjengelig. 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 alle de flott og vakre severdighetene i verdens byer! FrodeH 5

Vedlegg: Halvferdig programkode #include <iostream> #include <fstream> #include <cstring> #include <cctype> #include "ListTool2A.h" using namespace std; // INCLUDE: // cin, cout // ifstream // strcpy, strlen, strcmp // toupper // CONST const int STRLEN = 80; // Max. lengde for en tekststreng. const int MAXBY = 50; // Max. antall byer i datastrukturen. // KLASSER: class By { private: char* navn, // Byens navn * land; // og land. List* severdigheter; // Liste med byens severdigheter. public: By(char* nvn); // Oppgave 2A By(ifstream & inn); // Oppgave 2G ~By() { delete[] navn; delete[] land; delete severdigheter; void skrivseverdigheter(); // Oppgave 2B void nyseverdighet(); // Oppgave 2C void settbesokt(); // Oppgave 2D bool operator == (char* nvn) { return(!strcmp(navn, nvn)); ; class Severdighet : public TextElement { private: // text = severdighetens unike navn. char* webside; // Severdighetens webside/-adresse. bool besokt; // Severdigheten er besøkt eller ei. public: Severdighet(char* t); Severdighet(char* t, ifstream & inn); ~Severdighet() { delete [] webside; bool status() { return besokt; void display(); bool endrebesokt(); // Oppgave 2C // Oppgave 2G // Oppgave 2B // Oppgave 2D ; // DEKLARASJON AV FUNKSJONER: void skrivmeny(); // char les(); // Ferdiglaget void les(const char* t, char* s, const int LEN); // int finnby(char* nvn); // void nyby(); // Oppgave 2A void skrivseverdigheterienby(); // Oppgave 2B void nyseverdighetienby(); // Oppgave 2C void settbesoktienby(); // Oppgave 2D void statusallebyer(); // Oppgave 2E void finnseverdighet(); // Oppgave 2F void lesfrafil(); // Oppgave 2G By* byene[maxby+1]; int sisteby = 0; // GLOBALE VARIABLE: // Array med alle byene. // Siste byindeks hittil i bruk. 6

int main() { char valg; lesfrafil(); // HOVEDPROGRAM: // Brukerens valg/kommando. // Oppgave 2G skrivmeny(); cout << "\n\n\nkommando: "; valg = les(); while (valg!= 'Q') { switch (valg) { case 'B': nyby(); break; // Oppgave 2A case 'I': skrivseverdigheterienby(); break; // Oppgave 2B case 'S': nyseverdighetienby(); break; // Oppgave 2C case 'X': settbesoktienby(); break; // Oppgave 2D case 'A': statusallebyer(); break; // Oppgave 2E case 'F': finnseverdighet(); break; // Oppgave 2F default: skrivmeny(); break; cout << "\n\n\nkommando: "; valg = les(); cout << "\n\n"; return 0; // ************************************************************************* // ****************** DEFINISJON AV MEDLEMS-FUNKSJONER: ****************** // ************************************************************************* By::By(char* nvn) { // Leser hoveddata og initierer: // Oppgave 2A: Lag innmaten By::By(ifstream & inn) { // Oppgave 2G: Lag innmaten void By::skrivSeverdigheter() { // Oppgave 2B: Lag innmaten void By::nySeverdighet() { // Oppgave 2C: Lag innmaten void By::settBesokt() { // Oppgave 2D: Lag innmaten // Leser HELE byen fra fil: // Skriver ALT om byen: // Legger inn (om mulig) en ny severdighet: // Tilbyr å sette ALLE 'ikke-besøkte' til 'besøkt': // --------------------------------------------------------------------------- // Setter, leser og initierer egne data: Severdighet::Severdighet(char* t) : TextElement(t) { // Oppgave 2C: Lag innmaten // Setter og leser egne data fra fil: Severdighet::Severdighet(char* t, ifstream & inn) : TextElement(t) { // Oppgave 2G: Lag innmaten void Severdighet::display() { // Oppgave 2B: Lag innmaten bool Severdighet::endreBesokt() { // Oppgave 2D: Lag innmaten // Skriver ALLE egne data: // Endrer evt. til 'besøkt': 7

// *************************************************************************** // ****************** DEFINISJON AV (GLOBALE) FUNKSJONER: ***************** // *************************************************************************** void skrivmeny() { // Skriver alle mulige menyvalg: cout << "\n\nfø LGENDE KOMMANDOER ER TILGJENGELIGE:" << "\n B - legg inn en ny By" << "\n I - skriv alle severdigheter I en by" << "\n S - ny Severdighet i en by" << "\n X - sett severdgheter besøkt i en by" << "\n A - skriv Alle byene, Antall severdigheter og Antall besøkt" << "\n F - Finn severdighet(er) med et gitt navn" << "\n Q - Quit / avslutt"; char les() { // Leser og upcaser ett tegn: char ch; cin >> ch; cin.ignore(); return (toupper(ch)); // Leser inn en 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. // Finner (om mulig) en gitt navnet by. int finnby(char* nvn) { // Retunerer dens indeks eller 0. for (int i = 1; i <= sisteby; i++) // Går gjennom alle byene: if (*byene[i] == nvn) return i; // Funn: retunerer indeks return 0; // Ingen funn: returnerer 0. void nyby() { // Oppgave 2A: Lag innmaten // Legg til (om mulig) en ny by: // Skriv alle severdigheter i EN by: void skrivseverdigheterienby() { // Oppgave 2B: Lag innmaten void nyseverdighetienby() { // Oppgave 2C: Lag innmaten void settbesoktienby() { // Oppgave 2D: Lag innmaten // Ny UNIK severdighet i en by: // Sett severdigheter besøkt i en by: // Skriv ALLE byene, antall severdigheter void statusallebyer() { // og antall besøkt i hver av dem: // Oppgave 2E: Lag innmaten void finnseverdighet() { // Oppgave 2F: Lag innmaten // Finn severdighet(er) med et gitt navn: void lesfrafil() { // Oppgave 2G: Lag innmaten // Leser HELE datastrukturen fra fil: 8