Løsningsveiledning for eksamensoppgaven i INF

Like dokumenter
EKSAMENSOPPGAVE. INF-1400 Objektorientert Programmering. Dato: Tirsdag 23. mai Klokkeslett: Kl 17:00-21:00. Adm. bygget, Aud.

EKSAMENSOPPGAVE. INF-1400 Objektorientert Programmering. Dato: Torsdag 29. september Klokkeslett: Kl 09:00-13:00.

EKSAMENSOPPGAVE. Eksamen i: INF-1400 Objektorientert programminering Dato: Mandag 26. mai 2014 Tid: Kl 09:00-13:00 Sted: Adm.

EKSAMENSOPPGAVE. Adm.bygget, rom K1.04 og B154 Ingen. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl.

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl. 10

EKSAMENSOPPGAVE. : INF-1400 Objektorientert programmering. Oppgavesettet er på 5 sider inklusiv forside

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: NEI

Objektorientert programmering i Python

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

INF1000 Eksamen 2014 (modifisert)

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Ingen. Elektronisk (WiseFlow) Robert Pettersen

UNIVERSITETET I OSLO

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

INF1000 Eksamen 2014 (modifisert)

Etter uke 9 skal du. Introduksjon til objektorientert programmering. Innhold. Klasser som abstraksjoner

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Informasjon Eksamen i IN1000 høsten 2017

UNIVERSITETET I OSLO

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

IN1000 Obligatorisk innlevering 7

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Eksamensoppgaver 2014

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Informasjon Prøveeksamen i IN1000 høsten 2018

UNIVERSITETET I OSLO

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

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

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

TDT Datateknologi, programmeringsprosjekt

UNIVERSITETET I OSLO

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Teorifagb, hus 3, og og Adm.bygget, Aud.max og B.

UNIVERSITETET I OSLO

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

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

Læringsmål uke 7. Introduksjon til objektorientert programmering. Paradigmet objektorientering. Objektreferanser. INF1001 Høst 2016 Uke 7

Øvingsforelesning 5 Python (TDT4110)

UNIVERSITETET I OSLO

Mattespill Nybegynner Python PDF

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

UNIVERSITETET I OSLO

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Øvingsforelesning 5 Python (TDT4110)

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

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

Med Svarforslag UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. 3 sider (side 6, 7 og 8, rives ut, fylles ut og leveres)

Hvorfor objektorientert programmering?

MAT-INF 1100: Obligatorisk oppgave 1

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

Fra problem til program

INF Obligatorisk innlevering 7

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oppgave 1. Sekvenser (20%)

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

UNIVERSITETET I OSLO

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

TDT Prosedyre- og objektorientert programmering

Algoritmer og Datastrukturer

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

Oppgaver uke 1: Løsningsforslag

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INNFØRING I PRINSIPPER FOR OBJEKTORIENTERT PROGRAMMERING EMILIE HALLGREN OG KRISTIN BRÆNDEN

Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din.

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

INF2820 Datalingvistikk V2016. Jan Tore Lønning

TDT4110 IT Grunnkurs Høst 2015

EKSAMEN. Objektorientert programmering


Obligatorisk oppgave 4: Lege/Resept

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

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

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

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

TDT Prosedyre- og objektorientert programmering

TDT4110 IT Grunnkurs Høst 2016

TDT4110 IT Grunnkurs Høst 2016

UNIVERSITETET I OSLO

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

TDT4110 IT Grunnkurs Høst 2012

INF120: Oblig 3. Yngve Mardal Moe

Transkript:

Løsningsveiledning for eksamensoppgaven i INF-1400 2012-05-24. Denne veiledningen er ment å hjelpe for å forstå hvordan eksamensoppgaven det året var bygd opp og hvordan man kunne løse den. For å gjøre dette har jeg beholdt originaloppgaven og lagt til løsningsforslaget. Mørk rød tekst angir forklaringer på oppgaven. / John Markus Bjørndalen, 2014-05-12 Side 1 av 11

