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

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

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

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

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

KONTINUASJONSEKSAMEN

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. Grunnleggende datakunnskap og programmering 02HIND*, 02HINE*, 02HDMU*, 02HING*, 02HGEOMAA, 02HSIV5

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

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamen

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

Kontinuasjonseksamen

KONTINUASJONSEKSAMEN

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

KONTINUASJONSEKSAMEN

Eksamen. Objekt-orientert programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert 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

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

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

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

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

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

Kontinuasjonseksamen

Kontinuasjonseksamen

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

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

Kontinuasjonseksamen

Kontinuasjonseksamen

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

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

Kontinuasjonseksamen

Eksamensoppgave i IMT1082 Objekt-orientert programmering

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

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

Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 16. desember 1997

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

GJØVIK INGENIØRHØGSKOLE

KONTINUASJONSEKSAMEN

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

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert 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. - Kontroller at alle oppgavearkene er tilstede. - Les hele oppgaveteksten nøye, før du begynner å besvare noe som helst.

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

Eksamen. Objekt-orientert programmering

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

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

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

Kontinuasjonseksamen

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

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

Kontinuasjonseksamen

GJØVIK INGENIØRHØGSKOLE

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

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

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

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

KONTINUASJONSEKSAMEN

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: 11. august 1995 TID:

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 SØR-TRØNDELAG

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMEN. Algoritmiske metoder I KLASSE: 97HINDA / 97HINDB ( 2DA / 2DB )

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

Transkript:

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N EMNENAVN: EMNENUMMER: Grunnleggende programmering IMT 1031 (F) EKSAMENSDATO: 4.desember 2012 KLASSE(R): 12HBIND*, 12HBPUA, 12HBDRA, 12HBISA, 12HBSPA, 12HBINE*, 12HÅRMITA TID: 09.00-13.00 EMNEANSVARLIG: Frode Haug ANTALL SIDER UTLEVERT: TILLATTE HJELPEMIDLER: 7 (inkludert denne forside) Alle trykte og skrevne (kalkulator er ikke tillatt) Kontroller at alle oppgavearkene er til stede. Innføring med penn, eventuelt blyant 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. Husk kandidatnummer på alle ark.

