KTH Nada Leif Kusoffsky INDA Introduktion till Datalogi Tentamen 2002 augusti 22 Observera: Skriv hela tentan. Man kan inte längre tillgodoräkna sig resultat från kontrollskrivningar, ej heller bonuspoäng från laborationerna! Inga hjälpmedel tillåtna. Lycka till!! Observera : Lämna in svaren på frågorna på detta blad genom att lämna in detta blad! 1. Instansmetoder och instansvariabler deklareras genom att (2p) a) alltid skriva void b) utelämna ordet static c) skriva static a b c 2. För instansmetoder gäller att de (2p) a) kan anropas enbart om det finns objekt av klassen a b c b) kan anropas med <klassnamn>.<metodnamn> c) kan anropas enbart om det inte finns objekt av klassen 3. Det är möjligt att programmera på traditionellt imperativt sätt, i stort sett icke-objekt-inriktat, i Java genom a) att bara använda instansvariabler (2p) b) att aldrig använda referensvariabler a b c c) att bara använda klassvariabler och klassmetoder 4. En abstrakt java klass a) kan instansieras b) kan ej instansieras c) kan instansieras om final a b c 5. En java-applikation startar alltid med en metod main som (2p) a) är en instansmetod b) saknar parametrar c) har parameter av typen String [] 6. För instansvariabler gäller att de (2p) a) är odefinerade om man ej tilldelar dem vid deklarationen a b c b) är odefinerade om man ej tilldelar dem i konstruktorn c) finns i en uppsättning per skapat objekt 7. Uttrycket o1 == o2 blir true om o1 och o2 refererar a) objekt som är lika b) samma objekt c) olika arrayer med identiska element a b c (2p) 8. Satsen o1 = o2 leder till att referens-variablerna o1 och o2 refererar a) två olika objekt som är likadana b) samma objekt c) "kloning" a b c (2p) 9. En Java-klass kan (2p) a) direkt ärva en enda annan klass a b c b) ej implementera ett interface om klassen ärver en annan klass c) direkt ärva flera klasser Observera : Lämna in svaren på frågorna på detta blad genom att lämna in detta blad!
Kopia på första bladet. 1. Instansmetoder och instansvariabler deklareras genom att (2p) a) alltid skriva void b) utelämna ordet static c) skriva static a b c 2. För instansmetoder gäller att de (2p) a) kan anropas enbart om det finns objekt av klassen a b c b) kan anropas med <klassnamn>.<metodnamn> c) kan anropas enbart om det inte finns objekt av klassen 3. Det är möjligt att programmera på traditionellt imperativt sätt, i stort sett icke-objekt-inriktat, i Java genom a) att bara använda instansvariabler (2p) b) att aldrig använda referensvariabler a b c c) att bara använda klassvariabler och klassmetoder 4. En abstrakt java klass a) kan instansieras b) kan ej instansieras c) kan instansieras om final a b c 5. En java-applikation startar alltid med en metod main som (2p) a) är en instansmetod b) saknar parametrar c) har parameter av typen String [] 6. För instansvariabler gäller att de (2p) a) är odefinerade om man ej tilldelar dem vid deklarationen a b c b) är odefinerade om man ej tilldelar dem i konstruktorn c) finns i en uppsättning per skapat objekt 7. Uttrycket o1 == o2 blir true om o1 och o2 refererar a) objekt som är lika b) samma objekt c) olika arrayer med identiska element a b c (2p) 8. Satsen o1 = o2 leder till att referens-variablerna o1 och o2 refererar a) två olika objekt som är likadana b) samma objekt c) "kloning" a b c (2p) 9. En Java-klass kan (2p) a) direkt ärva en enda annan klass a b c b) ej implementera ett interface om klassen ärver en annan klass c) direkt ärva flera klasser
10. a) Skriv en iterativ klassmetod (dvs en metod med en snurra, "loop", och inget rekursivt anrop) (8p)..... elemiter(int e, int n, int [] arr) {... som returnerar om det finns ett elementet lika med e i arr från och med elementet med index 0 till och med elementet med index n. Om ett felaktigt n (n <0, n> sista element i arr) ges skall metoden returnera false. b) Skriv motsvararande rekursiva metod..... maxiter(int e, int n, int [] arr) {... Tips: Ett elementet lika med e finns bland elementen med index i, 0<= i <= n, n >0 om elementet arr[n]==e eller om ett elementet lika med e finns bland elementen med index 0<= j <= n-1. (8p) c) Skriv ett huvudprogram för att testa metoderna i a) och b). Förslag till körresultat med inmatning kursiverat: (Programmet java Elem kollar om första efterföljande argument, i exemplen nedan 3 som alltså blir parametern e, finns bland de efterföljande argumenten som alltså blir parametern arr) (4p)...:~/undervisning/inda01/sec>java Elem 3 4 5 14 3 12 Is the first argument 3 an element in other arguments? (iteration) = true Is the first argument 3 an element in other arguments? (recursion) = true...:~/undervisning/inda01/sec>java Elem 3 4 5 14 3 Is the first argument 3 an element in other arguments? (iteration) = true Is the first argument 3 an element in other arguments? (recursion) = true...:~/undervisning/inda01/sec>java Elem 3 4 Is the first argument 3 an element in other arguments? (iteration) = false Is the first argument 3 an element in other arguments? (recursion) = false...:~/undervisning/inda01/sec>java Elem 3 Is the first argument 3 an element in other arguments? (iteration) = false Is the first argument 3 an element in other arguments? (recursion) = false...:~/undervisning/inda01/sec>java Elem 3 3 14 Is the first argument 3 an element in other arguments? (iteration) = true Is the first argument 3 an element in other arguments? (recursion) = true...:~/undervisning/inda01/sec>java Elem 3 3 Is the first argument 3 an element in other arguments? (iteration) = true Is the first argument 3 an element in other arguments? (recursion) = true
11 a). Alla länder har ett namn och ett namn på sin valuta. Vissa länder är medlemmar i EU och blev medlemmar ett visst år. Vissa av EU-länderna har en gemensam valuta med namnet "euro". Vissa länder (t ex Sverige som är ett EU-land, Frankrike som är ett Euro-EU-Land och Norge som bara är ett Land, men inte Storbrittanien som är ett EU-land) är med i Shengen-samarbetet. Dessa länder har tillgång till ett polisregister register av typen Map som dessa staters polismyndigheter kan söka i. Modellera i Java med sex klasser och ett gränsnitt denna situation, som den dessutom beskrivs med nedanstående UML-liknade klassdiagram. Samtliga klasser skall dessutom ha lämplig konstruktor som ger instanvariablerna lämpliga värden. 9p) Land - String namn //landets namn - String valuta //valutans namn Shengen public Object searchfor(string iperson) EULand - int inträdesår ShengenLand - Map register EuroEULand ShengenEULand - Map register ShengenEuroEULand - Map register Tips: Implementeringen av metoden searchfor(string iperson) görs med metoden get i Map: public Object searchfor(string iperson){ return register.get(iperson); Metoden deklareras alltså i gränsnittet Shengen,och skall implementeras av "Shengen-klasserna". Konstruktorn för Shengenländer har en parameter för att instansiera registret av typen Map. Euroländer får valutanamnet "euro" automatiskt utan medverkan av konstruktorerna för dessa sorts länder.
b). Kan man i Java förenkla problemet i 1 a) genom att använda multipelt arv? 1p) Mer givet för uppgift 12 på nästa sida. c). Vilka av namnen Land, EULand, EuroEULand, Shengen, ShengenLand, ShengenEULand, ShengenEuroEULand och Map kan användas som typnamn? 1p) d). Skulle man kunna ha en Vector där elementen skull kunna vara instanser av vilken som helst av de sex klasserna? Hur deklarerar man i så fall en sådan Vector, och hur tillfogas i så fall några länder, t ex Sverige och Frankrike och Norge till vektorn? 1p) e). Förse de av de sex klasserna där det behövs med en metod String tostring() som returnerar landets namn, namnet på valutan och i förekommande fall inträdesår i EU samt om landet är ett Shengenland. 3p) f). Skriv en metod void printinfo(vector länder) som med en slinga (snurra, loop) skriver ut information om alla länder i vectornländer med hjälp av tostring() i uppgift e. 3p) g) Förklara vad som menas med dynamisk bindning. 2p) 12 Implementera en prioritetskö med en dubbellänkad lista i en klass DLPriorityQueue (16p) som skall implementera gränsnittet PriorityQueue. Listan innehåller objekt av klassen DLItemNode. Listan hålls sorterad med avsende på nycklarna, (key), i DLItemNode.. För att jämföra nycklar används ett objekt som implementar gränsnittet java.util.comparator. Högsta prioritet = minsta nyckel. Du skall skriva hela klassen (bl a det som behövs för att skapa en lämplig datastruktur) med undantag för att av metoderna i gränssnittet PriorityQueue behöver du bara behöver implementera metoden public void insertitem(object k, Object e). Givet: public interface PriorityQueue { // Högsta prioritet = minsta nyckel public int size() ; // Antalet "items" i prioritetskön public boolean isempty(); // Är prioritetskön tom? public Object minelement() throws PriorityQueueEmptyException ; // Elemenet- delen av det "item" som har högst prioritet public Object minkey() throws PriorityQueueEmptyException; // Nyckeln i det "item" som har högst prioritet public void insertitem(object k, Object e); // Tillför nytt "item" public Object removemin() throws PriorityQueueEmptyException ; // Avlägsna det "item" som har högst prioritet
public class DLItemNode implements Item { private Object element; private Object key; private DLItemNode left; private DLItemNode right; /** constructor with parameters */ public DLItemNode(Object k, Object e) { this(k, e, null, null); /** constructor with parameters */ public DLItemNode(Object k, Object e,dlitemnode ileft, DLItemNode iright ){ setelement(e);setkey(k); left = ileft; right = iright; public Object element() { return element; public void setelement(object o) { element=o; public Object key() { return key; public void setkey(object o) { key=o; public DLItemNode left() {return left; public void setleft(dlitemnode ileft) {left = ileft; public DLItemNode right() {return right; public void setright(dlitemnode iright) {right = iright; 13 Vilken komplexitet har körtiden för opertionen findelement när man gör en binärsökning i en "look-up-table"? Enligt bokens definition finns en "look-up-table" i vad boken betecknar som en vektor. Motivera ditt svar. (16p) 14 Visa hur man med "in-place quick sort" gör en lexiografisk sortering av strängar med två tecken, alla tecken c i intervallet a <= c <= z. (16p) Svara genom att visa och kommentera hur dessa strängar sorteras: zb pe mm ng Är det en bra sorteringsmetod?
Förslag till svar tenatamen i 2D1340 Introduktion till datalogi 2002 augusti 22. 1. Instansmetoder och instansvariabler deklareras genom att (2p) a) alltid skriva void b) utelämna ordet static c) skriva static a bx c 2. För instansmetoder gäller att de (2p) a) kan anropas enbart om det finns objekt av klassen a x b c b) kan anropas med <klassnamn>.<metodnamn> c) kan anropas enbart om det inte finns objekt av klassen 3. Det är möjligt att programmera på traditionellt imperativt sätt, i stort sett icke-objekt-inriktat, i Java genom a) att bara använda instansvariabler (2p) b) att aldrig använda referensvariabler a b cx c) att bara använda klassvariabler och klassmetoder 4. En abstrakt java klass a) kan instansieras b) kan ej instansieras c) kan instansieras om final a bx c 5. En java-applikation startar alltid med en metod main som (2p) a) är static b) saknar parametrar c) är fördefinierad a x b c 6. För instansvariabler gäller att de (2p) a) är odefinerade om man ej tilldelar dem vid deklarationen a b cx b) är odefinerade om man ej tilldelar dem i konstruktorn c) finns i en uppsättning per skapat objekt 7. Uttrycket o1 == o2 blir true om o1 och o2 refererar a) objekt som är lika b) samma objekt c) olika arrayer med identiska element a bx c 8. Satsen o1 = o2 leder till att o1 och o2 refererar a) två olika objekt som är likadana b) samma objekt c) "kloning" a bx c (2p) 9. En Java-klass kan (2p) a) direkt ärva en enda annan klass a x b c b) ej implementera ett interface om klassen ärver en annan klass c) direkt ärva flera klasser 10 public class Elem { public static boolean elemiter(int e, int n, int [] arr) { -- a if (n<0 arr.length - 1 < n) { throw new RuntimeException(" n < 0 not allowed or n too big"); else { boolean result = false; int i = 0; while ((i <= n) &&!result ) { result = (arr[i] == e); i = i+1; (2p)
return result; public static boolean elemrec(int e, int n, int [] arr) { -- b if (n<0 arr.length - 1 < n) { throw new RuntimeException(" n < 0 not allowed or n too big"); else if (n == 0) { return (arr[n] == e); else { return (arr[n] == e) elemrec(e, n-1, arr); public static void main(string [] arg) { int e = Integer.parseInt(arg[0]); int [] myarr = new int [arg.length-1]; for (int i = 1; i < arg.length; i = i+1) { myarr[i-1] = Integer.parseInt(arg[i]); System.out.println("Is the first argument " + e + " an element in other arguments? (iteration) = " + elemiter(e, myarr.length-1, myarr)); -- c System.out.println("Is the first argument " + e + " an element in other arguments? (recursion) = " + elemrec(e, myarr.length-1, myarr)); 11 public class Land { protected String valuta = ""; protected String namn = ""; //11a, 11e public Land(String inamn, String ivaluta) { namn = inamn; valuta = ivaluta; public String tostring() { return (namn + ": valuta " + valuta);
public interface Shengen { public Object searchfor(string iperson); import java.util.*; public class ShengenLand extends Land implements Shengen { private Map register; public ShengenLand(String inamn, String ivaluta, Map iregister) { super(inamn, ivaluta); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); public String tostring() { return super.tostring() + " i Shengen"; public class EULand extends Land { protected int inträdesår; public EULand(String inamn, String ivaluta, int iinträdesår) { super(inamn, ivaluta); inträdesår = iinträdesår; public String tostring() { return super.tostring() + " i Eu år " + inträdesår; import java.util.*; public class ShengenEULand extends EULand implements Shengen { private Map register; public ShengenEULand(String inamn, String ivaluta,
int iinträdesår, Map iregister) { super(inamn, ivaluta, iinträdesår); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); public String tostring() { return super.tostring() + " i Shengen"; public class EuroEULand extends EULand { public EuroEULand(String inamn, int iinträdesår) { super(inamn, "euro", iinträdesår); import java.util.*; public class ShengenEuroEULand extends EuroEULand { private Map register; public ShengenEuroEULand(String inamn, int iordförandeår, Map iregister) { super(inamn, iordförandeår); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); public String tostring() { return super.tostring() + " i Shengen"; Multipelt arv är inte tillåtet i Java. Det vore bekvämt här Alla // 11b // 11c
import java.util.*; // public class TestLander { public static void main(string [] args) { Vector lv = new Vector(); //11d Map m = new Hashtable(); lv.add(new ShengenEULand("Sverige", "krona", 1995, m)); lv.add(new ShengenEuroEULand("Frankrike", 1955, m)); lv.add(new EULand("Storbrittanien","pund", 1965)); lv.add(new Land("Norge","krona")); printinfo(lv); public static void printinfo(vector v) { for(int i = 0; i < v.size(); i = i+1) { System.out.println(v.elementAt(i)); // 11f Beroende på objektets typ används korrekt version av en metod, t ex tostring() ovan. Detta fungerar eftersom metodrna hittas i minnet via objekten, som innehåller referenser till adekvat version //11g 12 import java.util.*; public class DLPriorityQueue implements PriorityQueue { private Comparator comp; private int size = 0; private DLItemNode sentinel; public DLPriorityQueue(Comparator c) { if (c == null) { throw new IllegalArgumentException("Null comparator passed"); else { comp = c; sentinel = new DLItemNode(null, null,null, null); sentinel.setleft(sentinel); sentinel.setright(sentinel); public void insertitem(object k, Object e) { sentinel.setkey(k);
DLItemNode walker = sentinel.right(); while (comp.compare(k, walker.key()) > 0) { walker = walker.right(); DLItemNode ny = new DLItemNode(k, e, walker.left(), walker); (walker.left()).setright(ny); walker.setleft(ny); size = size + 1; 13 Se boken sid 358, sid 359. 14 zb pe mm ng pivopt last element is pivot mm pe zb ng pivot scan from left and right, swap first small to with first bigt. Herf zb > ng, mm<ng => swap mm and zb mm ng zb pe small inplace --unsort big-- swap pivot in place mm ng zb pe sorted inplace pivot sort small nad big. Here small is only one elemnt => already sorted sort big, i. e. zb pe the same way mm ng pe zb sorted inplace inplace big mm ng pe zb sorted inplace inplace sorted Here the new big sequence is only one elemnt => already sorted