PROG2 Tenta 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 och DSV1:P2

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

SP:PROG3 HT12 Tenta

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

Lösningar för tenta 3 DAT043,

TENTAMEN OOP

DAT043 Objektorienterad Programmering

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

Repetition av OOP- och Javabegrepp

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

Repetition av OOP- och Javabegrepp

OOP Tenta

TENTAMEN OOP

OOP Tentamen

Lösningsförslag till tentamen

OOP Tentamen

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

OOP Omtenta

TENTAMEN OOP

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

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

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

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

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

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

OOP Objekt-orienterad programmering

OOP Tentamen

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

Lösningsförslag till tentamen

MVC-mönstret. model-view-control i Swing

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

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

OOP Omtenta

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

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

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

OOP Omtenta

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

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

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

Tentamen i Programmering

OOP Tenta

Tentamen OOP

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

Den som bara har en hammare tror att alla problem är spikar

Tentamen, EDAA10 Programmering i Java

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

kl

Tentamen FYTA11 Javaprogrammering

Föreläsning 9 Innehåll

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

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

Del A (obligatorisk för alla)

Tentamen. Lösningsförslag

OOP Objekt-orienterad programmering

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

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

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

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

Lösningsförslag till tentamen

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Laboration A Objektsamlingar

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

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Laboration 24 Databasen MySQL och java

Arrayer. results

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

Tentamen i Objektorienterad programmering

Lösningsförslag till tentamen FYTA11 Javaprogrammering

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Saker du ska kunna Föreläsning 13 & 14

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Mer om grafiska komponenter. Händelsestyrda program

OOP Exempel Tentamen 2007

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

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.

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

DAT043 - föreläsning 8

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

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

Föreläsning REPETITION & EXTENTA

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

Transkript:

DSV SU/KTH sid 1 (7) PROG2 PROG2 Tenta 2014-01-17 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 (12 poäng) Den 25 maj i år är det val till EU-parlamentet i Sverige. I en viss organisation har man bestämt sig för att göra ett provval som ett slags opinionsundersökning. Man vill göra detta med ett Java-program som skapar ett fönster med följande utseende (nedan till vänster): I mitten finns en lista med de partier man kan rösta på. När man ska rösta skriver man in sitt namn i textfältet upptill, väljer ett parti i listan och trycker på knappen "Rösta" (ovan till höger). Om man har glömt att skriva in ett namn eller välja ett parti så ska ett felmeddelande visas i en dialogruta. Man får givetvis inte registrera vem som röstat på vilket parti, namnet är bara till för att kontrollera att personen med det namnet inte redan har röstat. Om personen med det inmatade namnet redan har röstat ska det komma ett felmeddelande i en dialogruta (vi antar att namnen är unika). Efter att man har röstat ska namnfältet blankställas och markeringen från listan tas bort. För att avsluta provvalet kan man trycka på knappen "Resultat". Då ska det visas en dialogruta med partierna och hur många röster de har fått (se nedan). Samtidigt ska knappen "Rösta" göras otryckbar (man får inte rösta efter att ha sett resultatet). Lite tips: man får fram det valda alternativet från en JList med metoden getselectedvalue(). Finns det inget valt alternativ returnerar denna metod null. Man tar bort markeringar från en JList med metoden clearselection(). Se nästa sida för kod som ska kompletteras.

