Løsningsforslag for eksamensoppgave, våren 2004

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

HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING

2 Om statiske variable/konstanter og statiske metoder.

INF Notater. Veronika Heimsbakk 10. juni 2012

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Objekter og referanser

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Seminaroppgaver IN1010, uke 2

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

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

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

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

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

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

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

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

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

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

Program delegate. Lage et nytt prosjekt i Visual Studio

UNIVERSITETET I OSLO

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

2 Om statiske variable/konstanter og statiske metoder.

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

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

Del 1 En oversikt over C-programmering

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

IN1010 våren januar. Objektorientering i Java

OPPGAVESETT 7 OBJEKTER OG REFERANSER

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

INF våren 2017

Løsnings forslag i java In115, Våren 1996

UNIVERSITETET I OSLO

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

INF1010 Binære søketrær ++

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Mer om C programmering og cuncurrency

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Enkle generiske klasser i Java

Kapittel 1 En oversikt over C-språket

INF1010 våren januar. Objektorientering i Java

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

INF1000: noen avsluttende ord

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

INF1000: noen avsluttende ord

Sortering med tråder - Quicksort

Algoritmer og datastrukturer Eksamen

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

IN våren 2019 Onsdag 16. januar

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

IN våren 2018 Tirsdag 16. januar

Sortering med Comparable og Comparator

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN2030. Oppgave 1. Løsningsforslag. Uke (Disse filene finnes også i mappen ~inf2100/e/e2/.)

HØGSKOLEN I SØR-TRØNDELAG

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

INF1010. Stein Michael Storleer (michael) Lenkelister

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Anatomien til en kompilator - I

Kontinuasjonseksamen

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Algoritmer og datastrukturer Eksamen

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

Runtime-omgivelser Kap 7 - II

Del 4 Noen spesielle C-elementer

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

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Dagens tema: Kjøresystemer II

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

2. Pekere og referanser.

HØGSKOLEN I SØR-TRØNDELAG

TDT Prosedyre- og objektorientert programmering

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

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

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Runtimesystemer - II. Parameteroverføring Call by value Call by reference Call by value-result Call by name INF 3110/ INF

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

Algoritmer og datastrukturer Løsningsforslag

Grunnleggende Datastrukturer

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Transkript:

Løsningsforslag for eksamensoppgave, våren 2004 Simen Hagen Høgskolen i Oslo, Avdeling for Ingeniørutdanning Oppgave 1 Node.h // I oppgaven i n d i k e r e s d e t a t en s k a l kunne l a g r e t a l l, så j e g har v a l g t // å l a g r e i n t e g e r s. Vi kunne g o d t ha b r u k t noe annet ( f. e k s. f l o a t ). // Implementasjonen v i l l e vært den samme. Om en v i r k e l i g s k u l l e g j o r t d e t // b r a hadde en b r u k t t e m p l a t e s, men d e t e r i k k e d e t oppgaven s p ø r e t t e r. class Node public : Node ( int t ) ; ~Node ( ) ; int v a l u e ; Node * next ; Node * prev ; ; Node.cpp Node : : Node ( int t ) : v a l u e ( t ), next (NULL), prev (NULL) Node : : ~ Node ( ) i f ( next ) delete next ; List.h class L i s t public : L i s t ( ) ; ~ L i s t ( ) ; i n s e r t _ f i r s t ( int t ) ; 1

i n s e r t _ l a s t ( int t ) ; i n s e r t _ s o r t ( int t ) ; g e t _ f i r s t ( ) ; g e t _ l a s t ( ) ; get_next ( ) ; get_prev ( ) ; int get_ current_ value ( ) const ; s e t _ c u r r e n t _ f i r s t ( ) ; s e t _ c u r r e n t _ l a s t ( ) ; i s _ c u r r e n t ( ) const ; f i n d ( int t ) const ; remove ( int t ) ; operator ++(); operator (); private : Node * head ; Node * t a i l ; Node * c u r r e n t ; ; List.cpp // Denne oppgaven e r l a g e t f o r å t e s t e s t u d e n t e n e s kunnskaper om f o r s k j e l l i g e // a s p e k t e r ved C++. Løsningen e r o gså l a g e t f o r å være e n k e l og // f o r s t å. D e s i g n e t av L i s t k l a s s e n e r d e r f o r i k k e i d e e l, og d e t e r // f l e r e p r o b l e m e r med p r a k t i s k b r u k av denne k l a s s e n. Det v i s e s t i l // b ø k e r om a l g o r i t m e r og d a t a s t r u k t u r e r f o r i n f o r m a s j o n d e s i g n og // i m p l e m e n t a s j o n av l i s t e k l a s s e r. // Oppgave a L i s t : : L i s t ( ) : head ( NULL ), t a i l ( NULL ), c u r r e n t ( NULL ) L i s t : : ~ L i s t ( ) // Vi s l e t t e r kun head, så s l e t t e s r e s t e n a u t o m a t i s k i f ( head ) delete head ; // Oppgave b L i s t : : i n s e r t _ f i r s t ( int t ) 2

i f (! head ) head = node ; t a i l = node ; else node >next = head ; head >prev = node ; head = node ; // Opggave c L i s t : : i n s e r t _ l a s t ( int t ) i f (! head ) head = t a i l = node ; else t a i l >next = node ; node >prev = t a i l ; t a i l = node ; // Oppgave d L i s t : : i n s e r t _ s o r t ( int t ) using namespace s t d ; i f ( head ) Node * runner = head ; while ( runner && ( runner >v a l u e < t ) ) runner = runner >next ; i f ( runner == NULL) // s e t t inn b a k e r s t i n s e r t _ l a s t ( t ) ; else i f ( runner >v a l u e < t ) // t s k a l inn e t t e r runner node >next = runner >next ; runner >next = runner ; node >prev = runner ; i f ( node >next ) node >next >prev = node ; else // t s k a l inn f ø r runner i f ( runner >prev ) node >next = runner ; 3

