Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

Tentamen Programmeringsteknik II

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

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

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.

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.

Observera. Tentamen Programmeringsteknik II Skrivtid:

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje 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.

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

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

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 2 och MN Skrivtid: Inga hjälpmedel.

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

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod ö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

Länkade strukturer, parametriserade typer och undantag

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Del A (obligatorisk för alla)

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, EDAA20/EDA501 Programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 9 Innehåll

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

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

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

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.

Tentamen i Algoritmer & Datastrukturer 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

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

Föreläsning 9 Datastrukturer (DAT037)

Tentamen i Programmeringsteknik I

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 tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

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

Tentamen i Algoritmer & Datastrukturer i Java

Symboliska konstanter const

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

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

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

Föreläsning 10 Datastrukturer (DAT037)

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

Föreläsning 4 Innehåll

Del A (obligatorisk för alla)

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Dugga Datastrukturer (DAT036)

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

Föreläsning Datastrukturer (DAT036)

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

BST implementering, huvudstruktur

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ösningar till Tentamen i Programmeringsteknik II och MN

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

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

Tentamen Programmering fortsättningskurs DIT950

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

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

Lösningsförslag till exempeltenta 1

Tentamen Datastrukturer (DAT037)

Lösningsförslag till tentamen

OOP Objekt-orienterad programmering

Föreläsning 3 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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 5 Innehåll

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 3. Stack

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

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

Tentamen. Lösningsförslag

Tentamen. Programmeringsmetodik, KV: Java och OOP. 20 januari 2005

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Grundläggande programmering med C# 7,5 högskolepoäng

Lösningsförslag till tentamen

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Transkript:

Tentamen Programmeringsteknik II 2016-01-11 Inledning I bilagan finns ett antal mer eller mindre ofullständiga klasser. Några ingår i en hierarki: List, SortedList, SplayList och ListSet enligt vidstående figur. Klassen List innehåller några grundläggande komponenter för att skapa och hantera enkellänkade listor av heltal. SortedList SplayList Klassen SortedList, som ärver från List, underhåller listor ListSet som är sorterade på datainnehållet. Klassen SplayList, som också ärver från List, ordnar om listan efter varje sökoperation så att det sökta värdet flyttas till början av listan. Tanken med detta är att ofta sökta värden samlas i början av listan och alltså hittas snabbt. Klassen ListSet som ärver från SortedList representerar en mängd dvs varje element förekommer högst en gång ( antingen är värdet med i mängden eller så är det inte med ). Vidare finns en klass BST som representerar binära sökträd med heltal som nycklar. Slutligen finns en Person-klass som representerar en person som håller reda på en sina föräldrar som också är Person-objekt. List

