Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 % Stein Gjessing Institutt for Informatikk Universitetet i Oslo 1
Oppgave 10 Tegning av datastrukturen (vekt 5% av del B) Tegn datastrukturen til et stafettobjekt med en liste med 5 etapper, og for hver etappe en liste av etappetidobjekter. Tegn også noen utøverobjekter, og gjør det klart hvordan disse er forbundet med de andre objektene i figuren. Stafett-objekt Etappeobjekter Utøverobjekter Ole Anne 1 2.14 2.19 2.29 2.02 Per 2 4.74 4.04 Tina 3 3.16 3.04 2.89 4 5.18 5.194 5.64 Eva 5 2.56 2.78 Lise Etappetid-objekter 2
Oppgave 11 Klassedefinisjonene (vekt 5% av del B) Skriv programkoden som definerer de fire klassene Stafett, Etappe, Etappetid og Utøver med variablene du trenger. class Stafett { Etappe forsteetappe, denne; int antalletapper; ArrayList <Utover> besteloperetilnaa; double bestetidtilnaa = Double.MAX_VALUE; class Etappe { // Eventuelt en peker til Stafett-objektet: Stafett sjef; Etappetid forstetid; int etappenummer; Etappe nesteetappe; class Etappetid { Utover loper; double tid; Etappetid nestetid; class Utover { String navn; // navn må være entydig 3
Oppgave 12 Datastruktur for valgte utøvere (vekt 5% av del B) I programmet må det være en datastruktur for å holde orden på utøvere som er med i (deler av) et stafettlag og som ikke kan brukes i senere etapper. Hittil beste lagsammensetning kan tas vare på med den samme strukturen. Beskriv kort (med ord, ikke kode) hvordan du velger å ta vare på denne informasjonen. Bruk en egen klasse eller en av klassene fra javabiblioteket. Beskriv metodene du bruker til dette ved å forklare hvordan de virker og ved å beskrive parametre og eventuell returverdi. Jeg velger ArrayList<E> fra Javabilblioteket. Jeg bruker Utover som generisk parameter, feks: ArrayList<Utover> loper; Metodene: void add(int etappenummer, E loper) Legg inn loper på plass etappenummer void remove(int etappenum) Fjerner objektet (loperen) på etappe (plass i listen) etappenum boolean contains(e loper) returnerer true hvis loper er i listen, false ellers Object clone() Lager en ny liste med pekere til de sammen loperene på de samme plassene (en kopi) I ArrayList nummereres objektene fra 0. Etappene nummereres fra 1. Tar hensyn til dette ved å legge inn etappe n på plass n-1 i ArrayList-en. 4
Oppgave 13 Metoden stafettid (vekt 30% av del B) Skriv den rekursive metoden stafettid definert i klassen Etappe. // Jeg velger at klassen Etappe er indre klasse i stafett. // Hvis ikke må jeg ha en peker til Stafett-objektet, og skrive: // sjef.nyttmuligstafettlag(...) void stafettid(double tidtilhit, ArrayList <Utover> harlopt) { for (Etappetid denne = forstetid; denne!= null; denne = denne.nestetid) { if (! harlopt.contains(denne.loper)) { harlopt.add(etappenummer-1, denne.loper); ; if (nesteetappe == null) nyttmuligstafettlag(tidtilhit+denne.tid, harlopt); else nesteetappe.stafettid(tidtilhit+denne.tid, harlopt); harlopt.remove(etappenummer-1); 5
Oppgave 14 Metoden nyttmuligstafettlag (vekt 10% av del B) Skriv metoden nyttmuligstafettlag i klassen Stafett. nyttmuligstafettlag blir kalt (i stafettid) når en ny kombinasjon av utøvere for alle etappene er funnet. void nyttmuligstafettlag (double d, ArrayList <Utover> ut ) { if (d < bestetidtilnaa) { bestetidtilnaa = d; besteloperetilnaa = (ArrayList <Utover>) ut.clone(); 6
Oppgave 15 Metoden finnbestestafettlag (vekt 5% av del B) Skriv metoden finnbestestafettlag. Metoden skal til slutt skrive (ved hjelp av System.out.println(...)) navnene på utøverne på det beste laget i «etappeorden», samt den tilhørende stafettiden (totaltid). void finnbestestafettlag () { ArrayList <Utover> loperetilnaa = new ArrayList(); forsteetappe.stafettid(0,loperetilnaa); skrivutendeligresultat(); void skrivutendeligresultat( ) { System.out.println("Laget sin tid: "+ bestetidtilnaa); System.out.println("Laget: "); for (Utover ut: besteloperetilnaa) System.out.println(ut.navn); 7
Oppgave 16 Klassen StafettTråd (vekt 25% av del B) Skriv variabeldeklarasjoner, konstruktøren og run-metoden i klassen StafettTråd. Forandre metodene finnbestestafettlag og nyttmuligstafettlag slik at de virker sammen i dette programmet. void finnbestestafettlag () { ArrayList <Utover> loperetilnaa = new ArrayList(); new EtappeTraad(null, forsteetappe, 0, loperetilnaa).start(); // Denne metoden blir kalt av tråden til 1. etappe når alle dens barn er ferdig: synchronized void skrivutendeligresultat( ) { System.out.println("Laget sin tid: "+ bestetidtilnaa); System.out.println("Laget: "); for (Utover ut: besteloperetilnaa) System.out.println(ut.navn); synchronized void nyttmuligstafettlag (double d, ArrayList <Utover> ut ) { if (d < bestetidtilnaa) { bestetidtilnaa = d; besteloperetilnaa = (ArrayList <Utover>) ut.clone(); 8
class EtappeTraad extends Thread { double tidtilhit; ArrayList <Utover> harlopt; Etappe etappen; int antallbarn = 0; EtappeTraad mor; EtappeTraad (EtappeTraad m, Etappe et, double tid, ArrayList <Utover> lopt) { mor = m; etappen = et; tidtilhit = tid; harlopt= lopt; public void run () { for (Etappetid denne = etappen.forstetid; denne!= null; denne = denne.nestetid) { if (! harlopt.contains(denne.loper)) { ArrayList <Utover> ny = (ArrayList <Utover>) harlopt.clone(); ny.add(denne.loper); if (etappen.nesteetappe == null) nyttmuligstafettlag(tidtilhit+denne.tid, ny); else { new EtappeTraad (this, etappen.nesteetappe,tidtilhit+denne.tid, ny). start(); ettbarntil(); ventpaaallebarn(); if (mor!= null) mor.barnferdig(); else skrivutendeligresultat(); 9
Oppgave 7 Synkronisering (vekt 15% av del B) Skriv resten av klassen StafettTråd og eventuelt flere endringer i klassen Stafett, slik at trådene blir synkronisert og slik at beste stafettlag blir skrevet ut først når siste tråd har fullført jobben sin og beste stafettlag er funnet. // Alle metodene skal inn i klassen EtappeTraad: synchronized void ventpaaallebarn() { while (antallbarn!= 0) { try { wait(); catch (InterruptedException e) {System.out.println("FEIL AVBRUDD"); synchronized void ettbarntil() {antallbarn ++; synchronized void barnferdig() {antallbarn --; notify(); 10