Denne første delen angir vanlig bakgrunnsinformasjon. Den angir hvordan man kan besvare det (de angitte språkene var der siden det var morsmålet for noen av studentene). Det viktige under er at man ikke trenger å besvare med korrekt Python-kode. Dette er ikke et Python-kurs, derfor testes man ikke på om man husker ting som hvordan range fungerte osv. Det viktige var algoritmene og prinsippene bak objektorientert programmering. Les gjennom hele oppgavesettet før du begynner å løse oppgavene. Oppgavene kan besvares på Norsk, Engelsk, Svensk eller Dansk. I besvarelsen kan du bruke Python, pseudokode eller en kombinasjon. Noen norske termer som er brukt i stedet for de engelske fra boka: - Klasse class - Arv inheritance - Atributt Attribute - Metode - Method Del A, Nobina tar over Denne første biten angir litt bakgrunnsinformasjon. Noe av det er en setting som gjør at man får noen knagger å henge ting på (og kanskje enklere å se at man tenker logisk). Det andre forteller litt om hva som skal gjøres i oppgaven. Det viktigste er: ikke overdriv og legg til ting som det ikke blir spurt om i oppgaven. Dere trenger f.eks. ikke å legge ting dører, billettsystem, regnummer og andre ting for busser. Nobina har tatt over bussdriften i Tromsø, og som vanlig er når man gjør større omlegginger dukker utfordringer opp. Vi skal nå jobbe med et program som hjelper oss å holder oversikt over forsinkelser og andre utfordringer. Vi forenkler også problemene slik at vi ikke trenger å forholde oss til virkelige praktiske problemer (som f.eks. at bussene ikke starter og avslutter alle r på samme sted). Merk at fokus er på objektorientering og bruk av datastrukturene vi bygger opp. Det er ikke anbefalt å prøve å utvide oppgaven på eksamen (som for eksempel å legge flere detaljer enn nødvendig i klassene). Side 2 av 11

Definisjon av oppgaven Her begynner det som er viktig. Allerede nå kan det være lurt å ta fram et kladdeark og skissere klassene som er angitt under slik at dere har oversikt. Man kan for eksempel bruke noe UML-lignende ala dette: park busser[] Forsinkelse tidspunkt minutter Innstilling tidspunkt Rute nummer Dette vil ikke være en del av besvarelsen i seg selv, men gjør det lettere å ordne neste del. Vi definerer følgende klasser: park har en liste over busser. en buss skal ha en liste over hendelser, som kan være forsinkelser eller innstillinger. Den har også en en referanse til n den kjører i øyeblikket. Forsinkelse siden en buss kan kjøre flere r må vi registrere følgende:, tidspunkt og hvor mange minutter forsinkelsen er på. Innstilling her registrerer vi og tidspunkt. Rute - har et nummer (vi trenger ikke flere detaljer i denne oppgaven) I oppgavene under er selve oppgaven angitt i fet tekst (boldface), mens forklarende tekst er angitt som normal tekst. Side 3 av 11

Legg merke til vektingen av hver besvarelse. Den angir hvor mye Oppgave 1 (15%) Noen av bussene kan ikke kjøre effektivt med kjetting. En del av forsinkelsene skjer når disse bussene kjører r med mange bakker. For å skaffe oss bedre oversikt ønsker vi å skille mellom busstyper. Vi skal derfor introdusere to nye klasser El og Lang hvor langbussene er de eneste som kan kjøre med kjetting hele dagen. ene trenger nå en metode som returnerer True for busser som kan bruke kjetting. Vi kaller denne metoden kanbrukekjetting(). Den andre endringen vi skal gjøre er å generalisere Forsinkelse og Innstilling slik at det blir enklere å jobbe med dem. Vi gjør dette ved å introdusere en ny klasse Hendelse. Alle hendelses-objekter skal ha en metode vi kan kalle for å sjekke om forsinkelsen er lengre enn et angitt antall minutter, denne kaller vi forsinketlengreenn(minutter). For innstillingsobjekter vil denne bestandig returnere True, mens for forsinkelses-objekter må vi sammenligne de angitte minuttene med hvor mange minutter som er angitt i forsinkelsesobjektet. Forklar kort ved hjelp av et klassediagram hvordan du kan bruke arv når du legger til a) Hendelse og b) de nye -klassene. Det er kun behov for å fokusere på arv og på attributtene til klassene siden vi skal jobbe med metodene senere. Vi tester her basal forståelse for arv og klasser. Teksten over angir at vi kun skal fokusere på attributter og arv. Dermed blir dette enkelt, og det under er en fullgod besvarelse. a) Når vi introduserer Hendelse flytter vi alle felles attributter over i den slik at Innstilling og Forsinkelse arver fra den. Vist som her: Hendelse tidspunkt Forsinkelse minutter Innstilling Side 4 av 11