Eksamenssettet består av to ulike oppgavetyper: Oppgave 1 omhandler hva som blir utskriften fra/av to ulike programmer. Oppgave 2 omhandler et litt større programmerings-case. NB: Oppgavene 1a, 1b og 2 er totalt uavhengige og kan derfor løses separat. Oppgave 1 (30 %) a) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> #include <cstring> using namespace std; char txt[] = "FLYBILLETT-TIL-LONDONPAASKE-ALLEREDE-BESTILT!!!"; int main() { int i = 17, j = i % 3, k = 0; bool ferdig = false; do { cout << txt[i + (++k)] << '\n'; while (i < strlen(txt)); i *= (j * k); i = 30 / 6 + 2; j = strlen(txt) - strlen(txt) + 2; while (!ferdig) { cout << txt[i] << ' ' << txt[j] << '\n'; i += 4; j++; if (i % j == 4) ferdig = true; return 0; b) Hva blir utskriften fra følgende program (litt hjelp: det blir 5 linjer): #include <iostream> #include <cstring> using namespace std; enum Form { kvadratisk, oval ; class Bane { private: char navn[20]; Form form; int ant; public: Bane(char t[], Form f, int a) { strcpy(navn, t); form = f; ant = a; void skriv() { cout << navn << ": " << ant; bool erlik(form f) { return (form == f); int funk(int i = 6000) { return (ant % i == 0); void funk(char t[]) { strcat(navn, t); bool funk(char t[], char ch) { return (strcmp(navn, t)); ; int main() { Bane gammel("highbury", kvadratisk, 38000), ny("emirates", oval, 60000); gammel.skriv(); cout << " "; ny.skriv(); cout << '\n'; if (gammel.erlik(oval)) cout << "O'hval\n"; else cout << "NorthBank\n"; cout << gammel.funk(5000) << ' ' << ny.funk() << '\n'; ny.funk("stadium"); ny.skriv(); cout << '\n'; cout << gammel.funk("highbury", 'F') << ' ' << ny.funk("highbury", 'H') << '\n'; return 0; 2

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, klassen, dens datamedlemmer og dens to ferdiglagde funksjoner, globale variable, main, de tre les( ) ene og skrivtilfil(). Bruk alt dette aktivt. På vinteren arbeider Bjørn Strøm med å brøyte og strø for ulike kunder. Du skal her lage et program som holder orden på Bjørns ulike kunder, og datoene for når han utførte slike oppdrag hos de ulike kundene. Datastrukturen En kunde er representert av klassen Kunde. I vedlegget kan du se: hvilke datamedlemmer som inngår i objekter av denne klassen, hvordan slike objekter ligger i arrayen kunder, hvor lang den arrayen er, samt at indeksene 1 til og med sistebrukt er i bruk (vi bruker ikke indeks nr.0). Dette skal være alt du trenger av klasser, datamedlemmer og globale variable for å løse denne eksamensoppgaven. Oppgaven a) Lag funksjonen int lesdato() Denne funksjonen leser inn et dagnummer (DD) i intervallet 1-31 og et månedsnummer (MM) i intervallet 1-12. Funksjonen returnerer ett heltall som er disse to tallene gjort om til en int på formen MMDD (altså månedsnummeret ganget med 100 pluss dagnummeret). b) Lag funksjonene void nykunde() og void Kunde::lesData() Den første funksjonen sjekker først om det er plass til flere kunder. Om så ikke er tilfelle, kommer det en melding. I motsatt fall tas et nytt objekt i bruk. Dette objektet leser så selv inn relevante data (vha. den andre funksjonen) til sine tre første datamedlemmer angitt i vedlegget. c) Lag funksjonene void skrivallekunder() og void Kunde::skriv() Den første funksjonen går gjennom alle registrerte kunder, skriver deres nummer/indeks, og får hver av dem (vha. den andre funksjonen) til å skrive alle sine data, unntatt innholdet i oppdragarrayen, ut på skjermen på en linje. (Skulle kundens navn og adresse til sammen være på mange tegn vil utskriften wrappe om, men dette lar vi være helt greit.) Utskriften skal stanse for hver 20. kunde, og brukeren må skrive ett tegn (og Enter ) for at utskriften skal fortsette. d) Lag funksjonene void registreroppdrag(int d) og bool Kunde::registrer(int d) Den andre funksjonen returnerer false om det ikke er plass til å registrere flere oppdrag. I motsatt fall registreres et nytt oppdrag med verdien/datoen d, og det returneres true. Den første funksjonen leser først et lovlig indeksnummer for en start-kunde. Deretter leser den et lovlig indeksnummer (større eller lik start-kunde ) som slutt-kunde. (Om det skal registreres oppdrag hos bare en kunde, vil start- og slutt-kunden være like.) Deretter går den gjennom kundene f.o.m. start-kundens t.o.m. slutt-kundens indeks, og ber alle kundene i intervallet om å registrere ett oppdrag (vha. den andre funksjonen), jfr. med- og videresendt parameter d (se main). Om den andre funksjonen returnerer false skriver den første funksjonen ut indeksnummeret for kunden(e) som det ikke lot seg gjøre å foreta registrering hos. 3

