KTH Nada Leif Kusoffsky INDA Introduktion till Datalogi Tentamen 20002 April 05 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. Antag att vi har deklarationen int i = 5;och anropet dosomething1(i); i en klass MyClass.(2p) dosomething1 anropar inga metoder och använder ej några icke- lokala variabler. Värdet på i i ett objekt av typen MyClass kan efter anropet a) ha ändrats b) ej ha ändrats c) ha avrundats a b c 5. En java-applikation startar alltid med en metod main som (2p) a) är static b) saknar parametrar c) är fördefinierad a b c 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 o1 och o2 refererar a) två olika objekt som är likadana b) samma objekt c) "kloning" a b c (2p) 9. Java-interface kan (2p) a) innehålla instansvariabler a b c b) innehålla lokala variabler för metoder c) ärva varandra 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. Antag att vi har deklarationen int i = 5;och anropet dosomething1(i); i en klass MyClass.(2p) dosomething1 anropar inga metoder och använder ej några icke- lokala variabler. Värdet på i i ett objekt av typen MyClass kan efter anropet a) ha ändrats b) ej ha ändrats c) ha avrundats a b c 5. En java-applikation startar alltid med en metod main som (2p) a) är static b) saknar parametrar c) är fördefinierad a b c 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 o1 och o2 refererar a) två olika objekt som är likadana b) samma objekt c) "kloning" a b c (2p) 9. Java-interface kan (2p) a) innehålla instansvariabler a b c b) innehålla lokala variabler för metoder c) ärva varandra
10. a) Skriv en iterativ klassmetod (dvs en metod med en snurra, "loop", och inget rekursivt anrop) (8p)..... maxiter(int n, int [] arr) {... som returnerar det största elementet i arr från och med elementet med index 0 till och med elementet med index n. Om ett felaktigt n ges skall ett undantag kastas. b) Skriv motsvararande rekursiva metod..... maxrek(int n, int [] arr) {... (8p) Tips: Maximala elementet av elementen med index i, 0<= i <= n, n >0 är lika med maximum av arr[n] och det maximala elementet av elementet med index j, 0<= j <= n - 1. c) Skriv ett huvudprogram för att testa metoderna i a) och b). (4p) Förslag till körresultat:... >java Max 4 6 8 Max element (iteration) = 8 Max element (recursion) = 8... >java Max 4 6 8 2 Max element (iteration) = 8 Max element (recursion) = 8... >java Max 14 4 6 8 2 Max element (iteration) = 14 Max element (recursion) = 14... >java Max Exception in thread "main" java.lang.runtimeexception: n < 0 not allowed at Max.maxIter(Compiled Code) at Max.main(Compiled Code) 11 a). Pennor kan vara antingen kulspetspennor, som ger permanent skrift, eller träblyerspennor som ger text som kan raderas. Pennor har från början (när de "skapas") en viss längd i mm. Träblyertspennor blir 10 mm kortare när de vässas. Kulspetspennor kan inte vässas och behåller sin ursprungslängd. Modellera i Java med tre klasser denna situation, som den dessutom beskrivs med nedanstående UML-liknade klassdiagram: 7p) Penna double längd double pennlängd() boolean gerpermanenttext() Kulspetspenna Träblyertspenna Kulspetspenna(double il) { Träblyertspenna(double il) void vässa()
b) Antag att vi har en deklaration Penna p; och att p refererar till ett pennobjekt av något slag. Hur skriver man i Java ett uttryck som kontrollerar om p är kortare än 50 mm? 1p) c) Samma antagande som i uppgift b). Hur skriver man i Java att p skall vässas om p refererar till en blyertspenna (detta skall för full poäng kontrolleras)? 3p) d) Att göra som i c) är ingen bra OO-programmering. Ändra koden i så att penor alltid kan vässa, men 3p) när kulspetspennar "vässas" händer ingenting. Hur kan man nu skriva att en penna p skall vässas, och vad kallas det att vilken metod vässa som körs beror på vilken sorts penna p refererar? 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 Mer givet för uppgift 12 på nästa sida.
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 betcknar som en vektor. Motivera ditt svar. (16p) 14 Visa hur man med "in-place insertion 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 hur dessa strängar sorteras: zb pe mm fg ae ma vm kl le pp Är det en bra sorteringsmetod?
Förslag till svar tenatamen i 2D1340 Introduktion till datalogi 2002 april 05. 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. Antag att vi har deklarationen int i = 5;och anropet dosomething1(i); i en klass MyClass.(2p) dosomething1 anropar inga metoder och använder ej några icke- lokala variabler. Värdet på i i ett objekt av typen MyClass kan efter anropet a) ha ändrats b) ej ha ändrats c) ha avrundats 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. Java-interface kan (2p) a) innehålla instansvariabler a b c x b) innehålla lokala variabler för metoder (2p) c) ärva varandra 10 public class Max { public static int maxlk(int a, int b) { return a>=b? a : b; public static int maxrec(int n, int [] arr) { if (n<0 arr.length - 1 < n) { throw new RuntimeException(" n < 0 not allowed");
else if (n==0) { return arr[0]; else { return maxlk(arr[n], maxrec(n-1, arr)); public static int maxiter(int n, int [] arr) { if (n<0 arr.length - 1 < n) { throw new RuntimeException(" n < 0 not allowed"); else { int result = arr[0]; for (int i = 1; i <= n; i = i+1) { result = maxlk(arr[i], result); return result; public static void main(string [] arg) { int [] myarr = new int [arg.length]; for (int i = 0; i < arg.length; i = i+1) { myarr[i] = Integer.parseInt(arg[i]); System.out.println("Max element (iteration) = " + maxiter(arg.length-1, myarr)); System.out.println("Max element (recursion) = " + maxrec(arg.length-1, myarr)); 11 public abstract class Penna { protected double längd; //11a) public double pennlängd() { return längd; public abstract boolean gerpremanenttext(); public abstrakt void vässa(); public class Träblyertspenna extends Penna { public Träblyertspenna(double il) { längd = il;
public void vässa() { längd = längd - 10.0; public boolean gerpremanenttext() { return false; public class Kulspetspenna extends Penna { public Kulspetspenna(double il) { längd = il; public boolean gerpremanenttext() { return true; public void vässa() { // Tillägg för 11d p.pennlängd() < 50.0 // 11b if (p instanceof Träblyertspenna) { ((Träblyertspenna) p).vässa(); // 11c Om man gör tilläggen märkta 11d) ovan kan man nu helt enklet skriva // 11d p.vässa() til. Att "rätt sorts vässa-metod körs kallas ibland dynamisk bindning. Fenomenet kallas i vissa böcker polymorfism, men detta ord används även för andra företelser i programmering. 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 fg ae ma vm kl le pp pe zb mm fg ae ma vm kl le pp mm pe zb fg ae ma vm kl le pp fg mm pe zb ae ma vm kl le pp ae fg mm pe zb ma vm kl le pp ae fg ma mm pe zb vm kl le pp ae fg ma mm pe vm zb kl le pp ae fg kl ma mm pe vm zb le pp ae fg kl le ma mm pe vm zb pp ae fg kl le ma mm pe pp vm zb