LUNDS TEKNISKA HÖGSKOLA 1(3) Institutionen för datavetenskap Tentamen, EDAA20/EDA501 Programmering 2014 01 17, 8.00 13.00 Anvisningar: Denna tentamen består av tre uppgifter. Preliminärt ger uppgifterna 12 + 18 + 10 = 40 poäng. För godkänt betyg krävs 20 poäng. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. När rättningen är klar meddelas detta på kursens hemsida. Tentamensvillkor för EDA501: Om du tenterar utan att vara tentamensberättigad annulleras din skrivning. För att undvika att någon skrivning annulleras av misstag kommer alla som, enligt institutionens noteringar, tenterat utan att vara tentamensberättigade att kontaktas via epost. Felaktigheter i institutionens noteringar kan därefter påtalas fram till nästa tentamenstillfälle då resterande skrivningar annulleras.
2(3) 1. En polygon är en geometrisk figur som består av räta linjer mellan ett antal hörnpunkter. Ordningen mellan punkterna är väsentlig. En polygon kan beskrivas av följande klass: Polygon /** Skapar en polygon utan några punkter */ Polygon(); /** Lägger till en punkt med koordinaterna (x,y) efter de punkter som redan finns */ void add(int x, int y); /** Ritar polygonen i fönstret w. Bilden ska visa en sluten polygon, dvs det ska finnas en linje från den sista punkten till den första */ void draw(window w); /** Beräknar polygonens area */ double getarea(); Implementera klassen enligt följande anvisningar: Använd den färdigskrivna klassen Point för att hålla ordning på punkterna. Klassen har en konstruktor Point(int x, int y) och metoderna int getx() och int gety(). Klassen Window har två operationer: moveto(x,y) flyttar pennan till punkten x,y utan att rita, lineto(x,y) flyttar pennan och ritar en linje. Vid beräkningen av arean förutsätts det att inga av polygonens linjer skär varandra. Då kan arean beräknas med följande formel (punkterna numreras 0.. n 1): area = 1 2 n 1 (x i y i+1 x i+1 y i ) i=0 Låt här x n vara = x 0 och y n = y 0. Exempel för en triangel: area = 1 2 (x 0 y 1 x 1 y 0 + x 1 y 2 x 2 y 1 + x 2 y 0 x 0 y 2 ) Arean kan bli positiv eller negativ beroende på punkternas orientering (motsols eller medsols), men getarea ska alltid ge ett positivt resultat (absolutvärdet av arean).
3(3) 2. Ett antal arbetsuppgifter, jobb, som tar olika lång tid ska fördelas på ett antal personer, arbetare. Man vill göra ett schema för vem som ska göra vilket jobb på så sätt att alla jobb är klara så tidigt som möjligt. Exempel på ett schema med 5 arbetare (w1 w5) och 11 jobb (j1 j11, jobbens längd står inom parentes): w5 w4 j6(3) j4(3) j3(3) j7(3) w3 j1(4) j11(2) j2(1) w2 w1 j10(4) j5(5) j9(3) j8(2) tid Ett enkelt sätt att lösa uppgifter av denna typ är att fördela jobben i avtagande ordning efter längd och att ge varje jobb till den arbetare som är först klar med sina jobb. Denna metod har använts för att skapa schemat i figuren. (Metoden ger inte alltid ett optimalt resultat, men är som sagt enkel.) Jobben, arbetarna och schemat beskrivs av följande klasser (bara de operationer som behövs i denna uppgift finns med): Job /** Tar reda på jobbets längd */ int getlength(); Worker /** Tar bort alla jobb från arbetaren */ void clearjobs(); /** Tar reda på den totala tiden för arbetarens alla jobb */ int gettotaltime(); /** Tilldelar jobbet j till arbetaren */ void assignjob(job j); /** Tar bort och returnerar nästa jobb som arbetaren ska utföra. Ger null om arbetaren är klar med alla sina jobb */ Job getnextjob(); Schedule /** Skapar ett schema (utan några jobb) för arbetarna i vektorn workers */ Schedule(Worker[] workers); /** Fördelar jobben i listan jobs på arbetarna. Listan är inte sorterad. Listan får ändras i metoden */ void makeschedule(arraylist<job> jobs); /** Tar bort och returnerar nästa jobb som arbetaren med nummer wnbr ska utföra. Arbetarna numreras med början på 1. Ger null om wnbr är felaktigt eller om arbetaren är klar med alla sina jobb */ Job getnextjob(int wnbr); Implementera klassen Schedule. Klasserna Job och Worker är färdigskrivna. 3. Implementera klassen Worker från uppgift 2. Klassen ska ha en konstruktor utan några parametrar.
LUNDS TEKNISKA HÖGSKOLA 1(3) Institutionen för datavetenskap Lösningsförslag, tentamen i EDAA20/EDA501 1. public class Polygon { private ArrayList<Point> points; public Polygon() { points = new ArrayList<Point>(); public void add(int x, int y) { points.add(new Point(x, y)); 2014 01 17 public void draw(window w) { if (points.isempty()) { return; w.moveto(points.get(0).getx(), points.get(0).gety()); for (int i = 1; i < points.size(); i++) { w.lineto(points.get(i).getx(), points.get(i).gety()); w.lineto(points.get(0).getx(), points.get(0).gety()); public double getarea() { if (points.isempty()) { return 0; double area = 0; for (int i = 0; i < points.size() - 1; i++) { area += points.get(i).getx() * points.get(i + 1).getY() - points.get(i + 1).getX() * points.get(i).gety(); Point last = points.get(points.size() - 1); area += last.getx() * points.get(0).gety() - points.get(0).getx() * last.gety(); return Math.abs(area) / 2; 2. public class Schedule { private Worker[] workers; public Schedule(Worker[] workers) { this.workers = workers; public void makeschedule(arraylist<job> jobs) { for (int i = 0; i < workers.length; i++) { workers[i].clearjobs(); while (!jobs.isempty()) { Job longest = getlongest(jobs); Worker firstready = findleastoccupiedworker(); firstready.assignjob(longest);
2(3) private Job getlongest(arraylist<job> jobs) { int maxlength = 0; int maxindex = -1; for (int i = 0; i < jobs.size(); i++) { if (jobs.get(i).getlength() > maxlength) { maxlength = jobs.get(i).getlength(); maxindex = i; return jobs.remove(maxindex); private Worker findleastoccupiedworker() { int mintotaltime = Integer.MAX_VALUE; int minindex = -1; for (int i = 0; i < workers.length; i++) { if (workers[i].gettotaltime() < mintotaltime) { mintotaltime = workers[i].gettotaltime(); minindex = i; return workers[minindex]; public Job getnextjob(int wnbr) { if (wnbr < 1 wnbr > workers.length) { return null; return workers[wnbr - 1].getNextJob(); 3. public class Worker { private ArrayList<Job> jobs; public Worker() { jobs = new ArrayList<Job>(); public void clearjobs() { jobs.clear(); public int gettotaltime() { int totaltime = 0; for (int i = 0; i < jobs.size(); i++) { totaltime += jobs.get(i).getlength(); return totaltime; public void assignjob(job j) { jobs.add(j); public Job getnextjob() { if (jobs.isempty()) { return null; else { return jobs.remove(0);
3(3) Alternativ lösning med attribut för tiden: public class Worker { private ArrayList<Job> jobs; private int totaltime; public Worker() { jobs = new ArrayList<Job>(); totaltime = 0; public void clearjobs() { jobs.clear(); totaltime = 0; public int gettotaltime() { return totaltime; public void assignjob(job j) { jobs.add(j); totaltime += j.getlength(); public Job getnextjob() { if (jobs.isempty()) { return null; else { Job j = jobs.remove(0); totaltime -= j.getlength(); return j;