e) Utvid/endre funksjonen void nykunde() Funksjonen i oppgave 2B tar bare i bruk et nytt Kunde-objekt bakerst i arrayen. Når dette er utført ønsker vi at brukeren skal kunne angi at den nye kunden skal flyttes/smettes inn lengre frem i arrayen. Derfor skal du her i oppgave 2E skrive tilleggskode som (angi i nykunde hvor den nye koden legges inn): Først spørres brukeren om vedkommende ønsker å flytte den bakerste kunden lengre frem. Om så er tilfelle, spørres det etter en ny, lovlig og relevant indeks for kunden. Alle kundene mellom den nye/bakerste og der den ønskes flyttet til, flyttes opp en indeks/ett hakk, og den nye (bakerste) smettes inn på den ønskede indeksen. (Dermed vil kanskje mange kunder bytte indeks/nummer, men dette husker/holder Bjørn orden på i sitt hode..) f) Lag funksjonene void skrivenkunde() og void Kunde::skriv2(int n) Den første funksjonen ber først om et lovlig kundenummer. Deretter leser den et månedsnummer mellom 0(!) og 12. For den aktuelle kunden kalles dens skriv2(...) med månedsnummeret som parameter. Den andre funksjonen skriver først de samme dataene for objektet som i oppgave 2C. Deretter går den gjennom alle kundens registrerte oppdrag. Om oppdraget er utført i aktuell måned (1-12) skrives oppdragets dato på formen DD/MM (skråstrek mellom). Om parameteren er 0 (null), betyr det at oppdraget alltid skal skrives, uavhengig av hva måneden er. Om det er registrert oppdrag, men ingen matchende måned (altså ingen utskrift av DD/MM har forekommet), skal den andre funksjonen også komme med en melding om dette. g) Lag de to void lesfrafil( ) -funksjonene Funksjonene sørger til sammen for at hele datastrukturen blir lest inn fra filen VINTER.DTA. Formatet på denne filen er gitt ved den måten de to ferdiglagde skrivtilfil-funksjonene skriver til fil på (studér disse to). Angi dette formatet også som en del av din besvarelse. Klargjøring og forutsetninger Et oppdrag er i praksis enten brøyting eller strøing. Men, så lenge disse har samme pris, har vi ikke tatt med at vi må registrere hvilken type et oppdrag gjelder for. Brukeren kan i oppgave 2A komme til å skrive inn ikke-eksisterende datoer som for eksempel 30.feb eller 31.april. Men, vi forutsetter bare at vedkommende skriver inn eksisterende datoer, samt at de hele tiden er minst en dag senere/etter enn det skrevet inn sist programmet ble kjørt/brukt. Datoene gjelder kun for ett vinterhalvår ad gangen, derfor er selve årstallet uinteressant. Eksamensoppgaven inneholder ingen funksjon for å kunne lage/skrive ut faktura. Noe som selvsagt er en kraftig svakhet ikke minst for lommeboka til Bjørn. Gjør dine egne forutsetninger dersom du finner oppgaveteksten upresis eller ufullstendig. Gjør i så fall rede for disse forutsetningene først i besvarelsen din. Lykke til med å brøyte deg gjennom denne eksamensoppgaven! FrodeH 4

Vedlegg: Halvferdig programkode (.tpl-fil) // INCLUDE: #include <fstream> // ifstream, ofstream #include <iostream> // cin, cout #include <cstring> // strcpy, strlen #include <cctype> // toupper using namespace std; // CONST: const int STRLEN = 80; // Max. tekstlengde. const int MAXKUNDER = 100; // Max. antall kunder. const int MAXOPPDRAG = 50; // Max. antall oppdrag hos EN kunde. class Kunde { // KLASSE: private: char navn[strlen/2]; // Kundens navn. char adr[strlen]; // Gateadresse. int tlf; // Telefon (fast eller mobil). int antoppdrag; // Antall oppdrag (hittil) hos kunden. int oppdrag[maxoppdrag+1]; // Datoene for oppdragene (på formen: MMDD). public: // Deklarasjon av medlemsfunksjoner: Kunde() { antoppdrag = 0; void lesdata(); // Oppgave 2B void skriv(); // Oppgave 2C bool registrer(int d); // Oppgave 2D void skriv2(int n); // Oppgave 2F void lesfrafil(istream* inn, char nvn[]); // Oppgave 2G void skrivtilfil(ostream* ut); ; // DEKLARASJON AV FUNKSJONER: void skrivmeny(); char les(char t[]); int les(const char t[], const int min, const int max); void les(const char t[], char s[], const int LEN); int lesdato(); // Oppgave 2A void nykunde(); // Oppgave 2B og 2E void skrivallekunder(); // Oppgave 2C void registreroppdrag(int d); // Oppgave 2D void skrivenkunde(); // Oppgave 2F void lesfrafil(); // Oppgave 2G void skrivtilfil(); // GLOBALE VARIABLE: Kunde kunder[maxkunder+1]; // Array med Kunde-objekter. int sistebrukt; // Indeks for siste Kunde hittil brukt. int main() { int dato; char kommando; // HOVEDPROGRAM: // Dagens dato på formen: MMDD. lesfrafil(); // Oppgave 2G dato = lesdato(); skrivmeny(); kommando = les("ønske"); while (kommando!= 'Q') { switch (kommando) { case 'N': nykunde(); break; // Oppgave 2B og 2E case 'A': skrivallekunder(); break; // Oppgave 2C case 'R': registreroppdrag(dato); break; // Oppgave 2D case 'S': skrivenkunde(); break; // Oppgave 2F case 'T': skrivtilfil(); break; default: skrivmeny(); break; kommando = les("ønske"); skrivtilfil(); cout << "\n\n"; return 0; 5

