Eksamen i INF160, høsten 2006. 8.12.06 (OBS! svarforslag) 6 timer skriftlig, alle hjelpemidler Faglærer: Ketil Danielsen



Like dokumenter
UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

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

Algoritmer og Datastrukturer

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

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

Obligatorisk oppgave 4: Lege/Resept

Objektorientert Programmering Ekstraordinær eksamen 2014

UNIVERSITETET I OSLO

EKSAMEN. Emne: Algoritmer og datastrukturer

UNIVERSITETET I OSLO

INF1010 Binære søketrær ++

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

UNIVERSITETET I OSLO

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

INF Notater. Veronika Heimsbakk 10. juni 2012

UNIVERSITETET I OSLO

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

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

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

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

2 Om statiske variable/konstanter og statiske metoder.

INF1010 Sortering. Marit Nybakken 1. mars 2004

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

UNIVERSITETET I OSLO

København 20 Stockholm

Endret litt som ukeoppgave i INF1010 våren 2004

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Kapittel 8: Sortering og søking

INF1010. Grensesnittet Comparable<T>

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

INF1010 notat: Binærsøking og quicksort

Sortering med tråder - Quicksort

Algoritmer og Datastrukturer

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

Introduksjon til objektorientert programmering

Oppgave 1. Sekvenser (20%)

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

Sortering med Comparable og Comparator

UNIVERSITETET I OSLO

Eksamen Objektorientert Programmering 2013

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

LC191D/LO191D Videregående programmering mai 2010

TDT4100 Objektorientert programmering

Løsningsforslag til eksamen i INF1000 våren 2006

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

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

EKSAMEN med løsningsforslag

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. Algoritmer og datastrukturer

Rekursjon. Binærsøk. Hanois tårn.

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

INF våren 2017

UNIVERSITETET I OSLO

INF1000 Prøveeksamen Oppgave 7 og 9

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Norges Informasjonsteknologiske Høgskole

TDT4100 Objektorientert programmering

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Prøveeksamen INF2440 v Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

Enkle generiske klasser i Java

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

Obligatorisk oppgave 5: Labyrint

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Kapittel 8: Sortering og søking INF100

Transkript:

Eksamen i INF160, høsten 2006. 8.12.06 (OBS! svarforslag) 6 timer skriftlig, alle hjelpemidler Faglærer: Ketil Danielsen Oppgaven har re spørsmål som teller like mye (1/4). Spørsmål 2 gir lite programmering; de resterende ber deg programmere. Ikke la spørsmål stå ubesvart, med mindre du er helt blank. Gi en tolking av spørsmålet der du er i tvil. 1 Ekvivalensgrupper I denne oppgaven skal du denere en klasse med attributt og metoder. Gi Javakoden for hver metode. En ekvivalensgruppe inneholder objekt som er relaterte til hverandre. Et objekt er i utgangspunktet kun relatert til seg selv (i sin egen gruppe), men kan relateres til andre og derved innlemmes i større grupper. Et objekt kan ikke være uten gruppe, men heller ikke være med i mere enn en gruppe. Du skal lage en klasse ekvivalensgrupper som forvalter dette. Den datastruktur som er påtenkt er en tabell med heltall, der objekt med (unikt) nummer i, skal representeres i posisjon i. Anta at objektene har nummer som starter med 0 og er tildelt i stigende rekkefølge etter hvert som de registreres. For hver gruppe skal det bygges et omvendt tre, der hvert objekt kjenner sitt umiddelbare opphav, og der roten har verdi -1 (ingen opphav). Alle objekt i samme gruppe har samme rot. Initielt er objektet alene i sin gruppe og verdien av a(i) er -1 (objektet er da roten). Hvis objekt i skal relateres med med objekt j, settes roten i i's tre lik roten i j's tre. Det medfører (a) at j også blir implisitt relatert til i og (b) at de to gruppene de er med i er slått sammen. I eksemplet under ser en utviklingen av a(i) for 8 objekt. Se også siste ark i oppgavesettet. steg a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7) 1 initielt -1-1 -1-1 -1-1 -1-1 2 5 relateres til 4-1 -1-1 -1-1 4-1 -1 3 7 relateres til 6-1 -1-1 -1-1 4-1 6 4 6 relateres til 4-1 -1-1 -1-1 4 4 6 5 1 relateres til 2-1 2-1 -1-1 4 4 6 6 0 relateres til 1 1 2-1 -1-1 4 4 6 7 0 relateres til 7 1 2 4-1 -1 4 4 6... Initielt har eksemplet åtte grupper med ett medlem. Etter steg 6 er det tre grupper: (0, 1, 2) (3) (4, 5, 6, 7). Etter steg 7 er det to: (0, 1, 2, 4, 5, 6, 7) (3). prinsippet om full innkapsling (encapsulation) skal følges 1