node >prev = runner >prev ; runner >prev >next = node ; runner >prev = node ; else // runner e r d e t f ø r s t e o b j e k t e t i l i s t e n i n s e r t _ f i r s t ( t ) ; else // l i s t e n e r tom, så s e t t inn f ø r s t i n s e r t _ f i r s t ( t ) ; // Oppgave e 1 // g å r t i l d e t f ø r s t e e l e m e n t e t L i s t : : g e t _ f i r s t ( ) c u r r e n t = head ; // Oppgave e 2 // g å r t i l d e t s i s t e e l e m e n t e t L i s t : : g e t _ l a s t ( ) c u r r e n t = t a i l ; // Oppgave e 3 // g å r t i l d e t n e s t e e l e m e n t e t L i s t : : get_next ( ) i f ( c u r r e n t ) c u r r e n t = c u r r e n t >next ; return f a l s e ; // Oppgave e 4 // g å r t i l d e t f o r r i g e e l e m n e t e t L i s t : : get_prev ( ) // v i må s j e k k e om c u r r e n t! = NULL f o r å unngå f e i l. i f ( c u r r e n t ) c u r r e n t = c u r r e n t >prev ; 4

return f a l s e ; // Oppgave f L i s t : : f i n d ( int t ) const Node * runner = head ; while ( runner && runner >v a l u e! = t ) runner = runner >next ; // Hvis runner == NULL f a n t v i i k k e t a l l e t, og h v i s runner har en annen // v e r d i f a n t v i en node med k o r r e k t v e r i d. // Testen runner! = NULL v i l r e t u r n e r e t r u e h v i s v i f a n t o b j e k t e t, og f a l s e // h v i s v i i k k e f a n t d e t. return runner! = NULL; // Oppgave g L i s t : : remove ( int t ) // Finn den k o r r e k t e noden Node * node = head ; while ( node && node >v a l u e! = t ) node = node >next ; // og f j e r n dne h v i s den b l e f u n n e t. i f ( node ) i f ( node == head ) head = head >next ; node >next = NULL; delete node ; else i f ( node == t a i l ) t a i l = t a i l >prev ; t a i l >next = NULL; delete node ; else node >prev >next = node >next ; // f o r å unngå å s l e t t e a l t som kommer e t t e r node, må v i s e t t e // node >n e x t = NULL node >next = NULL; delete node ; // Oppgave h L i s t : : operator ++() return get_next ( ) ; 5

// Oppgave i L i s t : : operator () return get_prev ( ) ; Oppgave 2 A Main-funksjonen er den første funksjonen som blir kallt i programmet vårt, og er altså hvor de første linjene i programmet vårt benner seg. Alle C/C++programmer må ha en main-funkjson (eller en tilsvarende oppstartsfunkjson. Microsoft Windows bruker en funksjon som heter WinMain, den tar ere parametere enn en vanlig main-funksjon). En minimal main-funksjon kan se slik ut: int main ( ) return 0 ; B 1. Det allokeres minne. Hvis vi bruker List-klassen i fra oppgave en ovenfor, allokeres det sizeof(list) bytes. 2. Deretter initialiseres minnet med standardkonstruktøren. Det er mulig å kalle andre konstruktører enn standardkonstruktøren, f.eks. slik List* l = new List(3); C Det er alltid viktig å unngå minnetap, men det er noen situasjoner som det er spesiellt viktig å passe på å slette alt minne som en ikke lenger trenger. Her er noen eksempler på situasjoner hvor det er ekstra viktig å passe på hva en gjør: ˆ Vi lager et program som skal kjøre over lengre tid. Dette kan være ting som en service til operativsystemet, eller f.eks. en nettleser som kjøres i mange dager uten å avslutte. Siden programmene kjører så lenge blir heller ikke minne frigjort når en avlustter, og at minne som går tapt for systemet (intill en restart av programmet/operativsystemet gjøres). ˆ Vi opererer i et miljø hvor det er lite minne tilgjengelig. Spesiellt enheter som mobiltelefoner, PDAer o.l. har lite minne å ta av, og det 6

er dermed viktig at vi ikke bruker mer minne enn nødvendig til enhver tid. Slike enheter står også ofte på lenge, så det er lang tid mellom hver gang det blir ryddet opp. ˆ Vi lager programmer som bruker veldig mye minne. Det er viktig å frigjøre minne slik at systemet ikke går tomt for fritt minne. D 1. En wild pointer er en peker som peker til noe som er søppel. 2. En wild pointer kan oppstå på tre måter: (a) En uinitialisert peker som inneholder søppel. (b) En peker er (feilaktig?) blitt overskrevet med en verdi som er søppel. (c) Pekeren refererer til noe som ikke lenger eksisterer (dette er en dangling pointer). E Linje 5 En må en bruke *j = 7; for å gi j verdien 7. Linje 6 har samme problem som linje 7, en må bruke *j. Linje 7 returnerer en referanse til et lokalt objekt. Linje 8 blir aldri kalt på grunn av return statementet ovenfor. Dermed får en også minnetap i funksjonen, fordi j aldri blir slettet. 7