PROG2 Tenta 2014-05-02 Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2



Relevanta dokument
PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP och DSV1:P2

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP och DSV1:P2

SP:PROG3 HT12 Tenta

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

OOP Omtenta

OOP Tentamen

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

OOP Tentamen

Tentamen i Objektorienterad programmering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

DAT043 Objektorienterad Programmering

OOP Tenta

Tentamen i Objektorienterad programmering

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Lösningsförslag till tentamen

Lösningsförslag till tentamen

PROGRAMMERINGSTEKNIK TIN212

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

OOP Omtenta

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

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP och DSV1:P2

Lösningar för tenta 3 DAT043,

OOP Tentamen

TENTAMEN OOP

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

TENTAMEN OOP

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

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tentamen, EDAA10 Programmering i Java

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till tentamen

Föreläsning 4 Innehåll

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

Tentamen OOP

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Tentamen i Objektorienterad programmering E

OOP Tenta

Föreläsning 14 Innehåll

Laboration 13, Arrayer och objekt

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

Laboration 24 Databasen MySQL och java

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

Föreläsning 14: Grafik & mera händelsehantering

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

Objektorienterad programutveckling, fk

DEL 1 För att få godkänt på tentan (betyg 3) måste du lösa minst fem av sju uppgifter i denna del.

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

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

Tentamen i Programmering

Laboration 15 Grafiskt användargränssnitt

Tentamen FYTA11 Javaprogrammering

Mer om grafiska komponenter. Händelsestyrda program

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

OOP Omtentamen

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

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

Föreläsning 10. ADT:er och datastrukturer

OOP Omtenta

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

OOP Objekt-orienterad programmering

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

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Lösningsförslag till tentamen

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

Föreläsning 3: Händelsestyrda program och användargränssnitt

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Laboration A Objektsamlingar

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 3. Stack

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Lösningsförslag till tentamen FYTA11 Javaprogrammering

OOP Omtenta

Tentamen, EDA501 Programmering M L TM W K V

Lösningsförslag till tentamen

OOP Exempel Tentamen 2007

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

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

kl

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Tentamen *:58/ID100V Programmering i C Exempel 3

Transkript:

DSV SU/KTH sid 1 (6) PROG2 PROG2 Tenta 2014-05-02 Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2 Tentan består av tre uppgifter. Max poäng är 38. För betyget E (godkänd) krävs minst 23 poäng och minst en poäng på varje uppgift. Betygen A-D ges enligt betygskriteria i Daisy och på nästa sida. Hjälpmedel: Tillåtna hjälpmedel är medhavda böcker om Java. Anvisningar: Skriv endast på ena sidan av bladen. Påbörja varje ny uppgift på nytt blad. Skriv tydligt - oläsbara svar beaktas inte. Även icke fullständiga lösningar beaktas. Kommentera gärna era lösningar. Lycka till!

DSV SU/KTH sid 2 PROG2 Tentan betygsätts i A/B/C/D/E/Fx/F-skalan enligt följande kriteria: A - Samtliga lösningar är felfria (förutom uppenbara små misstag), fullständiga, genomförda med användning av de på kursen presenterade Java-teknikerna och lämpliga klasser/metoder ur Javas standardbibliotek och med kod som är klar, effektiv och inte onödigt omständlig. Lösningarna tar hänsyn till alla i uppgiftstexten angivna situationer och innehåller alla i uppgiftstexten begärda felkontroller. Däremot behöver de inte innehålla andra felkontroller eller ta hänsyn till andra situationer än de som angetts i uppgiftstexten. B - Som för betyget A utom att någon eller ett par lösningar kan innehålla något grövre misstag eller underlåta att ta hänsyn till någon enstaka angiven situation eller någon enstaka begärd felkontroll. Lösningarna kan vara något mer omständliga än nödvändigt. C - Lösningarna är i princip korrekta men kan vara behäftade med fel och/eller underlåta att ta hänsyn till någon enstaka angiven situation eller begärd felkontroll. Lösningarna kan vara mer omständliga än nödvändigt (t.ex. skrivna med egen kod där standardklasser/-metoder kunde ha använts). D - Som för betyget C utom att någon eller ett par lösningar kan innehålla grövre fel av principiell karaktär. Lösningarna kan även innehålla grövre syntaktiska misstag (t.ex. sammanblandning med andra språk med liknande syntax). E - Som för betyget D utom att de flesta eller alla lösningar är behäftade med grövre fel av principiell karaktär. Icke desto mindre måste lösningarna visa grundläggande förståelse för problemet och åtminstone en ansats till korrekt lösning. Fx - En lösning är helt felaktig eller saknas medan de övriga lösningar är i princip korrekta, men kan vara behäftade med fel och/eller underlåta att ta hänsyn till någon enstaka angiven situation eller begärd felkontroll. F - Flera lösningar är helt felaktiga eller saknas. Betyget Fx innebär att studenten kan komplettera examinationen med en extra inlämningsuppgift för att få godkänt på aktuell tentamen (E men ej högre betyg). Kompletteringsuppgiften måste lämnas in enligt angiven deadline och kan endast användas för att få betyget E på den aktuella tentan.

