Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

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

Observera. Tentamen Programmeringsteknik II Skrivtid:

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

public boolean containskey(string key) { return search(key, head)!= null; }

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

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

Tentamen Programmeringsteknik II

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

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

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Grafik, grafiska användargränssnitt och rörliga bilder

Obligatorisk uppgift 5

Föreläsning 9 Innehåll

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

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

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

Tentamen i Algoritmer & Datastrukturer i Java

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

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

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

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

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Del A (obligatorisk för alla)

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till tentamen Datastrukturer, DAT037,

Del A (obligatorisk för alla)

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Lösningsförslag till exempeltenta 1

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Länkade strukturer, parametriserade typer och undantag

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 7. Träd och binära sökträd

Föreläsning Datastrukturer (DAT036)

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

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

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

Föreläsning 8: Exempel och problemlösning

List.java. List.java. Printed by Tom Smedsaas

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Tentamen, Algoritmer och datastrukturer

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

Föreläsning 7. Träd och binära sökträd

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

Tentamen Datastrukturer (DAT037)

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

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

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

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

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

Föreläsning 9 Datastrukturer (DAT037)

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 3. Stack

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

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

F4: Mer om OU1, OU2, listor och träd. Carl Nettelblad

Tentamen i Programmeringsteknik I

Lösningsförslag till exempeltenta 2

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

Tentamen i Programmeringsteknik I

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

Klasshierarkier - repetition

Teoretisk del. Facit Tentamen TDDC (6)

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

OOP Objekt-orienterad programmering

Lösningar till Tentamen i Programmeringsteknik II och MN

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 3. Stack

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

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Seminarium 13 Innehåll

TENTAMEN OOP

BST implementering, huvudstruktur

Transkript:

Tentamen Programmeringsteknik II 2017-10-23 Skrivtid: 14:00 19:00 Inledning Skrivningen innehåller ett antal bilagor: Bilagan listsandtrees innehåller fyra klasser: Klassen List med några grundläggande komponenter för att skapa och hantera enkellänkade listor av heltal. Varje tal kan förekomma flera gånger. Exempel på ett List-objekt: (3, 7, 9, 5, 3, 1, 8, 9, 5, 5, 4). Klassen SortedList som ärver från klassen List. Denna klass ska hålla listorna sorterade i storleksordning med det minsta först. Exempel på ett SortedList-objekt: (1, 3, 3, 4, 5, 5, 5, 7, 8, 9, 9). Klassen ListSet som ärver från klassen SortedList men ser till att varje enskilt värde förekommer endast en gång inga dubbletter alltså. Exempel på ett ListSet-objekt: (1, 3, 4, 5, 7, 8, 9). Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en gång i trädet. Vidstående figuren visar hur trädet ser ut om nycklarna i Listexemplet ovan läggs in med add-metoden. 1 3 5 7 9 4 8 Klasserna innehåller main-metoder som demonsterar användning och utskrifterna från dessa ligger som kommentarer sist i klasserna. Bilagan calculatorclasses innehåller (en del av de) klasser som implementerar en mycket begränsad kalkylator. En del koden i bilagorna är utelämnad antingen för att den skall skrivas som någon uppgift eller för att dess exakta utformning är av mindre intresse för att kunna lösa uppgifterna. Import-satser kan också, av utrymmesskäl, vara utelämnade. 1

Del A (obligatorisk för alla) A1. Nedan finns ett antal punkter med begrepp eller Java-uttryck samt ett antal utsagor. Din uppgift är att för varje punkt (A K) välja ett och endast ett alternativ (1 17) som sant för punkten (men det behöver inte nödvändigtvis vara hela sanningen). Observera att det också kan finnas flera rätta svar! Olika punkter (A K) kan ha samma alternativ (1 17). 1. Det minsta värdet ligger i roten. 2. Det minsta värdet hittas genom att följa vänsterpekarna så långt det går. 3. En klass som inte behöver importeras. A. System 3 B. println() 5 C. static 14 D. protected 11 E. this 8 F. Binärt sökträd 2 G. implements 13 H. Math 3 I. super(17) 15 J. extends 12 K. abstract 7 4. Ett objekt som används för utskrifter. 5. Ett metodanrop. 6. Anger att en variabel inte kan ändras. 7. Innebär att det inte går att skapa objekt av klassen. 8. Referens till det egna objektet. 9. Markerar att en klass inte får vara abstrakt. 10. Anger att en instansvariabel får avläsas men inte ändras. 11. Förbjuder åtkomst från andra klasser än den egna klassen och dess subklasser. 12. Anger att klassen är en subklass. 13. Anger att en klass implementerar metoderna i ett interface. 14. Anger att det är en för alla objekt i klassen gemensam variabel (klassvariabel). 15. Anrop av basklassens konstruktor. 16. Anger att en klass implementerar basklassens abstrakta metoder. 17. En klass deklarerad så får inte innehålla implementerade metoder. För att denna uppgift ska betraktas som godkänd bör du ha mint 8 rätt. 2