b) Når vi introduserer de to nye bussklassene skal de arve fra. Ingen av dem introduserer noen nye attributter som vi trenger å ta hensyn til her. Dermed blir klassediagrammene som følger. El Lang Oppgave 2 (10%) I oppgaven over brukte vi to måter å endre på klassehierarkiet på. a) Generalisering var den ene, hva er navnet på den andre? b) Hva er forskjellen på disse to? Vi trenger bare en kort forklaring av hovedforskjellen, ikke en lang utdypende forklaring. Svarene trenger ikke å være lange. Det som står under er nok (spesielt når jeg ber om korte svar). a) Spesialisering. b) Generalisering er når vi lager en felles base/parent-klasse for et sett med klasser slik at de arver fra baseklassen. Man samler felles funksjonalitet i attributter i baseklassen. Spesialisering er når man lager underklasser (child class) av en eksisterende klasser. Eventuelt kan dere koble det til hvor dere brukte generalisering og spesialisering over. Oppgave 3 (15%) Implementer klassene vi har spesifisert i oppgave 1. Du trenger ikke å ta med noen andre metoder enn init () og metodene vi spesifiserte i oppgave 1 siden vi skal jobbe videre med klassene senere. Følgende er en kjapp kladdeimplementasjon, så jeg har ikke sjekket om det vil fungere korrekt Python-kode. Den viser likevel det vi er ute etter i besvarelsen, hvorav de viktigste er: Dere får lagd klasser som kan initialisere objekter, og at hver klasse initialiserer de rette attributtene. Dere får vist arv (arving av attributter, angiving av arv når dere lager klasser) At de rette klassene arver fra de rette parent-klassene (hierarkiet er korrekt) Side 5 av 11

At metodene er på korrekt sted og gjør rett ting i forhold til spesifikasjonen. F.eks. hvordan og hvor dere implementerer forsinketlengreenn. # Det er ikke angitt noe sted at man skal ta med initielle verdier # til attributtene i init, derfor kan vi godt utelate det og # anta at det settes på et eller annet vis i koden ellers. class Hendelse(object): self. = None self.tidspunkt = None def forsinketlengreenn(self, minutter): # Dette er "optional" siden det ikke er spesifisert i # oppgaven, men det er ofte en god idé å kaste en # exception hvis det ikke er meningen at noen skal # bruke metoden i baseklassen. raise Exception("not allowed on the base class") class Forsinkelse(Hendelse): Hendelse. init (self) self.minutes = None def forsinketlengreenn(self, minutter): return self.minutes > minutter class Innstilling(Hendelse): Hendelse. init (self) def forsinketlengreenn(self, minutter): return True class (object): self. = None self.hendelser = [] def kanbrukekjetting(self): # Annet alternativ til default-metode: returner noe som # gir mening for de fleste underklassene. return False class Lang():. init (self) def kanbrukekjetting(self): return True class El():. init (self) Side 6 av 11

class park(object): self.busser = [] Oppgave 4 (10%) Tegn opp en datastruktur med et lite antall busser, r, forsinkelser og innstillinger. Du trenger ikke angi verdier for alle attributtene i alle objektene. Her viser dere at dere forstår forskjellen på arv og på initialiserte objekter. Vi tar utgangspunkt i en park og viser hvordan den inneholder flere busser som kanskje har hendelser. Videre viser vi hvordan objektene er koblet sammen i minnet når vi har satt opp et antall objekter (f.eks. hvordan busser kan være koblet opp mot r og forsinkelser mot r). For tidspunkt (ikke angitt i figuren under) kan dere f.eks. skrive 20:35 og lignende, eller dato og tidspunkt. Side 7 av 11

park busser[] Forsinkelse tidspunkt = minutter = 10 Rute nummer = 21 Forsinkelse tidspunkt = minutter = 7 Forsinkelse tidspunkt = minutter = 20 Rute nummer = 42 Innstilling tidspunkt = Rute Rutenummer = 9 Side 8 av 11

