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



Like dokumenter
Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Kontinuasjonseksamen

INF Uke 10. Ukesoppgaver oktober 2012

TOD063 Datastrukturer og algoritmer

Kontinuasjonseksamen

Kontinuasjonseksamen

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

TDT Prosedyre- og objektorientert programmering

2 Om statiske variable/konstanter og statiske metoder.

Kapittel 1 En oversikt over C-språket

Løsningsforslag for eksamensoppgave, våren 2004

TDT Prosedyre- og objektorientert programmering

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Introduksjon til objektorientert programmering

INF1000: noen avsluttende ord

TDT Prosedyre- og objektorientert programmering

INF5110. Oblig 2 presentasjon

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

Eksamensoppgave i IMT1082 Objekt-orientert programmering

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

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

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

INF Oblig 2 semantikksjekk og kodegenerering

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

HØGSKOLEN I SØR-TRØNDELAG

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

UNIVERSITETET I OSLO

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Kontinuasjonseksamen

Informasjon Eksamen i IN1000 høsten 2017

Programmeringsspråket C

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Oblig 4Hybelhus litt mer tips enn i oppgaven

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

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

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

UNIVERSITETET I OSLO

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Post-it spørsmål fra timen (Arv og subklasser)

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

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

UNIVERSITETET I OSLO

BOKMÅL Side 1 av 12. Fakultet for informasjonsteknologi,

UNIVERSITETET I OSLO

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Del 1 En oversikt over C-programmering

UNIVERSITETET I OSLO

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

TDT4100 Objektorientert programmering

Kontinuasjonseksamen

Del 3: Evaluere uttrykk

OO-eksempel. Modellen ser slik ut: Studenter + antstudenter : int = 0

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

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

KONTINUASJONSEKSAMEN

Finne ut om en løsning er helt riktig og korrigere ved behov

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Eksamen. Objektorientert Programmering IGR 1372

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

Obligatorisk Innlevering 2

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

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

Løse reelle problemer

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

UNIVERSITETET I OSLO

Fakultet for informasjonsteknologi, Tentativt løsningsforslag TDT4102 Prosedyre og objektorientert programmering. Fredag 6. juni 2008 Kl

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.

Informasjon Prøveeksamen i IN1000 høsten 2018

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Program delegate. Lage et nytt prosjekt i Visual Studio

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

TDT Prosedyre- og objektorientert programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

UNIVERSITETET I OSLO

To måter å programmere på. Java 12. Programmering med objekter. Statisk programmering

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

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Mer om C programmering og cuncurrency

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Transkript:

Programmering i C++ Eksamen høsten 2005 Simen Hagen Høgskolen i Oslo, Avdeling for Ingeniørutdanning 7. desember 2005 Generelt Denne eksamensoppgaven består av tre oppgaver, pluss en ekstraoppgave. Det er ikke nødvendig å gjøre ekstraoppgaven, men den kan gi ekstrapoeng. Hvis du ikke gjør ekstraoppgaven, eller hvis du svarer feil på den, gjør det ikke noe. Den kan kun telle positivt. For de vanlige oppgavene gjelder det at alle deloppgavene teller likt. 1 Pekere og arrays 1a) Forklar kort hvordan funksjonen a() virker, og hva den returnerer. 1 i n t a ( c o n s t char c ) 2 { 3 i n t i = 0 ; 4 while ( c [ i ] ) 5 ++ i ; 6 return i ; 7 } Funksjonen a() teller antall tegn i en NULL-terminert streng. While-løkken kjører så lenge uttrykket c[i] er forskjellig fra NULL ( \0 ). Variabelen i fungerer som en teller, og økes med en for hvert tegn som er forskjellig fra NULL. Når en kommer til slutten av strengen stopper løkken og verdien til i returneres. Funksjonen returnerer med andre ord lengden på en NULL-terminert streng, ikke inkludert NULL-terminatoren. 1