Del A (obligatorisk för alla) Svaren ska skrivas i rutorna och denna del av skrivningen ska lämnas in. A1. Metoden size i klassen List beräknar och returnerar listans längd (dvs antalet element). Skriv den eller de satser som saknas i rutan nedan public int size() { int result = 0; Node n = first; while (n!=null) { result++; n = n.next; A2. Klassen List ha en undantagsklass ListException som en inre klass. Skriv det som fattas i konstruktorn som gör att den lämpliga konstruktorn i basklassen anropas. public static class ListException extends RuntimeException { public ListException(String msg) { super(msg); A3. Metoden List copy() i klassen List returnerar ett nytt listobjekt som innehåller en kopia av noderna i den egna listan. Skriv den eller de satser (högst 2) som saknas i rutan nedan public List copy() { return new List(copy(first)); protected static Node copy(node n) { if (n==null) { return null; else { return new Node(n.data, copy(n.next));

A4. Metoden List above(int limit) returnerar ett nytt listobjekt som innehåller en kopia av de noder i den egna listan som är större än parametern limit. Skriv de satser som saknas i rutorna nedan public List above(int limit) { return new List(above(limit, first)); private static Node above(int limit, Node n) { if (n==null) { return null; else if (n.data > limit) { else { return new Node(n.data, above(limit, n.next)); return above(limit, n.next); A5. Metoden add(int data) i klassen SplayList ska lägga in ett nytt element först i listan (dvs före det tidigare första elementet). Skriv den sats som saknas i rutan nedan public void add(int data) { addfirst(data);

A6. Metoden contains(int data) i klassen SplayList ska, precis som samma metod i klassen List, returnera true om angivet värde finns i listan, annars false. Dessutom ska, om värdet hittas, detta värde flyttas fram och läggas först i listan. Se körexemplen! Skriv de satser (högst 4 stycken) som fattas i rutorna nedan. @Override public boolean contains(int data) { if (first==null) { return false; else if (first.data==data) { // No rearrangement needed return true; else { Node infrontof = first; // Find the node in front of the searched node while (infrontof.next!= null && infrontof.next.data!= data ) { infrontof = infrontof.next; if (infrontof.next == null) { return false; else { // Move to the front Node n = infrontof.next; infrontof.next = n.next; n.next = first; first = n; eller first = new Node(data, first); infrontof.next = infrontof.next.next; return true; A7. Rita det träd som genereras av main-metoden i klassen BST. Strukturen på trädet ska framgå liksom värdet på nycklarna (key).

A8. Metoden void insert(int key i klassen BST lägger in en ny nyckel i trädet med hjälp av metoden Node insert(int key, Node r). Skriv det som behövs för att inlägget ska fungera. public void insert(int key) { root = insert(key, root); A9. Givet att en metod för att multiplicera två 100 100-matriser tar 1 sekund. Hur lång tid kan förvänta sig att multiplikation av 1000 1000-matriser tar? Ledning: Att multiplicera två n n-matiser kräver att man beräknar n 2 element där varje element kräver cn operationer (c är en konstant). Svar: 1000 sekunder Motivering: (Du får skriva på baksidan av detta papper om du behöver mer utrymme.) Kort: T (n) = d n 3 ger att T (10n) = d (10n) 3 = 10 3 T (n) dvs 1000 gånger längre tid. Längre: Att multiplicera n n-matriser kräver Θ(n 3 ) operationer (n 2 element som vardera kräver c n operationer) dvs tiden T (n) d n 3. T (100) = 1 ger d = 10 6 och således T (10 3 ) = 10 6 (10 3 ) 3 = 10 3. Svaret är således 1000 sekunder. A10. Följande teknik kan användas för att rita rörliga figurer: while (...) { fig.draw() Thread.sleep(100); fig.move() // Rita figuren // Låt programmet sova en stund // Ändra figuren Denna teknik användes t ex i programmeringsteknik 1 för att flytta sköldpaddorna. Beskriv kortfattat (max 40 ord) den alternativa teknik som användes i denna kurs för den första obligatoriska uppgiften ( studsande bollar ) dvs en teknik inte använder Thread.sleep. Använd en Timer som genererar en händelse med jämna tidsintervall. I metoden som hanterar händelsen (en ActionListener) uppdateras figuren och ritas om.

Del B (för betyg 4 och 5) Svaren till dessa uppgifter skrivs på vanligt skrivningspapper. B1. Skriv metoden List reverse() i klassen List som returnerar ett nytt listobjekt med samma innehåll som den aktuella listan men med data i omvänd ordning. Se körexemplet! OBS: Metodens tidskomplexitet skall vara O(n)! public List reverse() { List result = new List(); for (Node n = first; n!=null; n = n.next) { result.addfirst(n.data); B2. Skriv klart iteratorn i klassen List dvs skriv den inre klassen Iterator samt metoden Iterator iterator() så att de fungerar enligt körexemplet i main-metoden. public class Iterator { Node current; public Iterator() { current = first; public boolean hasnext() { return current!=null; public int next() { int result = current.data; current = current.next; public Iterator iterator() { return new Iterator(); B3. Skriv klart klassen SortedList som subklass till klassen List som ser till att värdena lagras i stigande ordning. Metoden main med utskrifter visar vilka metoder som behövs och vad de ska göra. utskrifter public class SortedList extends List { /** * Adds a new data item keeping the list sorted. */ public void add(int data) { first = add(data, first); protected static Node add(int data, Node n) { if (n == null data<n.data) { return new Node(data, n); else { n.next = add(data, n.next); return n; @Override public void addfirst(int data) { throw new ListException("addFirst is illegal on sorted lists! ");

B4. Skriv klart klassen ListSet som en subklass till klassen SortedList. Ett objekt ur klassen ListSet skall representera en mängd av heltal dvs varje tal ska bara förekomma en gång. Se körexemplet! public class ListSet extends SortedList { public ListSet() { @Override public void add(int data) { first = add(data, first); protected static Node add(int data, Node n) { if (n==null data<n.data) { return new Node(data, n); else if (data==n.data) { return n; else { n.next = add(data, n.next); return n; B5. Skriv metoden List tolist() i klassen BST som returnerar ett List-objekt med noderna i storleksordning med minsta värdet först. OBS: Metoden skall ha tidskomplexiteten O(n)! public List tolist() { List result = new List(); tolist(root, result); private static void tolist(node r, List result) { if (r!=null) { tolist(r.right, result); // The trick is to do it from right to left result.addfirst(r.key); // A O(1)-operation tolist(r.left, result); B6. Givet att en (bra) implementation av mergesort tar 1 sekund för att sortera 10 4 objekt av något slag. Hur lång tid kan man förvänta sig att det tar att sortera 10 6 objekt? Motivera svaret! Mergesort är en Θ(n log n)-metod (oavsett hur indata är ordnat) dvs tiden T (n) växer som T (n) = c n log n. Eftersom T (10 4 ) enligt uppgiften är 1 sek kan en uppskattning av konstanten c beräknas ur T (10 4 ) = c 10 4 log(10 4 ) = 1 vilket ger c = 1 4 10 4 (Vi väljer naturligtvis att använda 10-logaritmen) Svaret är således 150 sekunder. T (10 6 ) = 1 4 10 4 10 6 log(10 6 ) = 6 4 102 = 150

B7. Klassen Person utgör noder i ett släktträd. Ett Person-objekt skall hålla reda på sina föräldrar (Person-objekt) som i sin tur håller reda på sina föräldrar etc. Den givna main-metoden bygger detta släktträd: Lisa Eva Anna Oskar Lasse Kalle Main och dess utskrifter visar vilka metoder klassen ska innehålla och vad de ska göra. Skriv klassen! public class Person { private String name; private Person mother; private Person father; public Person(String name) { this.name = name; public void addmother(person mother) { this.mother = mother; public void addfather(person father) { this.father = father; public String tostring() { return name; public ArrayList<Person>getGeneration(int generation) { ArrayList<Person> result = new ArrayList<Person>(); getgeneration(generation, this, result); private static void getgeneration(int generation, Person p, ArrayList<Person> result) { if (p!=null) { if (generation==0) { result.add(p); else { getgeneration(generation-1, p.mother, result); getgeneration(generation-1, p.father, result);