Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Relevanta dokument
Tentamen i Programmering

Tentamen, EDAA10 Programmering i Java

Inlämningsuppgift, EDAF30, 2018

Tentamen, EDAA20/EDA501 Programmering

Tentamen, Programmeringsteknik för BME, F och N

Tentamen EDA501/EDAA20 M L TM W K V

Tentamen, EDA501 Programmering M L TM W K V

Tentamen, EDA017, Programmeringsteknik för C, E, I och Pi

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDAA10 Programmering i Java

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDA501 Programmering M L TM W K V

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDAA10 Programmering i Java

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDAA20/EDA501 Programmering

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Tentamen, Algoritmer och datastrukturer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN OOP

Tentamen Programmeringsteknik för BME, C, D, E, F, I, N & Pi

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen Datastrukturer (DAT037)

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Föreläsning 3-4 Innehåll

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Tentamen i Objektorienterad modellering och design Helsingborg

Del A (obligatorisk för alla)

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen i Algoritmer & Datastrukturer i Java

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 2. Länkad lista och iterator

Laboration A Objektsamlingar

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Föreläsning 10. Grafer, Dijkstra och Prim

TENTAMEN OOP

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Del A (obligatorisk för alla)

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tentamen. Lösningsförslag

Tentamen OOP

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DAT043 Objektorienterad Programmering

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Grundläggande programmering med C# 7,5 högskolepoäng

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 5-6 Innehåll

Tentamen ID1004 Objektorienterad programmering April 7, 2015

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Tentamen EDAA45 Programmering, grundkurs

Föreläsning REPETITION & EXTENTA

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

OOP Objekt-orienterad programmering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningsförslag till tentamen

TENTAMEN I DATAVETENSKAP

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Föreläsning 8: Exempel och problemlösning

OOP Tentamen

Tentamen i Objektorienterad programmering

Tentamen i Programmeringsteknik I

public boolean containskey(string key) { return search(key, head)!= null; }

Programmering för språkteknologer II, HT2014. Rum

TENTAMEN OOP

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Dugga Datastrukturer (DAT036)

Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Tentamen Programmering fortsättningskurs DIT950

Instuderingsfrågor, del E

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDA501/EDAA20 Programmering M MD W BK L 2017 05 31, 8.00 13.00 Anvisningar: Preliminärt ger uppgifterna 9 + 12 + 10 + 9 = 40 poäng. För godkänt betyg krävs 20 poäng. Kommentarer från specifikationerna (/**... */) behöver inte skrivas i lösningen. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. Resultatet läggs in i Ladok när rättningen är klar och anslås inte på anslagstavlan. Tentamensvillkor: 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(6) Bakgrund till uppgift 1 3: om grafer, noder och länkar I figur 1 till höger visas ett exempel på en datastruktur som kallas graf. Grafen består av två slags objekt: noder (ellipser i bilden) och länkar (pilar mellan noder i bilden). Varje nod har ett namn, som Dalby, och varje länk är märkt med en längd (ett heltal, exempelvis 12). I denna bild är alltså pilarna inte vanliga referenser, utan motsvarar ett slags objekt (nämligen länkar). Vi ska strax se hur det fungerar. Bilden visar en vanlig tillämpning för grafer, nämligen geografisk information. Här visas några orter i Lunds omnejd med de inbördes avstånden (i kilometer) angivna: det är 12km från Lund till Södra Sandby, och 4km därifrån till Flyinge. Notera att länkarna är enkelriktade: i vårt exempel finns en Fig. 1: En graf med sex noder och åtta länkar. länk från Lund till Dalby, men inte tvärtom. Om vi vill ange att en väg är dubbelriktad, som mellan Lund och Södra Sandby i bilden, så behövs länkar åt båda hållen. Grafen är ingen komplett karta. I bilden har vi valt att rita noden Flyinge nära Torna Hällestad, men i verkligheten ligger Flyinge mer än en mil därifrån (åt Eslöv till). Vi ska nu införa Java-klasser för noder och länkar. För noder behöver vi hålla reda på ett namn och ett antal länkar, samt ett värde. Nodens värde är ett heltal som vi kommer att få användning för i uppgift 2 och 3. För länkar håller vi reda på länkens destination (en nod) och längd. Klasserna Node och Link beskriver noder respektive länkar, och har följande specifikationer. Klassen Link är färdigimplementerad. (Du kan säkert föreställa dig hur implementationen ser ut.) Node /** Skapar en ny nod med givet namn, utan länkar. Nodens värde är inledningsvis Integer.MAX_VALUE. */ Node(String name); /** Hämtar nodens namn. */ String getname(); /** Sätter nodens värde till v. */ void setvalue(int v); /** Hämtar nodens värde. */ int getvalue(); /** Lägger till en ny länk från denna nod till en given destination. Länken ska ha längden length. */ void addlink(node destination, int length); /** Hämtar de länkar som utgår från denna nod. */ ArrayList<Link> getlinks(); /** Hämtar en sträng på formatet "Grönköping: 123", om nodens namn är Grönköping och värdet 123. */ String tostring(); Link /** Skapa en ny länk till noden destination, med längden length. */ Link(Node destination, int length); /** Hämtar länkens destination. */ Node getdestination(); /** Hämtar länkens längd. */ int getlength();