1b) Lag en funksjon som finner det største elementet i et array. Funksjonen skal kunne akseptere et array av en vilkårlig type (både innebygde og egendefinerte) og lengde, og returnere det elementet som er størst. Du kan gå ut i fra at typen du skal sjekke på har en operator<. 1 template <typename T> 2 T find_max ( c o n s t T a r r a y, i n t n ) 3 { 4 / / S j e k k om v i har m i n s t t o e l e m e n t e r i a r r a y e t 5 i f ( n < 2) 6 return a r r a y [ 0 ] ; 7 8 T c u r r e n t _ m a x = a r r a y [ 0 ] ; 9 f o r ( i n t i = 1 ; i < n ; ++ i ) { 10 i f ( c u r r e n t _ m a x < a r r a y [ i ] ) 11 c u r r e n t _ m a x = a r r a y [ i ] ; 12 } 13 return c u r r e n t _ m a x ; 14 } 1c) Forklar kort hva funksjon f() gjør, og hva den returnerer. 1 f l o a t f ( f l o a t g, i n t h ) 2 { 3 f l o a t i = 0 ; 4 f o r ( i n t j = 0 ; j < h ; ++ j ) { 5 i += ( g+ j ) / h ; 6 } 7 return i ; 8 } Argumentet g er et array med floats, og h er antall elementer i arrayet. Funksjonen henter ut hvert element i arrayet ( (g+j)), og deler på antall elementer (h). Funksjonen returnerer dermed et snitt av alle tallene i arrayet. 2

For å få ekstra poeng kan studenten nevne at det vil være mer effektivt å først legge sammen tallene i loopen, og dele på antallet etter at loopen er ferdig. En slipper da unna med kun en divisjon i stedet for h. 2 Skrive ut en fil Denne oppgaven går ut på å lage et lite program som leser inn en tekstfil og skriver denne ut til skjermen. Avhengig av argumentene til programmet skal hver linje i teksten skrives ut med eller uten linjenummer før innholdet på linjen. Oppgaven skal oppfylle følgende krav: 1. Det skal leses inn argumenter fra kommandolinjen (som et argument til programmet, ikke interaktivt under kjøring). Argumentene skal være: Navnet på filen som skal leses inn -n hvis det skal skrives ut linjenummer Filnavn må være med, men det skal ikke være nødvendig å skrive ut linjenummer.formatet på kommandoen kan være noe slikt som: skrivut [-n] <filename> 2. Filen skal åpnes, leses inn og lukkes. Du må håndtere muligheten for at filen ikke finnes. 3. Utskrift av tekstfilen. Her vil du eventuelt også sette inn linjenummeret, som skal skrives ut først på linjen, om det skal skrives ut. For denne delen er det viktig at du kan lese inn uendelig lange linjer. Du er fri til å bruke de klasser og funksjoner som C++ tilbyr når du skal løse denne oppgaven. Skriv programmet slik at det er lett å lese. Bruk gjerne kommentarer. 1 # i n c l u d e < i o s t r e a m > 2 # i n c l u d e < f s t r e a m > 3 # i n c l u d e < s t r i n g > 4 5 using namespace s t d ; 6 7 void 8 usage ( ) 9 { 10 c o u t << " Bruk : s k r i v u t [ n ] < f i l n a v n >" << e n d l ; 3