DSV SU/KTH sid 3 PROG2 Uppgift 1 (13 poäng) Den här uppgiften går ut på att komplettera ett program som visar en bild föreställande en karta och som kan användas för att på kartan mäta en sträcka som följer en (ev. krokig) väg. Detta görs genom att användaren klickar med musen på kartan och programmet räknar ut avståndet mellan den punkt där användaren klickat och föregående punkt, och lägger ihop dessa avstånd (se nedan om hur man räknar ut avståndet). På det sättet kan användaren följa en krokig stig med en serie raka sträckor. För att kunna meddela avståndet i meter måste programmet veta hur många meter varje pixel motsvarar, detta ska användaren mata in. När programmet startat visar det en karta (från en bildfil). Filens namn anges på kommandoraden, vi behöver inte bekymra oss om det, inte heller om fönsterstorleken. Fönstret ser ut så här: Användaren anger hur många meter en pixel motsvarar och trycket på "Ok" (om det inte finns någon angivelse i textfältet eller om angivelsen är icke-numerisk bör ett felmeddelande visas i en dialogruta). Sedan klickar användaren på kartan upprepade gånger och programmet visar ackumulerade sträckan: På bilden ovan har jag ritat små criklar där användaren har klickat, men ditt program behöver inte göra det, det ska bara räkna ut sträckan och visa den i övre panelen. Om man har koordinater för två punkter, säg x1,y1 och x2,y2 så kan man räkna ut avståndet mellan dem genom Pythagoras sats: avstånd = (x2 x1) 2 + (y2 y1) 2, översatt till Java: double avstånd = Math.sqrt(Math.pow(x2-x1, 2)+Math.pow(y2-y1, 2)); Se nästa sida för kod som du ska komplettera.