lag klassen ekvivalensgrupper med konstruktør lag rekursiv metode int root(a) som returnerer roten i den gruppe der a ligger. lag metoden union(a,b) som relaterer to objekt a og b. Denne vil implisitt slå sammen de to grupper der a og b er med, forutsatt at de er ulike grupper. lag metode boolean isrelated(a,b) som returnerer true kun hvis de er relaterte. lag metoden int nbrgroups() som viser antall grupper Svarforslag 1 package eksopp ; 2 public class ekvivalensgrupper { 3 private int [ ] a ; 4 public ekvivalensgrupper ( int n ) { 5 a = new int [ n ] ; 6 for ( int i =0; i < a. length ; i++) 7 a [ i ] = 1; 8 } 9 public void union ( int i, int j ) { 10 i f ( j == 1) a [ i ] = 1; 11 else { 12 int gruppe_i = root ( i ), gruppe_j = root ( j ) ; 13 i f ( gruppe_i! = gruppe_j ) 14 a [ gruppe_i ] = gruppe_j ; 15 } 16 } 17 private int root ( int i ) { // r e k u r s i v i t e r a t i v er bedre! 18 i f ( a [ i ] == 1) return i ; 19 else return root ( a [ i ] ) ; 20 } 21 public boolean i s R e l a t e d ( int i, int j ) { 22 return root ( i ) == root ( j ) ; 23 } 24 public int nbrgroups ( ) { 25 int i =0, c =0; 26 for ( ; i <a. length ; i ++) i f ( a [ i ] == 1) c++; 27 return c ; 28 } 29 } Nesten alle besvarelsene feilet i union og satte 1 public void union ( int i, int j ) { 2

2 a [ i ] = b ; // XXX f e i l XXX 3 } Dette virker bare hvis i er sin egen rot. 2 Kunderegister I denne oppgaven skal du vise at du kan planlegge et enkelt programsystem og anvende objekt-orientert tenking. Du skal skissere, lage oversikt og tenke overordnet, ikke detaljert. Du skal angi klasser, aktuelle attributt og metode (eventuelt metode-signaturer ved overlasting), lformat og til sist gi et klassehierarki. Skissene skal angi forhold av typen is-a såvel som has-a. Metodene skal ikke skrives med pseudo/javakode, med mindre du synes det er nødvendig for forståelsen. Firmaet D-dag (dusje-dag) har kapret det lukurative dusjemarkedet og trenger et programsystem (S) som passer til følgende krav: Firmaet har agenter som daglig besøker kunder som trenger en dusj. Noen kunder dusjer alene, andre sammen. Dusjegruppene lagres ved hjelp av ekvivalensgrupper (se spørsmål 1). Agenter vil vite hvem som skal besøkes i dag, hvem de dusjer med, og hvor de bor. Programmet avsluttes kl 1600 og lagrer kundedata til en tekstl. En kunde bestemmer sitt eget dusjeintervall (antall dager). Det skal kunne lages lister over de som dusjer sammen, men som har ulike intervall. Programmet skal benytte full innkapsling. All massebehandling utnytter polymor. Etter fem år som kunde skal en klassisere som Velkjent kunde. Som i bilforsikring skal disse motta en rabatt som avhenger av antall år uten uhell. For hvert år uten uhell vil Velkjente Kunder få rabatten økt med 5 prosentpoeng. Et uhell vil derimot sette en tilbake to år, miste 5 prosentpoeng i rabatt per år. Velkjente kunder med negativ rabatt skal miste sin status som Velkjent, og utestenges for re år. Ingen kan ha mer enn 50 prosent rabatt. Studenter får 10 prosent rabatt. Politimyndighetene vil ha innsyn i hvem som dusjer sammen. 3

Helsemyndighetene vil ha en liste over de som dusjer, sortert etter dusje-intervall. For sortering skal comparable implementeres. Svarforslag Det deneres en rekke klasser som hver har private attributt (ingen public eller protected!). Massebehandling utføres polymorft, altså uten spesial behandling for særtyper. Typisk massebehandling vil være listing av alle av samme erketype. De færreste besvarelser diskuterte hvordan de hadde tenkt hva angår polymor, selv om det rett nok var hint til polymor i skissene. Ddag er en klasse. Ddag har private attributt: -dusjkunderegister (HAS-A) -agenter, ikke strengt tatt nødvendig dusjkunderegister er en klasse. Denne har private attributt: -Kunde: liste (HAS-A) -dusjer: ekvivalensgruppe (HAS-A) (denne viser hvilke kunder som dusjer sammen) og utledes ved å spørre hvem kundene vil dusje med). -lnavn: String (der data lagres mellom 16 og 8). Den tilbyr metoder: +besokliste() viser hvem som skal besøkes i dag Antar at den skal brukes utenfra (derfor public). +dusjersammenfeil() viser hvem som dusjer sammen til feil intervall (de må ha samme intervall for å kunne dusje sammen!). +dusjersammen() viser hvem som dusjer sammen, gruppevis +dusjersammensortert() sorterer listen basert på dusjeintervall. +oppstart() leser fra l og lager kundeliste. Kunder som har fem år siden oppstart skal endre status til Velkjent. Velkjente Kunder som er utelukket kan lukkes inn igjen og bli normale kunder. +avslutning() lagrer til l ved avslutning. Polymor utnyttes i alle metoder som skal skrive ut lister over kunder. ekvivalensgruppe er en klasse. den er denert i svarforslaget til spm. 1. Kunde er en klasse som implementerer Comparable. Den har private attributt: -navn: String (av gammel vane) -adresse: String (for lokalisering) -intervall: int (dusjeintervall i antall dager) 4

-sistdusjet: int (viktig for listen over dagens dusjer) -aarstartet: int -aarutelukket: int -rabatt: yttall (bare Studenter og Velkjent Kunde vil ha annet enn 0 i rabatt. Foretrekker dette over det å ha en slags mellom-klasse ala RabatterteKunder.) -sammen: Kunde (som en vil dusje med) (sammen blir da en HAS-A til seg selv). Metoder en kunde tilbyr vil være: +getrabatt() default returnerer denne 0. +compareto(): int nødvendig i comparable. +tostring() for polymor VelkjentKunde er en klasse, den arver Kunde (IS-A). Den har private attributt: -aarsisteuhell: int Metoder: +konstruktør: må huske hvilket år den ble opprettet. Klassen skal overstyre metoden +getrabatt() til å være maksimum av 0.5 (femti prosent) og 0.05 antall år siden forrige uhell. +registreruhell() vil øke attributtet aarsisteuhell med to. Hvis rabatt blir negativ må kundens aarutelukket settes. +tostring() kan overstyres, viktig for polymor Studentkunde er en klasse som arver Kunde (IS-A). (noen besvarelser hadde ikke dette som egen klasse, men markerte det som et boolsk attributt hos Kunden). StudentKunde overstyrer metoden: +getrabatt() til å returnere 0.1. Filformatet må lagre kundens attributt, og ha et typefelt som muliggjør rett tolking (Velkjent Kunde har noen ekstra felt). Få besvarelser diskuterte lformatet. En student's forslag om at database hadde vært mer fornuftig er forsåvidt greit. 3 Datastrukturer I oppgaven skal du vise din forståelse for datastrukturer og polymor, samt gi Javakode. Helsemyndighetene vil som nevnt, ha en liste over de som dusjer, sortert etter dusje-intervall. Firmaet har en million kunder. I løpet av dagen registreres omlag hundre nye kunder, og det fjernes om lag femti. Diskuter minst to måter for å organisere sorteringen. Fokuser på beregningstid. 5

Lag Javakode som implementerer en av disse to måtene. Du skal utnytte polymor og grensesnittet Comparable. Svarforslag Listen skal leveres sortert etter dusje-intervall, som er et heltall. Det sies ikke hvor ofte de skal ha listen, eller hvor oppdatert listen skal være. Det antas at listen skal inneholde alle i kunderegisteret (K) som nnes i det øyeblikk listen etterspørres. Det er også sagt at oppdateringer vil skje. Dette kan antas å skje fra andre (tråder) som tar imot henvendelser fra brukerne. Dette åpner opp for mulig race condition, at noen endrer mens andre leser/endrer, og derved skaper feil oppfatning av hva som virkelig har skjedd med objektet som manipuleres. Kundelisten (K) bør fryses under sortering, altså må en legge en lås på objektet K slik at (a) den som sorterer ikke starter før K er ledig, og at (b) ingen legger inn eller tar ut av K mens sortering pågår. Hvis sorteringen blir langvarig bør en se om det er muligheter for at oppdateringer kan gå tapt. For å sortere raskt (dette er store datamengder) bør en velge blant de eektive algoritmer. To kjente algoritmer (i boken av Loftus) er insertion-sort og selection-sort (INSERT og SELECT). Disse er ikke spesielt raske, men er likevel et forslag. INSERT utvider den sorterte del av K, ved å kile stadig ere usorterte fra K, inn på rett posisjon, samt forskyve resten av den sorterte delen ett steg ut. SELECT bygger ut en sortert liste ved å gradvis lete etter neste korrekte element og innlemme dette (med en swap, bytting) i den sorterte delen av K; her forskyves intet som i INSERT. Begge er like (u)eektive da de utfører n 2 sammenligninger, der n er antall kunder (en million) i praksis vil de neppe avslutte i tide for helsemyndighetene. Det er sagt at SELECT er lettere å forstå (viktig for leseren), og at SELECT utfører færre ombyttinger og derfor kan være raskere (enn INSERT). Uansett, sammenligningen krever at element (dusjkunde) som skal sorteres kan sammenlignes, at de implementerer Comparable. Derfor må dusjkunde-klassen implementere dette, samt tilby de metoder som foreskrives av dette interface, nemlig compareto(). En slik metode vil sammenligne kundens dusjeintervall (heltall) med en annen kunde's, og returnere dieransen. 1 public c l a s s dusjkunde extends Kunde implements Comparable { 2... 3 public int compareto ( Object k ) { 4 return this. g e t I n t e r v ( ) ( ( dusjkunde ) k ). g e t I n t e r v ( ) ; 5 } 6 } I sorteringen kan en (a) lage en kopi K, og sortere kopien, eller (b) sortere selveste originalen K. Koden under viser en intern støttemetode som gjør sistnevnte (SELECT). 1 public class dusjkunderegister { 2... 3 private Lock kunderlock ; 6

4 dusjkunde [ ] a ; 5... 6 public dusjkunderegister ( ) { 7 kunder = new dusjkunde [ n ] ; 8 kunderlock = new ReentrantLock ( ) ; 9 } 10... 11 private void s e l e c t S o r t ( Comparable [ ] K) { 12 int min ; // som i l i s t i n g 9. 9 i Lewis / L oftus 13 Comparable tmp ; 14 kunderlock. l o c k ( ) ; 15 try { 16 for ( int i =0; i<k. length 1; i ++) { 17 min=i ; 18 for ( int j=i +1; j<k. length ; j++) 19 i f (K[ j ]. compareto ( i ) < 0) 20 min=j ; 21 tmp = K[ min ] ; // b y t t om ( swap ) 22 K[ min ] = K[ i ] ; 23 K[ i ] = tmp ; 24 } 25 } f i n a l l y { 26 kunderlock. unlock ( ) ; 27 } 28 } 29 public S t r i n g dusjersammensortert ( ) { 30 // h v i s Helsemyndighetene ber om det 31 S t r i n g r e t="" ; 32 s e l e c t S o r t ( kunder ) ; 33 fo r ( dusjkunde k : kunder ) 34 r e t += k. t o S t r i n g ( ) ; 35 return r e t ; 36 } 37... 38 } Fordelen med å jobbe direkte på originalen er at en slipper den tidkrevende kopiering av K med sine million pekere (selve kundeobjektene kopieres dog ikke!). Ulempen er (som sagt) at en må låse av K under sorteringen. En student foreslo å sortere ved innlesing av kunder, og ha en tabell for hvert intervall, altså k(n) er de som dusjer hver n'te dag. Dette er ikke et dumt forslag, selv om det er uklart hvor mange rader tabellen vil få (noen dusjer kanskje en gang i året, og lagres i k(365). En annen student foreslo HashMap, da dette hadde metoder for sortering. 7

4 Dusjovervåking I denne oppgaven skal du gi Javakode. Du skal benytte tråder og graske hjelpemiddel. Myndighetene vil ha program som (med tekst) viser hvem som dusjer sammen, og oppdaterer oversikten hvert I'de sekund. Bildet kan se slik ut, der en egen tråd besørger oppdateringen: Brukeren oppgir I med en Slider som har min, max og default verdi denert i konstanter. Svarforslag 1 import java. awt. ; 2 import javax. swing. ; 3 public c l a s s DStatPanel extends JPanel { 4 private J S l i d e r i n t e r v a l l v e l g e r ; 5 private JLabel h i s t o r i e l a b e l ; 6 private f i n a l int DEFAULT_INTERVALL=2; 7 private f i n a l int MIN_INTERVALL=1; 8 private f i n a l int MAX_INTERVALL=60; 9 private int i n t e r v a l l ; 10 11 private class H i s t o r i e V i s e r extends Thread { 12 public void run ( ) { 13 try { 14 while ( true ) { 15 s l e e p (1000 i n t e r v a l l ) ; 16 h i s t o r i e l a b e l. settext ( " Dusjer sammen : " + 17 new java. u t i l. Date ()) + 18 d usjkunderegister. dusjersammen ( ) ; 19 r e p a i n t ( ) ; 20 } 21 } catch ( InterruptedException ex ) 22 { ex. printstacktrace ( ) ; } 23 } 24 } 25 public DStatPanel ( ) { 8

26 i n t e r v a l l = DEFAULT_INTERVALL; 27 i n t e r v a l l v e l g e r = new J S l i d e r ( 28 MIN_INTERVALL, MAX_INTERVALL, i n t e r v a l l ) ; 29 i n t e r v a l l v e l g e r. s e t P a i n t T i c k s ( true ) ; 30 i n t e r v a l l v e l g e r. s e t P a i n t L a b e l s ( true ) ; 31 i n t e r v a l l v e l g e r. setmajortickspacing ( 5 ) ; 32 i n t e r v a l l v e l g e r. setminortickspacing ( 1 ) ; 33 34 setlayout (new BoxLayout ( this, BoxLayout.Y_AXIS ) ) ; 35 add (new JLabel ( " I n t e r v a l l : " ) ) ; 36 add ( i n t e r v a l l v e l g e r ) ; 37 h i s t o r i e l a b e l = new JLabel ( ) ; 38 add ( h i s t o r i e l a b e l ) ; 39 H i s t o r i e V i s e r h i s t o r i e v i s e r = new H i s t o r i e V i s e r ( ) ; 40 h i s t o r i e v i s e r. s t a r t ( ) ; 41 } 42 } Denne kalles fra: 1 import javax. swing. JFrame ; 2 public class Dstat { 3 public static void main ( S t r i n g [ ] args ) { 4 JFrame f = new JFrame ( " Dusjovervaaging " ) ; 5 f. s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame.EXIT_ON_CLOSE) ; 6 f. getcontentpane ( ). add (new DStatPanel ( ) ) ; 7 f. pack ( ) ; f. s e t V i s i b l e ( true ) ; 8 } 9 } Flere besvarelser hadde lagt oppdateringen av dusjere til den listener som kjøres hvis slider yttes. Oppdatering skjer altså bare når bruker rører slider. For å få en periodisk oppdatering, må oppdateringen gjøres av en egen tråd. 9