11 e x i t ( 0 ) ; 12 } 13 14 i n t main ( i n t argc, char argv [ ] ) 15 { 16 char f i l e n a m e = " " ; 17 i n t l i n j e n r = 0 ; 18 19 i f ( a r g c > 1) { 20 i f ( ( argv [ 1 ] [ 0 ] == ) && ( argv [ 1 ] [ 1 ] == n ) ) { 21 l i n j e n r = 1 ; 22 i f ( a r g c > 2) 23 f i l e n a m e = a rgv [ 2 ] ; 24 e l s e { 25 usage ( ) ; 26 } 27 } e l s e { 28 f i l e n a m e = a rgv [ 1 ] ; 29 } 30 } 31 32 i f s t r e a m i n ( f i l e n a m e ) ; 33 i f (! i n ) 34 c o u t << " c o u l d n o t open f i l e " << f i l e n a m e << e n d l ; 35 36 s t r i n g s t r ; 37 while ( i n ) { 38 g e t l i n e ( in, s t r ) ; 39 40 i f ( l i n j e n r ) 41 c o u t << l i n j e n r ++ << " " ; 42 43 c o u t << s t r << e n d l ; 44 } 45 i n. c l o s e ( ) ; 46 } 3 En Stack klasse I denne oppgaven skal du lag en Stack-klasse. Du skal bruke en node-peker (liste) struktur for å lagre dataene i stacken. Stacken skal være template-basert. Du skal gjøre følgende oppgaver: 4

1. Lag klassedeklarasjonene med alle funksjoner og variabler som trengs (alt det som vanligvis finnes i en header-fil). 2. Lag det som trengs av konstruktører og destruktører. 3. Lag en funksjon push() som legger nye elementer inn på stacken. 4. Lag en funksjon pop() som fjerner et element fra stacken. Etter pop() skal det finnes et element mindre på stacken. 5. Lag en funksjon empty() som returnerer true hvis det ikke finnes noen elementer på stacken, og false hvis det finnes elementer på stacken. Du kan anta at elementene som skal lagres på stacken kan kopieres. Stack.h 1 template <typename T> 2 c l a s s Node 3 { 4 p u b l i c : 5 T d a t a ; 6 Node n e x t ; 7 8 Node ( T d, Node n = NULL) 9 : d a t a ( d ), 10 n e x t ( n ) 11 {} 12 13 } ; 14 15 template <typename T> 16 c l a s s S t a c k 17 { 18 p r i v a t e : 19 Node<T> head ; 20 21 p u b l i c : 22 S t a c k ( ) ; 23 ~ S t a c k ( ) ; 24 25 void push ( T i tem ) ; 26 T pop ( ) ; 27 bool empty ( ) c o n s t ; 5

28 } ; Stack.cpp 1 # i n c l u d e < i o s t r e a m > 2 using namespace s t d ; 3 4 # i n c l u d e " S t a c k. hpp " 5 6 template <typename T> 7 Stack <T > : : S t a c k ( ) 8 : head (NULL) 9 { 10 } 11 12 template <typename T> 13 Stack <T > : : ~ S t a c k ( ) 14 { 15 while (! empty ( ) ) { 16 pop ( ) ; 17 } 18 } 19 20 template <typename T> 21 void 22 Stack <T > : : push ( T item ) 23 { 24 head = new Node<T>( item, head ) ; 25 } 26 27 template <typename T> 28 T 29 Stack <T > : : pop ( ) 30 { 31 T d a t a = head >d a t a ; 32 Node<T> n = head ; 33 head = head >n e x t ; 34 d e l e t e n ; 35 return d a t a ; 36 } 37 38 template <typename T> 39 bool 6

40 Stack <T > : : empty ( ) c o n s t 41 { 42 return head == NULL; 43 } 44 45 i n t main ( ) 46 { 47 Stack < i n t > s t a c k ; 48 49 f o r ( i n t i = 1 ; i < 1 0 ; ++ i ) { 50 s t a c k. push ( i ) ; 51 } 52 53 Stack < i n t > s t = s t a c k ; 54 55 c o u t << " P r i n t i n g s t a c k \ n " ; 56 while (! s t a c k. empty ( ) ) { 57 c o u t << s t a c k. pop ( ) << e n d l ; 58 } 59 60 c o u t << " \ n \ n P r i n t i n g s t \ n " ; 61 while (! s t. empty ( ) ) { 62 c o u t << s t. pop ( ) << e n d l ; 63 } 64 65 return 0 ; 66 } 4 Deklarasjoner 4a) Forklar hva disse deklarasjonene betyr: 1. int f ; 2. int f = 0; 3. int f (); 4. int f () = 0; 5. int f [] = {0}; 7