DSV SU/KTH sid 4 PROG2 Nedan finns koden till klassen Kartan som du ska komplettera (radnumreringen ingår inte i koden, den är till för att du enkelt skall kunna förklara var du gör tillägg/ändringar): 1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 class KartPanel extends JPanel{ 6 private ImageIcon bilden; 7 8 public KartPanel(String filnamn){ 9 setlayout(null); 10 bilden = new ImageIcon(filnamn); 11 12 13 protected void paintcomponent(graphics g){ 14 super.paintcomponent(g); 15 g.drawimage(bilden.getimage(),0,0,this); 16 17 18 19 class Kartan extends JFrame{ 20 Kartan(String filnamn){ 21 22 JPanel norra = new JPanel(); 23 add(norra, BorderLayout.NORTH); 24 norra.add(new JLabel("Sträcka: ")); 25 norra.add(new JLabel("0")); 26 norra.add(new JLabel("meter")); 27 28 add(new KartPanel(filnamn)); 29 30 JPanel södra = new JPanel(); 31 add(södra, BorderLayout.SOUTH); 32 södra.add(new JLabel("En pixel motsvarar: ")); 33 södra.add(new JTextField(3)); 34 södra.add(new JLabel("meter")); 35 södra.add(new JButton("Ok")); 36 37 setdefaultcloseoperation(exit_on_close); 38 setsize(650,350); 39 setvisible(true); 40 41 public static void main(string[] args){ 42 new Kartan(args[0]); 43 44

DSV SU/KTH sid 5 PROG2 Uppgift 2 (12 poäng) I båtklubbar har man ett vaktschema - varje dag på året måste någon av medlemmarna gå nattvakt på klubbens brygga. Man vill ha ett Java-program där man kan ange för varje dag vilken medlem som ska ha vakten. Dagar representeras med ett veckonummer och veckodagen inom veckan, fast veckodagen representeras med ett nummer 0-6, där 0 är måndag, 1 är tisdag o.s.v.: class Dag{ private int veckonr, veckodag; private static final String[] VDAGAR = {"Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag","Söndag"; public Dag(int veckonr, int veckodag){ if (veckonr < 1 veckonr > 53 veckodag < 0 veckodag > 6) throw new IllegalArgumentException(); this.veckonr = veckonr; this.veckodag = veckodag; public String tostring() { return "vecka " + veckonr + " " + VDAGAR[veckoDag]; // Dag Klassen Dag behöver kompletteras i denna uppgift. Klubbmedlemmar representeras helt enkelt med deras namn (String). a) Man vill kunna använda objekt av klassen Dag som nycklar i en Map. Man har inte bestämt sig om man ska använda en HashMap eller en TreeMap, så klassen Dag måste förberedas för att fungera som nycklar i båda. Komplettera klassen Dag så att den kan användas som nyckel både i en HashMap och i en TreeMap b) Programmet som kommer att använda klassen Dag kommer att ha en Map<Dag, String> vaktschema; med objekt av klassen Dag som nycklar och medlemmarnas namn som värden. Men man vill även kunna få fram för varje medlem, vilka dagar som denna har bokat (obs att en medlem kan ha bokat flera dagar). Man vill därför ha en metod som tar ett sådant vaktschema som argument och som returnerar en annan Map, där medlemmarnas namn är nyckel, och vilka dagar de har bokat är värden. Skriv denna metod. Den ska vara en statisk metod som alltså tar en Map<Dag, String> som argument och den ska skapa och returnera den inverterade Map:en. I den nya Map:en ska värdena ligga i sorteringsordning efter medlemmarnas namn (så att eventuell utskrift skulle bli i den ordningen, fast du ska inte göra någon utskrift).

DSV SU/KTH sid 6 PROG2 Uppgift 3 (13 poäng) Denna uppgift går ut på att skriva ett generiskt gränssnitt (interface) Deque<E> och en generisk klass ArrayDeque<E> som implementerar detta gränssnitt. Deque står för Double-ended queue och är en datastruktur där man kan stoppa in resp. ta bort element både i början och i slutet av datastrukturen med samma effektivitet. Dessutom kan man hämta ett godtyckligt element genom att indexera. Deque skule kunna implementeras med en länkad lista, men då blir indexeringsoperationen mycket ineffektiv. Om den implementeras med hjälp av en ArrayList så blir insättningar och borttag i början ineffektiva. Istället brukar Deque implementeras genom att använda två ArrayList:or: en för början av datastrukturen och en för slutet av den. ArrayList:an för början av datastrukturen är lagrad baklänges, så istället för att stoppa in eller ta bort element i början på den (ineffektivt) stoppar man in eller tar bort dem i slutet på den (effektivt). Tillämpningar som använder ArrayDeque vet givetvis inget om de två ArrayList:or, för dem ska ArrayDeque bete sig som om den var en sammanhängande sekvens av element. Deque<E> och ArrayDeque<E> ska ha följande metoder: addfirst tar som argument ett objekt av rätt typ och adderar det i början av datastrukturen (dvs i slutet av den ArrayList:an som tjänstgör som början) addlast - tar som argument ett objekt av rätt typ och adderar det i slutet av datastrukturen (dvs i slutet av den ArrayList:an som tjänstgör som slutet) get tar ett heltalsindex och returnerar referensen till elementet på denna position. Ger IndexOutOfBoundsException om indexet är för stort eller mindre än 0. Obs att indexet måste översättas till rätt position i någon av de två ArrayList:or size returnerar hur många element som finns i datastrukturen Det borde givetvis finnas metoder för att ta bort första resp. sista elementet, men du kan bortse här från dessa metoder. Skriv gränssnittet Deque<E> och klassen ArrayDeque<E> som implementerar detta gränssnitt.

Lösningsförslag PROG2 tenta 2014-05-02 Uppgift 1 import javax.swing.*; import java.awt.*; import java.awt.event.*; class KartPanel extends JPanel{ private ImageIcon bilden; public KartPanel(String filnamn){ setlayout(null); bilden = new ImageIcon(filnamn); protected void paintcomponent(graphics g){ super.paintcomponent(g); g.drawimage(bilden.getimage(),0,0,this); class Kartan extends JFrame{ int meterperpixel; int previousx = 0, previousy = 0; double sträcka = 0.0; JTextField meterperpixelfält; JLabel sträckalabel; KartPanel kp; Kartan(String filnamn){ JPanel norra = new JPanel(); add(norra, BorderLayout.NORTH); norra.add(new JLabel("Sträcka: ")); sträckalabel = new JLabel("0"); norra.add(sträckalabel); norra.add(new JLabel("meter")); kp = new KartPanel(filnamn); add(kp); JPanel södra = new JPanel(); add(södra, BorderLayout.SOUTH); södra.add(new JLabel("En pixel motsvarar: ")); meterperpixelfält = new JTextField(3); södra.add(meterperpixelfält); södra.add(new JLabel("meter")); JButton okbutton = new JButton("Ok"); södra.add(okbutton); okbutton.addactionlistener(new MeterPerPixelLyss()); setdefaultcloseoperation(exit_on_close); setsize(650,350); setvisible(true);

Lösningsförslag PROG2 tenta 2014-05-02 class MeterPerPixelLyss implements ActionListener{ public void actionperformed(actionevent ave){ try{ meterperpixel = Integer.parseInt(meterPerPixelFält.getText()); kp.addmouselistener(new KlickLyss()); catch(numberformatexception e){ JOptionPane.showMessageDialog(Kartan.this, "Fel!"); class KlickLyss extends MouseAdapter{ public void mouseclicked(mouseevent mev){ int x = mev.getx(); int y = mev.gety(); if (previousx!= 0){ double avstånd = Math.sqrt(Math.pow(x - previousx, 2) + Math.pow(y - previousy, 2)); sträcka += avstånd * meterperpixel; sträckalabel.settext("" + (int)sträcka); previousx = x; previousy = y; public static void main(string[] args){ new Kartan(args[0]);

Lösningsförslag PROG2 tenta 2014-05-02 Uppgift 2 class Dag implements Comparable<Dag>{ private int veckonr, veckodag; private static final String[] VDAGAR = {"Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag","Söndag"; public Dag(int veckonr, int veckodag){ if (veckonr < 1 veckonr > 53 veckodag < 0 veckodag > 6) throw new IllegalArgumentException(); this.veckonr = veckonr; this.veckodag = veckodag; public String tostring() { return "vecka " + veckonr + " " + VDAGAR[veckoDag]; public boolean equals(object other){ if (other instanceof Dag){ Dag d = (Dag)other; return veckonr == d.veckonr && veckodag == d.veckodag; else return false; // Dag public int hashcode(){ return veckonr * 7 + veckodag; public int compareto(dag other){ int cmp = veckonr - other.veckonr; if (cmp!= 0) return cmp; return veckodag - other.veckodag; static Map<String, List<Dag>> permedlem(map<dag,string> vaktschema){ Map<String, List<Dag>> nymap = new TreeMap<>(); for(map.entry<dag,string> me : vaktschema.entryset()){ Dag dag = me.getkey(); String namn = me.getvalue(); List<Dag> daglista = nymap.get(namn); if (daglista == null){ daglista = new ArrayList<Dag>(); nymap.put(namn, daglista); daglista.add(dag); // for return nymap;

Lösningsförslag PROG2 tenta 2014-05-02 Uppgift 3 public interface Deque<E>{ void addlast(e val); void addfirst(e val); E get(int index); int size(); import java.util.*; public class ArrayDeque<E> implements Deque<E>{ private ArrayList<E> begin = new ArrayList<E>(); private ArrayList<E> end = new ArrayList<E>(); public void addfirst(e val){ begin.add(val); public void addlast(e val){ end.add(val); public E get(int index){ if (index < 0 index > size()) throw new IndexOutOfBoundsException("Fel i ArrayDeque.get"); if (index < begin.size()){ int beginindex = begin.size()-1-index; return begin.get(beginindex); else{ int endindex = index - begin.size(); return end.get(endindex); public int size(){ return begin.size() + end.size();