3(6) Exempel: Följande satser bygger upp grafen i figur 1 och skriver ut något om noderna som kan nås från noden med namn Dalby. Node lund = new Node("Lund"); Node dalby = new Node("Dalby"); Node sandby = new Node("Södra Sandby"); Node hällestad = new Node("Torna Hällestad"); Node flyinge = new Node("Flyinge"); Node veberöd = new Node("Veberöd"); lund.addlink(dalby, 12); lund.addlink(sandby, 12); dalby.addlink(veberöd, 11); dalby.addlink(hällestad, 5); sandby.addlink(lund, 12); sandby.addlink(hällestad, 8); sandby.addlink(flyinge, 4); hällestad.addlink(veberöd, 8); System.out.println("anslutningar från " + dalby.getname() + ":"); for (Link link : dalby.getlinks()) { Node m = link.getdestination(); System.out.println(m.toString()); När dessa satser körs fås utskriften anslutningar från Dalby: Veberöd: 2147483647 Torna Hällestad: 2147483647 Här ser vi att noderna har värdet Integer.MAX_VALUE = 2147483647. Uppgifter 1. Uppgift: Implementera klassen Node. Ledning: Använd en ArrayList för att hålla reda på länkarna. 2. Inför nästa uppgift behöver vi kunna hålla reda på ett antal noder och välja den som har lägst värde. Med värde avses här det heltal som förknippas med en nod, så som beskrivits i bakgrundsavsnittet. NodeSet /** Skapar en tom mängd av noder. */ NodeSet(); /** Lägger till noden node till mängden, om mängden inte redan innehåller en nod med samma namn. */ void add(node node); /** Returnerar true om det finns fler noder i mängden, annars false. */ boolean more(); /** Väljer ut den nod som har lägst värde och returnerar den. Den returnerade noden tas bort ur mängden. Om mängden är tom returneras null. */ Node pickleast(); Uppgift: Implementera klassen NodeSet.

4(6) 3. Det är ofta intressant att ta reda på hur lång den kortaste vägen mellan två noder i en graf är. Givet grafen i figur 1 kan vi exempelvis fråga oss hur lång den kortaste vägen från Lund till Veberöd är. För att lösa detta problem ska vi använda Dijkstras algoritm, 1 som vi strax ska titta närmare på. Denna utgår från en given nod start, och går ut på att ge varje nod N i grafen ett värde som motsvarar det kortaste avståndet från start till N (antingen direkt, eller via en eller flera andra noder). Om vi använder Dijkstras algoritm med start i Lund får noderna värden enligt figur 2. Här har Veberöd fått värdet 23, eftersom kortaste vägen från Lund till Veberöd är 12 + 11 = 23 (via Dalby). Dijkstras algoritm Fig. 2: Grafen i figur 1, med avstånd från Lund utmärkta. Algoritmen utgår från att alla noder inledningsvis har värdet Integer.MAX_VALUE (enligt uppgift 1). 1. Låt start vara noden vi vill räkna avstånd från. Sätt start:s värde till 0. 2. Låt S vara en mängd av noder. Inledningsvis ska S innehålla en enda nod, nämligen start. 3. Så länge mängden S inte är tom ska följande upprepas: 3.1. Ta ut den nod ur S som har lägst värde. Kalla noden n. 3.2. Gå igenom de länkar som utgår från n. För var och en av dessa länkar, gör följande: Kalla länkens längd för l och dess destination för d. Låt a vara summan av n:s värde och l. Om a är mindre än d:s värde: ändra d:s värde till a, och lägg in d i mängden S. Algoritmen bygger på följande idé. Mängden S innehåller de noder som vi funnit en ny väg till. När vi hittat en väg till en nod n, innebär det att vi kanske även hittat ett kortare avstånd a till dess granne d. I så fall stoppas d in i mängden, så att även dess grannar undersöks på samma sätt. Vårt program Vi utgår från följande program. I klassen Travel finns, förutom main-metoden, en metod dijkstra där algoritmen ovan ska implementeras. I main-metoden antas satserna från kodexemplet på sid. 3 stå, följda av de två satserna nedan. Satsen märkt (1) nedan skriver ut Veberöd: 23, enligt figur 2. public class Travel { /** Dijkstras algoritm. Varje nod som kan nås från start ges ett värde, där värdet anger det kortaste avståndet från noden start. */ public static void dijkstra(node start) { // återstår att implementera public static void main(string[] args) { // satserna från sid. 3, där grafen byggs upp, antas stå här Travel.dijkstra(lund); System.out.println(veberöd.toString()); // (1) Uppgift: Implementera metoden dijkstra ovan. Anvisningar: Din lösning ska använda Dijkstras algoritm enligt ovan. Din lösning ska använda klassen NodeSet. Resten av klassen (förutom metoden dijkstra) behöver inte återges i lösningen. Förutsätt att alla noder har värdet Integer.MAX_VALUE när metoden anropas. Din lösning ska vara generell, och fungera även för andra grafer än de i figur 1 2. 1 Ursprungligen beskriven i E.W. Dijkstra, A note on two problems in connexion with graphs, Numerische Mathematik 1, 1959.

5(6) 4. (Denna uppgift är fristående från uppgift 1 3.) En magisk kvadrat är en N N-matris med följande egenskaper: Heltalen 1, 2,..., N 2 förekommer alla exakt en gång. Alla radsummor och kolonnsummor, liksom de båda diagonalernas summor, har samma värde. Detta värde beror på kvadratens storlek. Värdet är N(N 2 + 1)/2, där N är kvadratens storlek. Fig. 3: En magisk kvadrat av storlek 3. I figur 3 visas en magisk kvadrat av storleken 3 3. Talen 1..9 förekommer alla exakt en gång. Alla rader, kolonner och diagonaler har samma summa, nämligen 3(3 2 + 1)/2 = 15. Just denna magiska kvadrat är känd från en kinesisk legend från 600-talet f.kr., där en sköldpadda sägs ha haft dessa värden på sitt skal. Klassen SquareMatrix beskriver kvadratiska matriser, där alltså antalet rader och kolonner är lika. En ofullständig implementation följer nedan. public class SquareMatrix { private int[][] a; private int n; /** Skapar en kvadratisk matris av storleken n x n. Storleken n kan antas vara positiv. */ public SquareMatrix(int n) { a = new int[n][n]; this.n = n; /** Sätter elementet (r,c) till värdet value. Index r och c antas vara giltiga index i matrisen. */ public void set(int r, int c, int value) { a[r][c] = value; /** Returnerar true om denna matris är en magisk kvadrat, annars false. */ public boolean ismagic() { if (! checkunique()) { // Om inte alla tal är unika kan kvadraten inte vara magisk return false; // Räkna ut värdet som radsummor, kolonnsummor och diagonalernas summor måste bli int m = n * (n * n + 1) / 2; // återstår att implementera: // kolla om matrisen uppfyller resten av kraven för en magisk kvadrat /** Hjälpmetod. Kontrollerar om talen i matrisen är unika */ private boolean checkunique() { boolean[] numberchecked = new boolean[n * n + 1]; for (int i = 0; i < n; i++) { for (int k = 0; k < n; k++) { int v = a[i][k]; if (v < 1 v > n * n numberchecked[v]) { return false; numberchecked[v] = true; // bocka av v return true; Uppgift: Implementera resten av metoden ismagic i klassen SquareMatrix enligt anvisningarna på nästa sida

6(6) Anvisningar: Koden som är given i klassen ovan behöver inte återges i lösningen. Hjälpmetoden checkunique kontrollerar om varje tal bara förekommer en gång Metoden ismagic ska vara generell, och fungera för kvadratiska matriser av godtycklig positiv storlek 1.