4b) 1. Deklarering av integer-variabelen f. f får en udefinert verdi. 2. Deklarering av integer-variabelen f, som får initialverdien 0. 3. Deklarering av funksjonen f, som returnerer en int og som ikke tar noen argumenter. 4. Deklarering av pure virtual funksjonen f, som returnerer en int og som ikke tar noen argumenter. Denne deklarasjonen må være en del av en klasse for å fungere, og vil da gjøre klassen til en abstract base class, som vil si at det ikke kan lages instanser av denne klassen. Funksjonen f må implementeres i klasser som arver denne klassen. 5. Deklarering av arrayet f, av type int. Arrayet får her kun et element med initialverdien 0. Gitt følgende kode: 1 char c [ ] = " H e l l o World! " ; 2 char pc = &c [ 2 ] ; Hva skriver de følgende uttrykkene til skjermen? 1. cout << c; 2. cout << c [3]; 3. cout << pc; 4. cout << (pc 2); 5. cout << pc 2; 1. cout << c; Hello World! 2. cout << c [3]; l 3. cout << pc; llo World! 4. cout << (pc 2); H 5. cout << pc 2; 106 8

5 Ekstraoppgave Denne oppgaven er en ekstraoppgave. Det er ikke nødvendig å gjøre den, men det gir ekstra poeng hvis du gjør det. Hvis du svarer feil på oppgaven vil det ikke telle negativt. Nedenfor er det et enkelt lite program. Programmet kompilerer og kjører helt fint, men fungerer kanskje ikke helt som planlagt. Hva går galt? Hvorfor? Forklar så godt du kan hva som skjer. 1 # i n c l u d e < i o s t r e a m > 2 3 c l a s s P e r s o n 4 { 5 p u b l i c : 6 ~ P e r s o n ( ) { } 7 } ; 8 9 c l a s s Englishman 10 : p u b l i c P e r s o n 11 { 12 p u b l i c : 13 v i r t u a l ~ Englishman ( ) { 14 s t d : : c o u t << ( " Goodbye \ n " ) ; 15 } 16 } ; 17 18 c l a s s J a p a n e s e 19 : p u b l i c P e r s o n 20 { 21 p u b l i c : 22 v i r t u a l ~ J a p a n e s e ( ) 23 { 24 s t d : : c o u t << ( " Sayonara \ n " ) ; 25 } 26 } ; 27 28 c l a s s German 29 : p u b l i c P e r s o n 30 { 31 p u b l i c : 32 v i r t u a l ~German ( ) 33 { 34 s t d : : c o u t << ( " Auf Wiedersehen \ n " ) ; 35 } 9

36 } ; 37 38 i n t main ( ) 39 { 40 P e r s o n p = new J a p a n e s e ; 41 d e l e t e p ; 42 p = new German ; 43 d e l e t e p ; 44 return 0 ; 45 } Her ser koden grei ut, men til tross for det vi skulle tro, blir det ikke skervet ut noe til skjermen. Grunnen til dette er at vi ikke har deklarert destructoren i Person som virtuell. I main funksjonen lager vi en peker til Person, men en instans av for eksempel Japanese. Siden destructoren i Person ikke er virtuell, bruker kompliatoren static linkage, det vil si at den linker direkte til Persons destruktør. Denne destruktøren skriver ikke ut noe, og det gjør heller ikke programmet. For at programmet skulle fungeret slik det sansynligvis var tenkt, må også destruktøren i Person gjøres virtuell. Da vil kompilatoren bruke dynamic linkage, og hvilken destruktør som skal kalles blir bestemt runtime, avhengig av typen til objektet det blir pekt til. 10