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

Relevanta dokument
Lägg uppgifterna i ordning. Skriv uppgiftsnummer 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

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.

Lägg uppgifterna i ordning. Skriv uppgiftsnummer 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

Observera. Tentamen Programmeringsteknik II Skrivtid:

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

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

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

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 Inledning. Anmälningskod:

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

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 kod överst i högra hörnet på alla papper.

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

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.

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

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

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

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

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

Tentamen i Programmeringsteknik I

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

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

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Tentamen i Programmeringsteknik I

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

Tentamen Programmeringsteknik II

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

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

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

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 (DAT036)

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

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

Del A (obligatorisk för alla)

Obligatorisk uppgift 5

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

Del A (obligatorisk för alla)

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

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

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

Föreläsning 9 Innehåll

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

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

Lösningsförslag till exempeltenta 1

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

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 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 OOP

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

Tentamen, EDAA20/EDA501 Programmering

Tentamen i Programmeringsteknik I

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning Datastrukturer (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

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

Obligatorisk uppgift: Numerisk kalkylator

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Tentamen, EDAA10 Programmering i Java

Föreläsning 3-4 Innehåll

DAT043 Objektorienterad Programmering

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 9 Datastrukturer (DAT037)

Malmö högskola 2008/2009 CTS

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Laboration A Objektsamlingar

Tentamen i Objektorienterad programmering

Tentamen, Algoritmer och datastrukturer

OOP Objekt-orienterad programmering

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Tentamen TEN1 HI

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

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

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tentamen i Programmeringsteknik I, ES,

TENTAMEN OOP

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

Transkript:

Tentamen Programmeringsteknik II 2016-05-30 Skrivtid: 1400 1900 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Börja alltid ny uppgift på nytt papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper. Fyll i försättssidan fullständigt. Såvida inget annat anges får man bygga på lösningar till föregående uppgifter även om dessa inte har lösts. Det är tillåtet att införa hjälpmetoder och hjälpklasser. Uttrycket skriv en metod som skall alltså inte tolkas så att lösningen inte får struktureras med hjälp av flera metoder. Alla uppgifter gäller programmeringsspråket Java och programkod skall skrivas i Java. Koden skall vara läslig dvs den skall vara vettigt strukturerad och indenterad. Namn på variabler, metoder, klasser etc skall vara beskrivande men kan ändå hållas ganska korta. Observera att betyget påverkas negativt bland annat av icke-privata eller onödiga instansvariabler, dålig läslighet, upprepning av identisk kod, underlåtenhet att utnyttja given eller egen tidigare skriven metod, underlåtenhet att utnyttja arv och lösningar som har väsentligt sämre komplexitet än nödvändigt t ex Θ(n 2 ) i stället för Θ(n log n). Observera Skrivningen består av två delar. Lösningarna till uppgifterna på del A ska skrivas in i de tomma rutorna och lämnas in. Svaren på del B skrivs på vanligt papper. Bedömning och betygsättning För att bli godkänd (betyg 3) krävs att minst 80% av uppgifterna på A-delen är i stort sett rätt löst. För betyget 4 krävs dessutom att minst hälften av uppgifterna på B-delen och betyg 5 att alla uppgifterna på B-delen är i stort sett rätt lösta. Vid bedömning för dessa betyg tas även hänsyn till kvalitén på lösningarna på A-delen. Observera att B-delen inte rättas om inte A-delen är godkänd. Lycka till!

Inledning I bilagor finns ett antal mer eller mindre ofullständiga klasser. Klassen List innehåller några grundläggande komponenter för att skapa och hantera enkellänkade listor av heltal. Listorna är sorterade i storleksordning. Samma tal kan kan förekomma flera gånger i listan. Exempel: [1, 2, 2, 2, 5, 6, 8, 8]. Klassen BST innehåller binära sökträd med heltal som nycklar. En nyckel kan förekomma högst en gång i trädet. Klasserna Calculator och Parser definierar en lite förenklad numerisk kalkylator. Klassen City utgör ett embryo till ett navigeringssystem. Varje City-objekt har en arraylist med referenser till angränsande orter dvs till City-objekt. Varje objekt innehåller information om avståndet till föräldraorten. Det går bara att resa åt ett håll och det går bara att komma till en ort på ett sätt. Strukturen är med andra ord uppbyggd som ett träd med orter i noderna. Vidstående figur visar hur det skulle kunna se ut utgående från Uppsala. Uppsala 0 Knivsta Alunda Storvreta 20 30 12 Arlanda Rosersberg Vattholma 25 10 8 Vendel 18 Solna 25 Sigtuna 20 Alla klasser utom kalkylatorn innehåller main-metoder med utskrifter som demonstrerar metoderna.

Anmälningskod: Del A (obligatorisk för alla) Svaren ska skrivas i rutorna och denna del av skrivningen ska lämnas in. A1. Metoden add i klassen List ska lägga till ett ett nytt tal i listan så att listan förblir sorterad. Skriv de satser som fattas i denna hjälpmetod: private static Node add(int x, Node f) { if (f == null x <= f.data) { return new Node(x, f); else if (x > f.data) { f.next = add(x, f.next); return f; A2. Metoden toarraylist() i klassen List ska returnera ett objekt av typen ArrayList<Integer> som innehåller alla talen från listan i samma ordning som i listan. Skriv det som fattas i den iterativa metoden! public ArrayList<Integer> toarraylist() { ArrayList<Integer> result = new ArrayList<Integer>(); for (Node n = first; n!=null; n = n.next) { result.add(n.data); return result; A3. Metoden String tostring() i klassen List ska returnera en sträng innehållande värdena i listan. Se utskriften för det exakta utseendet! Skriv den enda sats som behövs i rutan nedan! public String tostring() { return toarraylist().tostring(); A4. Metoden int count(int x) i klassen List ska returnera antalet förekomster av värdet x i listan. Skriv de satser som saknas i rutorna nedan (en sats i varje)!

public int count(int x) { return count(x, first); private static int count(int x, Node f) { if (f==null x<f.data) { return 0; else if (x==f.data) { return 1 + count(x, f.next); else { return count(x, f.next);

Anmälningskod: A5. Den iterativa metoden int removeleast() i klassen BST ska ta bort noden med det minsta värdet ur trädet samt returnerar själva värdet. Skriv de rader som fattas i nedanstående kod. public int removeleast() { int result; if (root == null) { throw new TreeException("removeLeast from empty tree"); else if (root.left==null) { result = root.key; root = root.right; else { Node n = root; while ( n.left.left!=null ) n = n.left; result = n.left.key; n.left = n.left.right; size--; return result; A6. Skriv klassen TreeException som används i metoden removeleast! public class TreeException extends RuntimeException { public TreeException(String msg) { super(msg); A7. Den medföljande main-metoden i klassen BST skall avsluta genom att skriva Bye! men eftersom metoden ovanför anropas på ett tomt träd avbryts programmet innan den avslutande utskriften görs. Du skall modifiera slutet på main-metoden så att den själv hanterar undantaget, ger felutskriften och sedan fortsätter med den avslutande hälsningen dvs slutar på följande sätt: Error: removeleast from empty tree Bye! Vilken kod skall skrivas? Ange vilket radnummer din kod skall stå på! Byt anropet till removeleast() på rad?? mot nedanstående try { bt.removeleast(); catch (TreeException e) { System.out.println("Error: "+ e.getmessage());

Anmälningskod: A8. Medeldjupet i ett binärt träd definieras som summan av alla noders djup dividerat med antalet noder. Rotens djup är 1, rotens barn har djup 2, rotens barnbarn har djup 3 osv. Ett träd med 1 nod har alltid medeldjupet 1/1 = 1, en träd med två noder har alltid medeldjupet (1 + 2)/2 = 1.5 medan ett träd med 3 noder har antingen medeldjupet (1 + 2 + 3)/3 = 2 eller (1 + 2 + 2)/3 = 1.667 beroende på form. Skriv klart metoden som beräknar trädets medeldjup. Ledning: Se vad som finns med i den bifogade koden! public double meandepth() { return (double)ipl(root,1)/size; A9. I bilagan finns en kalkylator som räknar numeriskt med de fyra räknesätten. Dessutom kan de spara värden i variabler. När man provkör den upptäcker man att det visserligen går att skriva tilldelningsuttryck som 2 + 3 = x men att variabeln x inte får något värde utan fortfarande betraktas som odefinierad. Ange den rad som saknas: variable.put(tokenizer.getword(), new Double(value)); som skall läggas in i klassen efter rad nummer A10. Kalkylator skall använda tecknet ^ som upphöjt till. Uttrycket 2^3 skall bli 8 liksom även rycket (1+1)^(1+2). Uttrycket a^b^c ska tolkas som (a^b)^c. Metoden factor ska hantera denna operator. Skriv det som fattas! public double factor() { double result = primary(); while(tokenizer.getchar() == ^ ) { tokenizer.nexttoken(); result = Math.pow(result, primary()); return result; A11. Givet följande tre klasser och skapandet av variablerna a, aa och aaa. Skriv i de tomma rutorna vad motsvarande print-sats skriver. class A { String getname() { return "A"; int getvalue() {return 1; A a = new A(); A aa = new Aa(); A aaa = new Aaa(); public String tostring() { return getname() + getvalue(); class Aa extends A { int getvalue() { return 2; class Aaa extends Aa { String getname() { return "Aaa"; System.out.println(" a : "+ a); System.out.println(" aa : "+ aa); System.out.println(" aaa: "+ aaa); A1 A2 Aaa2

Del B (för betyg 4 och 5) Svaren till dessa uppgifter skrivs på vanligt skrivningspapper. B1. Antag att det finns tre algoritmer A, B och C för att lösa ett problem. Problemets storlek kan beskrivas med parametern n. Algoritm A löser ett problem av storleken n på Θ(n) sekunder, algoritm B tar Θ(n log n) sekunder och algoritm C tar Θ(n 2 ) sekunder. Mätningar med n = 10 ger att A tar 100 sekunder, B tar 10 sekunder och C tar 1 sekund. a) För vilket värde på n kan man vänta sig att algoritm A blir snabbare än algoritm B? b) För vilket värde på n kan man vänta sig att algoritm A blir snabbare än algoritm C? Motivera! Vad kan man dra för allmänna slutsatser av resultatet? Allmänt: För tillräckligt stora n kommer A vara bäst, B näst bäst och C sämst. Frågan är alltså var dessa gränser går. Tiden för de tre algoritmerna kan uppskattas med uttrycken t a (n) = k a n för algoritm A t b (n) = k b n log n för algoritm B t c (n) = k c n 2 för algoritm C Genom att sätta in n = 10 och de givna tiderna (100, 10 respektive 1 sekund) kan konstanterna bestämmas till: k a = 10 k b = 1 k c = 0.01 (Vi använder naturligtvis 10-logaritmen för algoritm B) När är A snabbare än B? t a (n) < t b (n) 10 n < 1 n log n 10 < log n n > 10 10 När är A snabbare än C? t a (n) < t c (n) 10 n < 0.01 n 2 10 < 0.01 n n > 1000 Allmän slutsats: Att byta ett n mot ett log n är ofta lönsamt men det kan krävas väldigt stora problem för att det ska vara lönsamt att byta ett logn mot en konstant. B2. Skriv metoden toset() i klassen List. Metoden ska skapa en ny lista med samma tal men där varje ta l bara förekommer en gång. Tiden ska vara O(n) där n är längden på ursprungslistan.

public List toset() { return new List(toSet(first)); private static Node toset(node f) { if (f==null) { return null; else if (f.next==null) { return new Node(f.data, null); else if (f.data == f.next.data) { return toset(f.next); else { return new Node(f.data, toset(f.next)); B3. Skriv metoden public boolean subset(list another) i klassen List som avgör om alla element i den egna listan ingår i en annan lista. Om samma element förekommer flera gånger i den egna ska det förekomma minst lika många gånger i den andra listan. Tiden ska vara O(m + n) där m är längden på den ena och n längden på den andra listan. public boolean subset(list another) { return subset(first, another.first); private static boolean subset(node mine, Node other) { if (mine==null) { return true; else if (other==null mine.data<other.data) { return false; else if (mine.data == other.data) { return subset(mine.next, other.next); else { return subset(mine, other.next); B4. I klassen BST finns metoder för att spara trädet (save(string filename)) på en fil och en metod för att läsa in och bygga upp trädet (load(string filename)) från en fil. Betrakta två möjliga implementationer av hjälpmetoden save(printwriter pw, Node r): Metod 1 Metod 2 public static void save(...) { if (r!=null) { save(pw, r.left); pw.println(r.key); save(pw, r.right); public static void save(...) { if (r!=null) { pw.println(r.key); save(pw, r.left); save(pw, r.right); Antag att du har ett välbalanserat träd med n noder. Hur beror tiden av n för respektive metod för att a) att spara trädet med save och b) att återskapa trädet med load? Svara med ett uttryck av typ Θ(f(n)) och motivera svaren!

Metod 1 traverserar trädet i inorder dvs noderna sparas sorterat med den minsta först. Metod 2 traverserar trädet i preorder dvs roten kommer först. Båda metoderna är standardtraverseringar som tar Θ(n) tid (varje nod besöks exakt en gång). Metoden load använder en standardmetod för BST-inlägg (add). Om metoden 1 har använts för att spara trädet kommer add få noderna i storleksordning vilket kommer leda till urartat träd. Tiden för detta blir c (1 + 2 + 3 +... + n) = c n(n + 1)/2 som är Θ(n 2 ) Om metoden 2 används kommer load att skapa en identisk kopia av ursprungsträdet. Eftersom trädet enligt uppgiften var välbalanserat kan höjden på det uppskattas med c log n. Inget av de n inläggen kräver således mer c log n tid kan den totala tiden uppskattas med n c log n dvs O(n log n) (Man kan visa att detta inte bara är en övre gräns utan att tiden faktiskt är Θ(n log n).) B5. I klassen BST är hjälpmetoden printinorder(node r) deklarerad static men det är inte hjälpmetoden add(int key, Node r). Vad betyder deklarationen static? Varför är den en ena av dessa hjälpmetoder static men inte den andra? Kan man deklarera add som static? Kan man utelämna static i deklarationen av printinorder? Deklarationen static innebär att metoden hör till klassen som helhet och inte till något speciellt objekt. Det betyder att metoden INTE kan använda några instansvariabler eller instansmetoder utan att gå via en referens till objektet. Eftersom add använder instansvariabeln size kan den inte deklareras som static. Man kan utelämna static-deklarationen av printinorder. Deklarationen tjänar dels som en upplysning till den som läser koden att den inte använder instansvariabler och dels skyddar mot en oavsiktlig av sådana. B6. Metoden ArrayList<City> findroute(string cityname) i klassen City letar efter en ort och returnerar en arraylist med orter på vägen till målet. Om orten inte hittas retuneras en arraylist med 0 element. Skriv metoden (inklusive eventuella hjälpmetoder). public ArrayList<City> findroute(string cityname) { ArrayList<City> list = new ArrayList<City>(); findroute(cityname, list); return list; private boolean findroute(string cityname, ArrayList<City> list) { if (name.equals(cityname)) { return true; else { for( City c : neighbors) { if (c.findroute(cityname, list)) { list.add(0, c); return true; return false;

B7. Metoden save med hjälpmetod sparar den uppbyggda strukturen på en fil. Läs metoderna så att du förstår formatet. (Anropens av metoden blanks har bara som uppgift att göra filen lättare att läsa för det mänskliga ögat.) Så här skulle filen som beskriver figuren på första sidan se ut: Uppsala 0 3 Knivsta 20 3 Arlanda 25 0 Rosersberg 10 1 Solna 25 0 Sigtuna 20 0 Alunda 30 0 Storvreta 12 2 Vattholma 8 0 Vendel 18 0 Skriv sedan färdigt hjälpmetoden load(scanner scanner) som läser in filer som skapats med load och bygger upp strukturen. public static City load(scanner scanner) { String name = scanner.next(); int dist = scanner.nextint(); City city = new City(name, dist); int numberofneighbors = scanner.nextint(); for (int i = 0; i<numberofneighbors; i++) { city.addneighbor(load(scanner)); return city;