DSV SU/KTH sid 4 PROG2 Nedan finns koden till klassen EUVal som du ska modifiera/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 EUVal extends JFrame{ 6 final static String[] PARTIER = 7 {"Centerpartiet","Feministiskt Initiativ", 8 "Folkpartiet Liberalerna","Junilistan","Kristdemokraterna", 9 "Miljöpartiet de gröna","moderata Samlingspartiet","Piratpartiet", 10 "Socialdemokraterna","Sverigedemokraterna","Vänsterpartiet"; 11 12 EUVal(){ 13 JPanel uppe = new JPanel(); 14 add(uppe, BorderLayout.NORTH); 15 uppe.add(new JLabel("Namn:")); 16 uppe.add(new JTextField(10)); 17 uppe.add(new JButton("Rösta")); 18 19 JPanel center = new JPanel(); 20 JList<String> partier=new JList<String>(PARTIER); 21 partier.setvisiblerowcount(partier.length); 22 partier.setselectionmode(listselectionmodel.single_selection); 23 center.add(partier); 24 add(center, BorderLayout.CENTER); 25 26 JPanel nere = new JPanel(); 27 add(nere, BorderLayout.SOUTH); 28 nere.add(new JButton("Resultat")); 29 30 setdefaultcloseoperation(exit_on_close); 31 setsize(300,350); 32 setvisible(true); 33 34 35 public static void main(string[] args){ 36 new EUVal(); 37 38

DSV SU/KTH sid 5 PROG2 Uppgift 2 (13 poäng) På ett visst företag ska man identifiera sina kunder med telefonnummer. Man tänker sig använda följande två klasser: public class TelNr{ private int riktnr, abnr; public TelNr(int riktnr, int abnr){ this.riktnr = riktnr; this.abnr = abnr; public int getriktnr() { return riktnr; public int getabonnentnr() { return abnr; public String tostring() { return "0" + riktnr + " - " + abnr; // Telnr class Kund{ private String namn; private TelNr tel; // Andra attribut, oväsentliga här public Kund(String namn, TelNr tel){ this.namn = namn; this.tel = tel; public String getnamn() { return namn; public TelNr gettel() { return tel; public void settel(telnr nytttel) { this.tel = nytttel; public String tostring() { return namn + " " + tel; // Kund a) förbered klassen TelNr för att användas som nyckel i en HashMap b) efter att en HashMap<TelNr, Kund> har använts en längre period inser man att många kunder har bytt telefonnummer med hjälp av metoden settel() i klassen Kund. Man har alltså ändrat telefonnumret hos Kund-objektet utan att ändra nyckeln i Map:en, så dessa Kund-objekt finns under fel nyckel i Map:en. Man behöver nu därför en metod static void repair(map<telnr, Kund> themap); som hittar alla TelNr/Kund-par där nyckeln i Map:en inte stämmer med tel i Kund-objektet, tar bort detta par ur Map:en och sätter in Kund-objektet i Map:en igen men med rätt TelNr som nyckel. Dessutom vill man att denna metod skriver ut en lista på de Kunder som man uppdaterat på detta sätt, men i alfabetisk ordning efter Kundernas namn. Skriv denna metod. Obs! Kom ihåg vid borttagandet av paren från Map:en att man inte får ta bort element direkt ur en datastruktur under iteration över denna datastruktur.

DSV SU/KTH sid 6 PROG2 Uppgift 3 (13 poäng) Den här uppgiften handlar om att skapa en återanvändbar datastruktur kallad MinMaxQueue. Detta är en datastruktur där man kan stoppa in objekt, man kan ta bort det största objektet som just nu finns i datastrukturen (och samtidigt få en referens till det borttagna objektet), och samma sak för det minsta objektet. Sådana datastrukturer brukar implementeras på olika komplicerade sätt för att öka deras effektivitet, men om man struntar i effektiviteten så kan man implementera den med en vanlig ArrayList, på nästa sida finns koden för en sådan ArrayMinMaxQueue för heltal. Metoden add() adderar ett nytt objekt till samlingen, removemax() letar upp det största objektet, tar bort det ur samlingen och returnerer det och removemin() gör motsvarande för det minsta objektet. Metoden isempty() returnerar true om samlingen är tom. För att minska upprepning av kod använder remove-metoderna hjälpmetoden findpos som letar efter positionen för det största resp. minsta värdet. Denna metod är en intern arbetsmetod. Din uppgift är att göra följande: - man ska kunna hantera godtyckliga objekt i klassen, inte bara heltal. Gör om klassen till en generisk klass med elementtypen som generisk parameter. Obs att du måste ange att man ska kunna jämföra elementen, och att du även måste skriva om jämförelserna (som nu görs med operatorerna < resp. >, vilket bara kan göras med element av primitiva numeriska typer) - MinMaxQueque kan implementeras på olika sätt men med samma funktionalitet. Man kan underlätta utbytbarheten mellan olika implementeringar genom att deklarera funktionaliteten i ett gränssnitt (interface), t.ex. med namnet just MinMaxQueue. Skriv detta gränssnitt och se till att din ArrayList-implementering deklarerar att den uppfyller gränssnittet - lägg gränssnittet och klassen med ArrayList-implementeringen i ett paket minmax - klassen och dess attribut och metoder är deklarerade utan några synlighetsmodifierare (public o.s.v.). Komplettera med lämpliga synlighetsmodifierare - hjälpmetoden findpos() utgår från att det finns minst ett element i datastrukturen. Komplettera metoden så att undantaget NoSuchElementException genereras om det inte finns några element i datastrukturen

DSV SU/KTH sid 7 PROG2 import java.util.*; class ArrayMinMaxQueue{ ArrayList<Integer> data = new ArrayList<Integer>(); // Lägger till ett värde i datastrukturen void add(int value){ data.add(value); // Hjälpmetod som hittar positionen för största // eller minsta värdet beroende på argumentet formax int findpos(boolean formax){ int pos = 0; if (formax) for(int i = 1; i < data.size(); i++){ if (data.get(pos) < data.get(i)) pos = i; else for(int i = 1; i < data.size(); i++){ if (data.get(pos) > data.get(i)) pos = i; return pos; // Tar bort och returnerar största värdet int removemax(){ int pos = findpos(true); int max = data.get(pos); data.remove(pos); return max; // Tar bort och returnerar minsta värdet int removemin(){ int pos = findpos(false); int min = data.get(pos); data.remove(pos); return min; // Returnerar true om datastrukturen är tom boolean isempty(){ return data.isempty();

Lösningsförslag PROG2 tenta 2014-01-17 Uppgift 1 import javax.swing.*; import java.awt.event.*; import java.util.*; class EUVal extends JFrame{ final static String[] PARTIER = {"Centerpartiet","Feministiskt Initiativ", "Folkpartiet Liberalerna","Junilistan","Kristdemokraterna", "Miljöpartiet de gröna","moderata Samlingspartiet","Piratpartiet", "Socialdemokraterna","Sverigedemokraterna","Vänsterpartiet"; Map<String, Integer> röster = new TreeMap<String,Integer>(); JList<String> partier=new JList<String>(PARTIER); Set<String> röstat = new HashSet<String>(); JTextField namnfält; JButton röstbutton; EUVal(){ JPanel uppe = new JPanel(); add(uppe, BorderLayout.NORTH); uppe.add(new JLabel("Namn:")); namnfält = new JTextField(10); uppe.add(namnfält); röstbutton = new JButton("Rösta"); uppe.add(röstbutton); röstbutton.addactionlistener(new RöstaLyss()); JPanel center = new JPanel(); partier.setvisiblerowcount(partier.length); partier.setselectionmode(listselectionmodel.single_selection); center.add(partier); add(center, BorderLayout.CENTER); JPanel nere = new JPanel(); add(nere, BorderLayout.SOUTH); JButton resultatbutton = new JButton("Resultat"); nere.add(resultatbutton); resultatbutton.addactionlistener(new ResultatLyss()); setdefaultcloseoperation(exit_on_close); setsize(300,350); setvisible(true); class RöstaLyss implements ActionListener{ public void actionperformed(actionevent ave){ String namn = namnfält.gettext(); String parti = partier.getselectedvalue(); if (namn.equals("")) JOptionPane.showMessageDialog(null, "Namn ej ifyllt!"); else if (parti == null) JOptionPane.showMessageDialog(null, "Parti ej valt!"); else if (röstat.contains(namn)) JOptionPane.showMessageDialog(null, "Redan röstat!"); else { röstat.add(namn); Integer antalröster = röster.get(parti); if (antalröster == null) antalröster = 0; röster.put(parti, antalröster+1); namnfält.settext(""); partier.clearselection();

Lösningsförslag PROG2 tenta 2014-01-17 class ResultatLyss implements ActionListener{ public void actionperformed(actionevent ave){ namnfält.setenabled(false); röstbutton.setenabled(false); String str = ""; for(map.entry<string,integer> me : röster.entryset()) str += me.getkey()+": " + me.getvalue() + "\n"; JOptionPane.showMessageDialog(null, str); public static void main(string[] args){ new EUVal(); Uppgift 2 class TelNr{ private int riktnr, abnr; public TelNr(int riktnr, int abnr){ this.riktnr = riktnr; this.abnr = abnr; public int getriktnr() { return riktnr; public int getabonnentnr() { return abnr; public String tostring() { return "0"+riktNr+" - "+abnr; public boolean equals(object other){ if (other instanceof TelNr){ TelNr t = (TelNr)other; return riktnr == t.riktnr && abnr == t.abnr; else return false; public int hashcode(){ return riktnr + abnr * 1000; // Telnr

Lösningsförslag PROG2 tenta 2014-01-17 class NamnCmp implements Comparator<Kund>{ public int compare(kund k1, Kund k2){ return k1.getnamn().compareto(k2.getnamn()); static void repair(map<telnr, Kund> kunder){ Set<TelNr> tels = new HashSet<TelNr>(); for(map.entry<telnr,kund> me : kunder.entryset() ){ TelNr key = me.getkey(); Kund kund = me.getvalue(); if (!key.equals(kund.gettel())) tels.add(key); List<Kund> forutskrift = new ArrayList<Kund>(); for(telnr tnr : tels) { Kund k = kunder.remove(tnr); kunder.put(k.gettel(), k); forutskrift.add(k); Collections.sort(forUtskrift, new NamnCmp()); for(kund k : forutskrift) System.out.println(k); Uppgift 3 package minmax; public interface MinMaxQueue<E extends Comparable<E>>{ void add(e value); E removemax(); E removemin(); boolean isempty();

Lösningsförslag PROG2 tenta 2014-01-17 package minmax; import java.util.*; public class ArrayMinMaxQueue<E extends Comparable<E>> implements MinMaxQueue<E>{ private ArrayList<E> data = new ArrayList<E>(); public void add(e value){ data.add(value); private int findpos(boolean formax){ if (data.isempty()) throw new NoSuchElementException("Tom kö!"); int pos = 0; if (formax) for(int i = 1; i < data.size(); i++){ if (data.get(pos).compareto(data.get(i)) < 0) pos = i; else for(int i = 1; i < data.size(); i++){ if (data.get(pos).compareto(data.get(i)) > 0) pos = i; return pos; public E removemax(){ int pos = findpos(true); E max = data.get(pos); data.remove(pos); return max; public E removemin(){ int pos = findpos(false); E min = data.get(pos); data.remove(pos); return min; public boolean isempty(){ return data.isempty();