HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING Eksamensoppgave i kurset: Programmering i C++. Fagnr: LV 121 A Eksamensdato: 10 februar, 2003. Faglærer: Cecilie Rolstad Antall oppgaver: 5 Antall sider, inkludert denne: 4 Tillatte hjelpemidler: Alle trykte og skrevne. 1
Oppg. 1. Dynamisk allokerte data. Templateklasser (30%) Vi ønsker å registrere en liste med navn. Vi kjenner ikke alltid på forhånd hvor mange registreringer som er nødvendig. Programer en klasse Array som inneholder følgende private variable: en peker s til en endimensjonal stringarray, en int kapasitet, og en int brukt. Klassen skal videre inneholde en default konstruktør, en parameterisert konstruktør hvor parameteren angir størrelsen på arrayet, og en kopieringskonstruktør som utfører deep copy. Klassen skal også inneholde følgende fire medlemsfunksjoner: en som legger et element inn i arrayet, en som returnerer true/false hvis arrayet er fullt, en som returnerer kapasiteten på arrayet, og en som returnerer antall elementer i arrayet som er i bruk. Klassen skal overstyre assignmentoperatoren =, og ha en destruktør. a) Deklarere klassen som angitt over i en fullstendig header -fil. b) Implementere klassen i en fullstendig implementeringsfil. c) Deklarere klassen som en template i en ny fullstendig header -fil. d) Skriv et fullstendig program inneholdene en main funksjon hvor templateklassen i punkt c) brukes for typen string. Be brukeren taste inn et navn, og legg dette inn i arrayet. Oppg. 2. Pekere (10 %) a) Deklarere en pekervariabel p og initialiser den til å peke på en char variabel med navn ch. b) Deklarere en pekervariabel q og initialiser den til å peke på det første elementet av en long array med navn arr. c) Skriv en if test som sammenligner to dynamiske integervariable som er pekt på av variablene a og b, og som legger den minste av de to inn i en integervariabel med navn minst, og deretter sletter de to originale dynamiske variablene. d) Hva skrives ut her? #include <iostream> using namespace std; int main() { int m; int n; int* p = &m; int* q; *p = 27; cout << *p << endl; q=&n; n=54; cout<< *p << << *q << endl; p=&n; *p=6; cout << *p << << n << endl; return 0; } e) Deklarere en peker t som peker på en firedimensjonal integerarray. 2
Oppg. 3. Funksjonstemplates (5 %) a) Deklarere og definer en templatefunksjon med navnet minimum som returnerer den minste av to argumenter. b) Er minimum gyldig for alle klasser? Begrunn svaret. Oppg. 4. Teorispørsmål. (25 %) NB! Svar kort og presist på spørsmålene, ikke lange utredninger! a) Ved polymorfi og funksjonsoverstyring bestemmes hvilken funksjon som skal brukes når programmet kjører. Hvordan bestemmes i prinsippet dette for begge de to variantene? b) Hva er forskjellen på deep copy og shallow copy? c) Når bør man implementere en destructor, og hvorfor? d) Hva er forskjellen på call-by-value og call-by-reference parametere i en funksjon? e) Hvorfor er det noen ganger nødvendig å overstyre f.eks + for en klasse? f) Hva er forskjellen på en medlemsfunksjon og en friend funksjon i en klasse? g) Hvorfor benyttes namespaces i C++? h) Ved separat kompilering, hva legges typisk i en header -fil og hva i en implementeringsfil? i) Hva er en dangling pointer? j) Hvordan er en C-string lagret? Oppg. 5. Programmering: Todimensjonal array, I/O, tekstformattering. (30 %) Det skal velges en ny rektor på Høyskolen i Annerledeslandet. Høyskolen har 4 avdelinger, bygg, kjemi, data og maskin, og det er 4 kandidater til rektorstillingen, Hansen, Olsen, Pettersen og Anandakrisnan. Inndata: De avgitte stemmene ligger i en fil stemmer.txt, som to heltall, ett representerer avdelingen fra 1 til 4 ( bygg representeres ved 1, kjemi 2, data 3, maskin 4), og det andre heltallet representerer på tilsvarende måte kandidaten det er stemt for. Eksempel på innfil stemmer.txt : 1 3 2 4 3 4 2 3 1 3 Kandidatenes navn tastes inn av brukeren. Funksjonalitet: Vi ønsker å analysere stemmegivningen fra hver avdeling ved å besvare følgende spørsmål: Hvor mange stemmer fikk hver kandidat fra hver avdeling? 3
Hvor mange stemmer fikk hver kandidat totalt? Hvor mange stemmer ble avlagt totalt ved hver avdeling? Data struktur: Opprett en todimensjonal integerarray for kandidater og avdelinger, hvor antall stemmer fra hver avdeling for hver kandidat telles opp etterhvert som stemmeavgivningen leses fra fil. Opprett en endimensjonal stringarray hvor kandidatnavnene legges inn for senere å skrives til fil. Utdata: Det skal skrives en fil rapport.txt som inneholder: en tabell med avdelingene og antall stemmer per kandidat, deretter fire linjer som angir totalt antall stemmer for hver kandidat, deretter fire linjer med totalt antall stemmer avgitt ved avdelingen. Eksempel på utfil rapport.txt : Hansen Olsen Pettersen Anandakrisnan Avdeling 1 2 2 1 1 Avdeling 2 2 2 2 1 Avdeling 3 1 2 2 1 Avdeling 4 1 1 3 6 Totalt antall stemmer for Hansen: 6 Totalt antall stemmer for Olsen: 7 Totalt antall stemmer for Pettersen: 8 Total antall stemmer for Anandakrisnan: 9 Total antall stemmer fra Avdeling 1: 6 Total antall stemmer fra Avdeling 2: 7 Total antall stemmer fra Avdeling 3: 6 Total antall stemmer fra Avdeling 4: 11 Del programmet opp følgende funksjoner som kalles i main (funksjonsnavnene angir hva funksjonene utfører): opne_innfil opne_utdatafil tastinn_kandidatnavn init_2d (initierer 2D arrayen til 0) lesfil_til2d (les stemmeavgivning fra innfil til 2D arrayen) skriv_utfil Definer funksjonene med nødvendige parametere. Programmer de nevnte funksjonene og main funksjonen slik at det utgjør et kjørbart program. Oppgavesett slutt. 4
5