Oppgave 5 (15%) Fylkeskommunen trenger en oversikt over hvor mange forsinkelser og innstillinger det har vært på en gitt dag. Som en forenkling antar vi at bussene kun har registrert hendelser fra siste døgn, slik at vi ikke trenger å sjekke datoene. Metoden finnhendelser(self, minforsinkelse) skal lage en liste over alle hendelsene som har skjedd siste døgn som har ført til en forsinkelse over «minforsinkelse» minutter. Metoden skal returnere en tuple som har følgende informasjon: (antall innstillinger, antall forsinkelser over «minforsinkelse» minutter, liste over alle hendelser som førte til forsinkelser over «minforsinkelse»). En Innstilling vil automatisk være en forsinkelse over N minutter for alle mulige valg av N. Lag metoden finnhendelser. Angi hvilken klasse du vil legge den i. Her hjelper det godt å se på forrige besvarelse og tenke hvordan man skal søke igjennom ting. Det naturlige er å legge metoden i park siden den da har tilgang til listen over busser og dermed kan lete igjennom alle hendelsene for hver buss. En grei implementasjon er som følger: class park(object): self.busser = [] def finnhendelser(self, minforsinkelse): antfors = 0 antinst = 0 forsinkelser = [] for buss in self.busser: for hendelse in buss.hendelser: if hendelse.forsinketlengreenn(minforsinkelse): if isinstance(hendelse, Forsinkelse): antfors += 1 elif isinstance(hendelse, Innstilling): antinst += 1 forsinkelser.append(hendelse) return (antinst, antfors, forsinkelser) Side 9 av 11

Del B FAKULTET FOR NATURVITENSKAP OG TEKNOLOGI Oppgave 6 (15%) Velg to av kulepunktene under og gi en kort beskrivelse av uttrykkene/konseptene som er angitt der. 1. object vs. class 2. parameter 3. instance 4. method 5. mutable vs. immutable Enkelte leste tydeligvis ikke oppgaveteksten over godt nok og svarte like godt på alle punktene. Andre kom med lange utledninger når vi ba om en kort beskrivelse. Eksempler på besvarelser som kan fungere er: 1) En klasse er en template som beskriver hvordan en type implementeres. Den vil angi attributter og implementasjonen av metoder. Objekter er instanser av klasser, det vil si når man har allokert et objekt av en gitt klasse/type. 2) Et parameter er input-verdier til en funksjon eller metode. De er angitt i definisjonen av funksjonen eller metoden. For eksempel er bar en parameter til foo under: def foo(bar): print bar 3) En instance er et allokert objekt av en gitt type/klasse. Alternativt kan dere også si at instanse og objekt er synonymt. 4) En metode er en funksjon som er assosiert med en klasse eller et objekt. Man kan typisk kalle metoden til et objekt via objektet, f.eks: object.method() 5) En av de korteste besvarelsene som fikk full score var noe sånt som: Et objekt som er mutable kan endres. Eksempel er lister. Et objekt som er immutable kan ikke endres. Eksempel er tuple i Python. Det er alltids lov å utdype litt, men det er sjelden noen klarer å score mer poeng etter å ha fylt en halv side per deloppgave. Det vi hovedsakelig er ute etter når vi spør slike spørsmål er a) Vet dere forskjellen på disse to begrepene (f.eks. i 1 og 5) b) Vet dere det viktigste som kjennetegner eller definerer det vi spør om (f.eks. 2, 3, 4) Oppgave 7 (10%) class DefaultVar(object): def init (self, var1, var2 = 42, var3 = 22): self.var1 = var1 self.var2 = var2 self.var3 = var3 print "Init with v1", self.var1, "v2", self.var2, \ "v3", self.var3 Gitt koden over, hva vil programmet skrive ut for hvert av uttrykkene under? Side 10 av 11

a) dv1 = DefaultVar(100) b) dv2 = DefaultVar() c) dv3 = DefaultVar(100, var3 = 900) Denne oppgave tester forståelse av default-variabler og initialisering og bruk av attributter. Dere trenger bare veldig korte svar her. F.eks: a) Init with v1 100 v2 v2 42 v3 22 b) Denne vil kaste en exception (dere kan også si feile) siden var1 ikke er angitt, og den har ingen default-verdi. c) Init with v1 100 v2 42 v3 900 Oppgave 8 (10%) class Vector(object): def init (self, u = 0, v = 0): self.u = u self.v = v def getu(self): return self.u def setu(self, u): self.u = u def normalize(self): factor = math.sqrt(self.u ** 2 + self.v ** 2) self.u /= factor self.v /= factor def str (self): return "<%f, %f>" % (self.u, self.v) a) Hva er forskjellen på en accessor og en mutator? b) Gitt koden over, angi hvilke metoder som er accessor og mutator. Igjen trenger vi bare korte svar, så lenge de berører de rette punktene. Eksempel kan være: a) En accessor er en metode som leser verdier fra et objekt uten å endre på objektets tilstand mens en mutator er en metode som endrer på objektets tilstand. b) Accessor: getu, str Mutator: init, setu, normalize() Jeg tror ikke vi trekte noen for å ha glemt init. Side 11 av 11