A2. Skriv det som fattas i den rekursiva metoden factorial(int n) som beräknar och returnerar fakulteten av n. Fakulteten av n definieras som 1 2 3... (n 1) n om n > 0 medan fakulteten av 0 definieras som 1. Om argumentet n är negativt ska ett EvaluationException kastas. Klassen EvaluationException som är en subklass till RuntimeException förutsätts redan definierad. public static int factorial(int n) { if (n < 0) { throw new EvaluationException( Negative arg to factorial ) else { if (n == 0) return 1; else return n*factorial(n-1); A3. Metoden size() i klassen List ska returnera antalet noder i listan. Skriv den iteration (while- eller for-sats som beräknar antalet noder så att metoden fungerar. public int size() { int result = 0; Node n = first; while (n!= null) { result++; n = n.next; return result; 3

A4. Metoden count(int x) i klassen List returnerar antalet gånger värdet x finns i listan. Skriv klart hjälpmetoden! public int count(int x) { return count(x, first); private int count(int x, Node f) { if (f == null) { return 0; else if (x == f.data) { return 1 + count(x, f.next); else { return count(x, f.next); A5. Metoden copy() ska, genom att använda hjälpmetoden copy(node n), skapa och returnera en kopia av listan. Skriv klart metoden! protected Node copy(node n) { if (n == null) { return null; else { return new Node(n.data, copy(n.next)); public List copy() { return new List(copy(first)); 4

A6. Antag att ovanstående copy-metod används på listan 1, 2, 3, 4, 5, 6. Vilken av noderna i den nya listan skapas först? Motivera svaret! Den sista noden i listan (den med 6) konstrueras först. Hjälpmetoden anropas med en referens till den första noden men innan konstruktorn kan utföras måste parametrarna evalueras. För att få ett värde till next-parametern anropas hjälpmetoden rekursivt. Resonemanget upprepas sedan ända tills basfallet nås. Då först får vi ett next-värde (null) som används för att konstruera den sista noden. A7. Vad är skillnaden mellan en JLabel och en JTextField i Swing-paketet? Svara med högst två meningar! Båda är grafiska komponenter som visas på skärmen. Programmet bestämmer innehållet innehållet i en JLabel medan användaren kan skriva i ett JTextField. A8. Klassen SortedList ska, till skillnad från sin basklass List, se till att data lagras i storleksordning med det minsta värdet först. Vilken/vilka metoder måste (om-)definieras och varför? Vilken/vilka metoder kan det vara bra att omdefiniera och varför? Du ska inte skriva metoderna! Metoden add måste omdefinieras eftersom nya element ska lagras i storleksordning och inte alltid först. Metoden count skulle kunna göras lite effektivare genom att sluta leta när man passerat det värde som ska räknas: if (f == null x<f.data) return 0; 5

A9. I klassen ListSet finns en konstruktor som skapar ett ListSet-objekt utifrån ett List-objekt. Antag att detta List-objekt består av n unika tal (dvs inga dubbletter). Hur beror konstruktorns körtid av n? Motivera! Tiden växer som Θ(n 2 ). Motivering: Om talen från ursprungslistan kommer i slumpmässig ordning kommer de i genomsnitt behöva jämföras med hälften av de redan lagrade talen i resultatlistan. som är Θ(n 2 ) 0 + 1 + 2 + 3 + + (n 1) 2 = n(n 1)/4 A10. Samma fråga som ovan men om ursprungslistan består av n identiska tal. Tiden växer som Θ(n). Motivering: Bara det första talet läggs till. Alla de övriga kommer att jämföras med det först talet. 6

A11. I klassen BST finns metoden ListSet tolistset() som ska skapa och returnera en lista med data från trädet i stigande ordning: public ListSet tolistset() { ListSet list = new ListSet(); tolistset(list, root); return list; private static void tolistset(listset list, Node r) { if (r!= null) { // Något av de tre alternativen nedan a), b) eller c) Fungerar koden? Ringa in rätt svar! Ange kompexitet (värsta fall) i de fall koden fungerar. Fyll i uttrycket inom parenteserna! a) list.add(r.key); tolistset(list, r.left); tolistset(list, r.right); Ja / Nej Θ( n 2 ) b) tolistset(list, r.left); list.add(r.key); tolistset(list, r.right); Ja / Nej Θ( n 2 ) c) tolistset(list, r.right); list.add(r.key); tolistset(list, r.left); Ja / Nej Θ( n ) A12. Det finns en känd algoritm kallad spaghetti sort (se //en.wikipedia.org/wiki/spaghetti_sort vid tillfälle) som kan sortera i linjär tid dvs tiden att sortera n element är Θ(n). Antag att det tar 1 sek per tal att sortera med denna algoritm. Antag att du har en implementation av mergesort som sorterar 10 element på en sekund. Vilket antal element krävs för att spagettisorteringen ska vara snabbast? Motivera! Att sortera n element med mergesort tar t m (n) = c n log n sekunder. t m (10) = 1 ger c 10 log 10 = 1 dvs c = 0.1 Att sortera n element med spagettisort tar enligt uppgiften t s (n) = n sekunder. När är t m (n) = t s (n)? 0.1 n log n = n log n = 10 dvs när n = 10 10 7

Del B (för betyg 4 och 5) Svaren till dessa uppgifter skrivs på vanligt skrivningspapper. B1. Skriv en konstruktor List(int[] a) som tar en array som parameter och konstruerar en lista med elementen från arrayen a. Observera att elementen i listan ska komma i samma ordning som i arrayen. Se körexemplet! public List(int[] a) { Node node = null; for (int i = a.length-1; i>=0; i--) { node = new Node(a[i], node); first = node; B2. Skriv en metoden scn ( single child node ) i klassen BST som beräknar och returnerar antalet noder med exakt ett barn. På trädexemplet i inledningen ska metoden alltså returnera 2 eftersom noderna med nycklarna 5 och 9 har exakt ett barn. public int scn() { return scn(root); private static int scn(node n) { if (n == null (n.left == null && n.right == null)) { return 0; else { int sum = scn(n.left) + scn(n.right); if (n.left == null n.right == null) { return 1 + sum; else { return sum; B3. Skriv en klass Queue som en subklass till klassen List. Klassen ska ha en konstruktor, en metod add som lägger ett nytt tal sist i kön, en metod remove som tar ut och returnerar det som står först i kön (dvs det som stått längst) samt en metod isempty som anger om kön är tom eller ej. Se körexemplet i klassen QueueDemo! Obs: Alla metoder ska ta konstant tid oberoende av köns längd! 8

public class Queue extends List { private Node last; public class QueueException extends RuntimeException { public QueueException(String msg) { super(msg); /** * Add a new integer in the last position of the queue * @param data the value to be added to the queue */ @Override public void add(int data) { if (last == null) { first = last = new Node(data, null); else { last = last.next = new Node(data, null); /** * Removes the first element from the queue * @return The removed value * @throws QueueException if the queue is empty */ public int remove() { if (first == null) { throw new QueueException("remove from empty queue"); else { int result = first.data; first = first.next; if (first == null) { last = null; return result; /** * Checks if the queue is empty * @return true if the queue does not contain any element, else false. */ public boolean isempty() { return first == null; B4. I main-metoden till ListSet skapas ett ListSet-objekt utifrån ett SortedList-objekt trots att det inte finns en konstruktor med en parameter deklarerad som SortedList. Varför fungerar det ändå? Skriv en konstruktor ListSet(SortedList alist) som är väsentligt bättre om listan alist är lång! Vad blir komplexiteten? Konstruktorn fungerar eftersom en SortedList är en List med en extra egenskap (sorteringen). Tidskomplexiteten är Θ(n 2 ) för slumpmässiga data eftersom man börjar från början varje gång och listan växer i längd. Genom att utnyttja sorteringen i en SortedList kan vi bygga upp listan i linjär tid: public ListSet(SortedList alist) { first = condense(alist.first); private static Node condense(node n) { if (n == null) { return null; else if (n.next == null) { return new Node(n.data, null); else if (n.data == n.next.data) { return condense(n.next); else { return new Node(n.data, condense(n.next)); 9

B5. I en bilaga finns en liten kalkylator för symboliska uttryck. Stora delar av koden är utelämnade. Jämfört med den sista obligatoriska uppgiften saknar den bl a derivering och funktioner. Den är dock kompletterad med en fakultetsoperator som skrivs med!. Fakultetsberäkningen skall göras på heltalsdelen av operanden. Exempelvis är 3.5! = 3! = 3 2 1. I parsern är fakultetsoperatorn inlagd i metoden factor (dvs den som i den obligatoriska uppgiften hanterade deriveringsoperatorn). Din uppgift är att skriva det som fattas dvs klassen Factorial och metod i klassen Symbolic så att den fungerar enligt bredvidstående körexempel. import java.util.map; Input : 3! Parsed: 3! Result: 6 Input : (2+3)! Parsed: (2+3)! Result: 120 Input : 3!! Parsed: (3!)! Result: 720 Input : "(1+x)! Parsed: ("(1+x))! Result: (1+x)! Input : "x! Parsed: ("x)! Result: x! Input : 2!+3! Parsed: 2!+3! Result: 8 Input : 3.99! Parsed: 3,99000! Result: 6 Input : -2! Parsed: (-2)! *** Evaluation error:... Input : public class Factorial extends Operator { public Factorial(Sexpr oper) { super(oper); public int priority() { return 90; public String tostring() { if (priority()< operand.priority()) { return operand + getname(); else { return "(" + operand + ")" + getname(); public String getname() { return "!"; public Sexpr eval(map<string, Sexpr> map) { return Symbolic.factorial(operand.eval(map)); och i Symbolic public static Sexpr factorial(sexpr operand) { if (operand.isconstant()) { return new Constant(factorial((int)operand.getValue())); else { return new Factorial(operand); 10