Tentamen Programmeringsmetodik, KV: Java och OOP 20 januari 2005 Examinator: Johan Karlsson Skrivtid: 16-22 Hjälpmedel: Maximalt en av följande böcker: Barnes & Kölling: Objects First With Java a practical introduction using BlueJ Lewis & Loftus: Java Software Solutions Holm: Objektorienterad programmering och Java Frank M. Carrano & Janet J. Prichard: Data Abstraction and Problem Solving with JAVA Franzen: Java från Grunden (eller motsvarande) Maxpoäng: 600 (plus 280 om du inte skrev duggan) För godkänt krävs normalt 500 poäng på kursen. Observera att uppgift 11-15 enbart ska lösas av de som inte skrev duggan! Betyg som ges är U, G och VG. Börja varje uppgift på ett nytt blad och skriv uppgiftsnummer längst uppe till höger. Skriv namn och personnummer på varje blad Uttryck dig mycket tydligt. Alla otydligheter tolkas till din nackdel. Om du är osäker på tolkningen av en fråga, skriv ner en rimlig tolkning av frågan och lös enligt den tolkningen. Är frågan uppdelad i flera deluppgifter kan man klara senare deluppgifter även om man inte klarat första. Försök därför lösa alla deluppgifter. Resultat kommer att tillkännages via webben. Lärare kommer förbi ca kl. 19.00 Lycka till!
Uppgift 1 (10 p) Skriv namn, personnummer och uppgiftsnummer på angiven plats på varje inlämnat blad. Inget får skrivas på baksidorna av bladen. Sortera bladen i rätt ordning. Börja varje ny uppgift på ett nytt blad. Uppgift 2 (40 + 20p) a) Givet följande vektor Beskriv relativt detaljerat hur vektorn sorteras om man använder följande algoritmer: b) 5 3 9 2 6 4 Bubblesort Mergesort Om antalet element i vektorn utökas, vilken algoritm går då snabbast? Är det alltid så? Motivera ditt svar. Uppgift 3 (30 p) Förklara vad ett interface har för uppgift och hur det kan användas. Ge exempel där interface är lämpligt att använda och motivera varför. 2
Uppgift 4 (50 p) Utgå från följande situation Class1 +Class1() +method() +method(int) Class2 +Class2() +method(int) +method(int, int) Class3 +Class3() +method() +method(int) (alltså, Class2 ärver från Class1 och Class3 ärver från Class2) och följande satser: Class1 c1 = new Class1(); Class2 c2 = new Class2(); Class3 c3 = new Class3(); Vilken version av method anropas efter satserna nedan? Skriv ej tillåten om raden ej är tillåten. Alla metoder är publika. Ange klassnamn samt motivering (använd radnumren nedan för att referera). Radnummer 1 c1.method(1); 2 c1.method(1, 2); 3 c1 = c2; 4 c1.method(); 5 c1.method(1); 6 c1.method(2, 1); 7 c1 = c3; 8 c1.method(); 9 c1.method(1); 10 c1.method(1, 3); 3
Uppgift 5 (60p) Ett polynom kan skrivas som tex. a 0 + a 1 x + a 2 x 2 + a 3 x 3 + + a n x n där a 0 a n är konstanter. Skriv en klass som ska representera ett polynom. Klassen ska ha en konstruktor som tar en array som parameter. Denna array ska innehålla de olika konstanterna som definierar polynomet. Förutom konstruktorn ska klassen innehålla två metoder till: evaluate som givet ett värde för x beräknar och returnerar polynomets värde (för just detta x). tostring som ska skapa och returnera en strängrepresentation av polynomet. Din klass ska fungera med nedanstående testprogram som skapar polynomet 1+2x+3x 2 och utför operationerna ovan på det. Din klass ska ge de utskrifter som anges i kommentarerna efter println satserna om den används tillsammans med testprogrammet. public class PolynomTest { public static void main(string[] args) { double[] a={1.0, 2.0, 3.0; Polynom poly=new Polynom(a); System.out.println(poly); //1.0+2.0x+3.0x^2 System.out.println(poly.evaluate(2.0)); //17.0 4
Uppgift 6 (80 p) Den nystartade tv-kanalen TV Java behöver din hjälp med att göra en klassdesign av informationssystemet för programmen som ska visas på kanalen. Kanalen visar tre olika typer av tv-program; dokumentärer, underhållningsprogram och nyheter. I framtiden funderar man på att också börja visa filmer men det är inte aktuellt just nu. Dock ska systemet du designar enkelt kunna byggas ut för att i framtiden visa information om även filmer (och andra typer av tv-program). Varje tv-program har en start-tid och en slut-tid. Till varje tv-program ska det också finnas en beskrivning av innehållet. För dokumentärer vill tv-kanalen också lagra uppgifter om regissör samt produktions-år. För underhållningsprogram anses det viktigt med kategori (t.ex. spel-program). Varje tv-program ska dessutom ha en sk. show-view siffer-kod (som kan användas för att på lättare sätt programmera inspelningar på en videoapparat). Det ska dessutom finnas en påminnelsefunktion där en användare av informationssystemet kan registrera sig för att få en påminnelse när programmet han/hon velat se börjar. Gör en objektorienterad modell för systemet. Hur det ska representeras grafiskt eller hur informationen i slutändan ska lagras (i en databas t.ex.) behöver du inte bry dig om. Du behöver ej heller bry dig om detaljerna för om hur en påminnelse ska ske (t.ex. genom att ett email skickas ut) däremot naturligtvis hur påminnelsefunktionen fungerar och hur den jobbar med andra klasser. Gör en översiktlig klassdesign där du fokuserar på ansvarsområden för de olika klasserna samt hur de jobbar med varandra. Tänk på att välja bra och tydliga namn på metoder, attribut och klasser och även att följa Java namngivningsstandarder. Lägg till förklaringar om det ej är helt uppenbart vad de har för uppgift. Uppgift 7 (30 p) Vad innebär begreppen cohesion och coupling? Varför är de egenskaperna viktiga? Ge exempel på klasser med hög cohesion och låg coupling (du behöver alltså inte skriva klasserna utan beskriv dem med lämplig detaljnivå). 5
Uppgift 8 (50 p) Givet nedanstående två klasser Counter samt MinKlass, vad skrivs ut om programmet körs? public class Counter { private int value = 0; public void incr() { value++; public String tostring() { return ""+value; public class MinKlass { public static void changevalues(int n, Counter c1, Counter c2) { n++; c1.incr(); c2 = new Counter(); c2.incr(); public static void main(string[] args) { int k=5; Counter a = new Counter(); Counter b = new Counter(); MinKlass.changeValues(k,a,b); System.out.println("k="+k); System.out.println("a="+a); System.out.println("b="+b); 6
Uppgift 9 (80 p) Skriv en klass Date vars objekt representerar datum. För att förenkla uppgiften antar vi att alla månader har exakt 30 dagar. Klassen ska ha två konstruktorer. Den ena konstruktorn ska ta två heltal där det första talet är numret på månaden och det andra talet är numret på dagen (i den månaden). Om de två talen är t.ex. 2 och 7 så kommer det objekt som skapas genom att anropa den konstruktorn att representera den 7 februari. Den andra konstruktorn ska ta endast ett heltal som representerar antalet dagar sen början av året. Om talet är t.ex. 43 så innebär det dag 43 under året (13 februari). Lämplig felkontroll ska ske på argumenten till konstruktorerna och om de ej är giltliga (t.ex. negativt nummer på månaden) så ska ett undantag av typen NoSuchDateException kastas från konstruktorn. Skriv också klassen NoSuchDateException. Klassen Date ska dessutom ha två ytterligare metoder; nextday som ändrar datumet som objektet representerar till nästa dag samt tostring som returnerar en strängrepresentation av typen [dag] [månadsnamn] vid anrop. T.ex. ska ett objekt av typen Date med 7 som värde för månaden och 2 som värde för dagen returnera strängen 2 juli vid anrop till dess tostring metod. Tänk också på att eventuella attribut i klassen ska skyddas. 7
Uppgift 10 (70 + 40 + 40 p) En mängd defineras som en samling element utan inbördes ordning och utan dubletter. Två mängder är t.ex. lika om de innehåller samma element oberoende av elementens inbördes ordning. Se interface Set nedan för ytterligare förklaringar. public interface Set { // Adds the given element to the Set public void add(int elem); // Returns true if the given integer elem is in this set, otherwise false public boolean contains(int elem); // Returns true if the given set s is equal to this set, otherwise false public boolean equals(set s); // Returns the current length of the set (not the maximum length) public int length(); Nedan finns en implementation av interfacet Set som endast tillåter heltal att ingå i mängden (vi antar dessutom en maxgräns på 20 heltal i mängden): public class TraditionalSet implements Set { private int [] a = new int[20]; private int currentfreeindex = 0; public boolean contains(int elem) { boolean containsit = false; for (int i = 0; i < length(); i++) { if (a[i] == elem) { containsit = true; break; return containsit; public void add(int elem) { if (!contains(elem)) a[currentfreeindex++] = elem; public boolean equals(set s) { boolean equal = length() == s.length(); for (int i = 0; i < length(); i++) { if (!s.contains(a[i])) { equal = false; break; return equal; public int length() { return currentfreeindex; 8
Uppgifter: Obs! Med array så menas inte klassen java.util.vector, så använd ej java.util.vector. a) Skriv en klass OrderedSet (som implementerar interfacet Set) där alla heltal sätts in i stigande storleksordning i en array. Tänk på att (om möjligt) skriva operationerna från Set på ett effektivare sätt i OrderedSet än hur de löses i TraditionalSet. Ni ska alltså inte i denna deluppgift använda er direkt av TraditionalSet utan skriva en helt ny klass (dock kan det ju säkert ge lite tips att studera den klassen). b) Om vi antar att vi lagrar talen i storleksordning (som vi gör i OrderedSet), hur påverkas komplexiteten för operationerna add, equals samt contains jämfört med implementationen av dessa i TraditionalSet? Gäller det alltid? Ge exempel. c) Skriv om interfacet Set samt den givna klassen TraditionalSet (alltså inte OrderedSet från a-uppgiften) och gör dom mer generella så att de kan innehålla referenser till Object istället för heltal. Döp den förändrade klassen till MyGeneralSet. 9
OBS! Uppgift 11-15 ska enbart lösas av dem som inte skrev duggan den 17 december 2004. Uppgift 11 (45 + 20 + 40 p) a) Ordna talen 19, 28, 5, 9, 27, 4, 7, 8 i ett binärt sökträd. Bygg upp trädet i den ordning talen gavs, d.v.s. låt 19 vara root etc. b) Är trädet balanserat? Motivera. c) Besök trädet postorder. Ange varje nods värde när du besöker den. Uppgift 12 (40 + 30 p) a) Arrangera följande klasser i en arvshierarki, där de ärver egenskaper av klasser högre upp i hierarkin. Anställd Person Lärare Student Administrativ personal Forskare Motivera hur du har tänkt (varför ärver de från varandra). b) Nämn utifrån den hierarki du har skapat i a), minst en ytterligare egenskap (attribut) hos varje klass som inte finns i den ärvda klassen. 10
Uppgift 13 (30 p) Antag att ni har en tom stack. Vad har stacken för utseende efter följande operationer? Tänk på att markera var toppen på er stack är. push(a) push(b) top() pop() isempty() pop() push(d) pop() push(e) push(f) top() push(g) Uppgift 14 (25 p) Vilka av följande kodexempel är syntaktiskt korrekta? Se på varje exempel separat och anta att eventuella variabler är korrekt deklarerade innan. Varje rätt svar ger 5 poäng. Använd numren för att referera. 1 int a = b = c = 0; 2 do { break; while(!finished) 3 private class MyClass { 4 while(this!= 9) { int b = 0; b++; 5 for(;;) 11
Uppgift 15 (50 p) Givet följande: public class MyClass { private int a = 0; private static int b = 7; private String str; public MyClass(int d, String f) { b = d; str = f; public void mymethod(int a, int d, String f) { a = 2; b = d; f = str; Om vi skapar följande objekt: MyClass obj1 = new MyClass(4, "jkl"); MyClass obj2 = new MyClass(6, "mno"); String mystr = "pqr"; Och sen anropar metoden mymethod på obj1: obj1.mymethod(1, -9, mystr); Vilka värden har då attributen i objekten obj1 och obj2 efter det anropet? Vad innehåller mystr? Illustrera objekten, variabler och referenser. 12