// ***************** DEFINISJON AV KLASSE-FUNKSJONER: ***************** void Kunde::lesData() { // Leser alle kundens data: // Oppgave 2B: Lag innmaten void Kunde::skriv() { // Skriver kundens data: // Oppgave 2C: Lag innmaten bool Kunde::registrer(int d) { // Registrerer ETT nytt oppdrag: // Oppgave 2D: Lag innmaten void Kunde::skriv2(int n) { // Skriver ALLE oppdrag eller kun EN gitt måned: // Oppgave 2F: Lag innmaten // Leser kunden fra fil: void Kunde::lesFraFil(istream* inn, char nvn[]) { // Oppgave 2G: Lag innmaten void Kunde::skrivTilFil(ostream* ut) { // Skriver kunden til fil: *ut << navn << '\n' << adr << '\n' << tlf << ' ' << antoppdrag; for (int i = 1; i <= antoppdrag; i++) *ut << ' ' << oppdrag[i]; *ut << '\n'; // ********************** DEFINISJON AV FUNKSJONER: ********************* void skrivmeny() { // Presenterer lovlige menyvalg: cout << "\n\nfølgende KOMMANDOER ER LOVLIG:\n"; cout << "\tn = Ny kunde\n"; cout << "\ta = skrivallekunder\n"; cout << "\tr = Registrer oppdrag\n"; cout << "\ts = Skriv EN kunde\n"; cout << "\tt = skriv Til filer\n"; cout << "\tq = Quit/avslutt\n"; char les(char t[]) { // Henter ett ikke-blankt upcaset tegn: char ch; cout << '\n' << t << ": "; // Skriver medsendt ledetekst. cin >> ch; cin.ignore(); // Leser ETT tegn. Forkaster '\n'. return (toupper(ch)); // Upcaser og returnerer. // Leser et tall i et visst intervall: int les(const char t[], const int min, const int max) { int n; do { // Skriver ledetekst: cout << '\t' << t << " (" << min << '-' << max << "): "; cin >> n; cin.ignore(); // Leser inn ett tall. while(n < min n > max); // Sjekker at i lovlig intervall. return n; // Returnerer innlest tall. // Leser en ikke-blank tekst: void les(const char t[], char s[], const int LEN) { do { cout << '\t' << t << ": "; cin.getline(s, LEN); // Ledetekst og leser. while (strlen(s) == 0); // Sjekker at tekstlengden er ulik 0. 6

int lesdato() { // Leser dag og måned. Returnerer på formen MMDD: // Oppgave 2A: Lag innmaten void nykunde() { // Legger/smetter (om mulig) inn en ny kunde: // Oppgave 2B og 2E: Lag innmaten void skrivallekunder() { // Skriver data om ALLE kundene: // Oppgave 2C: Lag innmaten void registreroppdrag(int d) { // Registrer oppdrag på kunde(r): // Oppgave 2D: Lag innmaten void skrivenkunde() { // Skriv (alt) om EN kunde: // Oppgave 2F: Lag innmaten void lesfrafil() { // Leser inn HELE datastrukturen: // Oppgave 2G: Lag innmaten void skrivtilfil() { // Skriver HELE datastrukturen til fil: ofstream utfil("vinter.dta"); // Åpner aktuell fil. cout << "\n\nskriver til filen 'VINTER.DTA'...\n\n"; for (int i = 1; i <= sistebrukt; i++) // Alle kundene skriver seg selv: kunder[i].skrivtilfil(&utfil); 7