Tentamen Programmeringsteknik II 2017-08-24 Skrivtid: 0800 1300 Tänk på följande Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod ö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 direkt på skrivningsformuläret och lämnas in. Rutorna är tilltagna i storlek så att de ska rymma svaren. Om du ändå inte får plats får du fortsätta på vanligt skrivblad. Markera gärna detta både på försättsbladet och i rutan. Skriv inte på baksidan. Svaren på del B skrivs på vanligt papper med nytt papper för varje uppgift. Var god vänd!
Bedömning och betygsättning För att bli godkänd (betyg 3) krävs att A-delen i huvudsak är rätt löst. Det betyder inte att varje uppgift behöver vara exakt rätt, men att du ska visa att du i huvudsak uppfyller kursens mål, som säger att studenten efter godkänd kurs ska kunna: använda programspråket Java, både skriva egen kod och förklara vad en given kod utför; redogöra för begreppen arv och polymorfi i ett objektorienterat språk och använda dessa begrepp i egen programutveckling; implementera rekursiva lösningar till olika problem; beskriva principen för analys av algoritmers effektivitet och utföra sådan analys av enklare algoritmer; beskriva, implementera och använda de grundläggande datastrukturerna array, länkad lista, hashtabell och binärt träd samt abstrakta datatyper som stackar, köer och avbildningar; beskriva hur felhantering med hjälp av undantag fungerar och kunna använda detta i egna program. För betyget 4 krävs dessutom att minst hälften, och för betyg 5 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 kvaliteten på lösningarna på A-delen. Observera att B-delen normalt sett endast rättas om A-delen är godkänd. Lycka till! Inledning I bilagorna finns ett antal mer eller mindre ofullständiga klasser. Klassen BST innehåller en variant av binära sökträd med tal som nycklar. Klassen ExamException är en liten undantagsklass. Klassen List innehåller några grundläggande komponenter för att skapa och hantera enkellänkade listor av Student-objekt. Varje student kan förekomma flera gånger. Klassen Misc innehåller ett antal separata metoder. Klassen Student representerar en student med för- och efternamn. Den är oföränderlig, det går inte att byta namn efter att en student har skapats. Dessutom finns Machine, CoffeeMachine, Robot, Humanoid, IndustrialRobot, CoffeeRobot, MachineUser och Movable, som används i den sista uppgiften. Notera att även de metoder som inte är implementerade oftast har giltig Javadoc-dokumentation, som kan ge värdefull information. Utöver detta finns delar av den officiella Java-dokumentationen för ArrayList, Character, Comparable och String bifogad.
Del A (obligatorisk för alla) A1. Ringa in rätt alternativ. För de 4 sista frågorna kan mer än ett alternativ vara rätt. När du besvarar de 3 sista frågorna ska du, om inget annat anges, anta att effektivast möjliga algoritm används. a) Du har skrivit en subklass till JPanel och vill ange hur en instans av din klass ska ritas ut. Vilken metod ska du överskugga? 1) drawcomponent 2) paintcomponent 3) performrendering 4) actionperformed b) Om B är en subklass till klassen A, vad behöver stå i B:s klassdeklaration (d.v.s. efter public class B )? c) Du ska skriva ett Swing-program som under hela programmets körning ska exekvera en viss metod med ett visst antal sekunders mellanrum. Vilken klass bör du använda? d) Vilket nyckelord saknas i nedanstående kodsnutt? try { exammethod(); } (ExamException e) { /* Kod för att ta hand om ett eventuellt ExamException */ } 1) implements A 2) inherits A 3) extends A 4) is A 1) EventGenerator 2) ActionGenerator 3) Timer 4) Clock 1) catch 2) handle 3) if 4) when e) Du har skrivit ett ganska stort program och vill veta vilket värde varje variabel har när programexekveringen har kommit till en given rad. Du får inte lov att använda System.out för att skriva ut variablernas värde. Vilken typ av program ska du använda? 1) En variable-listener 2) En action-listener 3) En editor 4) En debugger f) Vad behövs inte i en rekursiv metod m? 1) En retursats 2) Ett basfall 3) En inparameter som anger problemets storlek 4) Ett anrop till m
g) För vilket/vilka av följande växer tidsåtgången linjärt med n? h) För vilket/vilka av följande växer tidsåtgången kvadratiskt med n? i) För vilket/vilka av följande växer tidsåtgången logaritmiskt med n? 1) Sortering av n element med merge sort, i bästa fall 2) Sortering av n element med instickssortering, i bästa fall 3) Lagring av ett element i en sorterad länkad lista 4) Lagring av ett element i en hashtabell 5) Lagring av ett element i ett binärt sökträd 6) Lagring av ett element i en osorterad array 1) Sortering av n element med merge sort, i värsta fall 2) Sortering av n element med instickssortering, i värsta fall 3) Sökning i en osorterad länkad lista 4) Sökning i en hashtabell 5) Sökning i ett binärt sökträd 6) Sökning i en osorterad array 1) Sortering av n element med merge sort, i genomsnitt 2) Sortering av n element med instickssortering, i genomsnitt 3) Sökning i en sorterad länkad lista 4) Sökning i en hashtabell 5) Sökning i ett binärt sökträd 6) Sökning i en osorterad array
A2. Sist i klassen Misc finns Javadoc-kommentarer för en metod, men den saknar både deklaration och definition. Ge ett förslag på deklaration av metoden (metodhuvud) utifrån Javadoc-texten. Namn, typer och modifierare i deklarationen ska överensstämma med det som anges i Javadockommentaren. A3. Implementera metoden List.removeNamedStudent. Den ska ta bort studenten med ett visst namn från listan. Om ingen sådan student finns, ska ett ExamException kastas. public void removenamedstudent(string firstname, String surname) { } A4. I bilagan finns dokumentation till metoden String.copyValueOf. Vad returnerar String.copyValueOf(new char[] { a, b, c, d, e }, 1, 3)? A5. Implementera metoden Student.equals enligt specifikation i bilagan (två studenter är lika om de har samma namn). public boolean equals(object other) { }
A6. List.add använder interfacet Comparable. Detta interface implementeras av olika klasser i Java för att ange hur objekt av klassen ska sorteras. String är ett exempel på en standardklass som implementerar Comparable. Implementera metoden Student.compareTo. Studenter ska sorteras i stigande alfabetisk ordning, i första hand på efternamn och i andra hand på förnamn. public int compareto(student s) { } A7. Titta på implementationen av List.add. Vilken tidskomplexitet har denna operation i relation till listans totala storlek n? Ge en kort motivering och svara i termer av Θ. A8. Implementera BST.depth, som returnerar det djupet i trädet, det vill säga den maximala väglängden från rot till något löv. Räkna in både roten och lövet.
A9. Metoden BST.toArrayList ska lägga in värdena från trädet, in-order, i en ArrayList. Skriv den nödvändiga koden för att metoden ska fungera. A10. Skriv konstruktorn till Student. Den ska initiera instansvariablerna, men kasta undantaget IllegalArgumentException om någon sträng är tom eller null. IllegalArgumentException är en standardklass i Java. public Student(String firstname, String surname) { }
A11. Betrakta klasshierarkin som representeras av UML-diagrammet. Pilarna i diagrammet representerar arv: en pil från A till B betyder att A ärver från B. Vilka av följande instansieringar går inte att göra? Svara med variabelnamn och eventuell motivering. Tulip o1 = new Flower(); Flower o2 = new Tulip(); Plant o3 = new Tree(); Tree o4 = new Plant(); Rose o5 = new Flower(); Flower o6 = new Rose(); Plant o7 = new Tulip(); Tulip o8 = new Plant(); För var och en av de övriga instansieringarna, antag att du anropar metoden draw() för det nyskapade objektet. Vilken implementation av draw() är det som kommer att exekveras i respektive fall?
Del B (för betyg 4 och 5) Svaren till dessa uppgifter skrivs på vanligt skrivningspapper. Se till att skriva varje uppgift på ett eget blad. B1. Du har fått i uppgift att lagra hela listor med studenter som nycklar i en HashMap. Skriv nödvändig kod för att två listor med likvärdiga studenter ska behandlas som identiska, det vill säga att likhet och hashvärden hanteras korrekt. B2. Skriv den nödvändiga koden för metoden BST.sumAllBelow, som ska returnera summan av alla enskilda värden i trädet som ligger under ett visst tröskelvärde. B3. Metoden Misc.generateUpperCaseCombos ska returnera en lista med alla varianter av den ordmall template man skickar in, med högst count versaler. Ordmallen ska bara bestå av gemener, annars ska ett ExamException kastas. Skriv nödvändig kod för att implementera denna metod effektivt. Exempelvis kan ordet bord med högst två versaler skrivas bord, Bord, bord, bord, bord, BOrd, BoRd, BorD, bord, bord, bord. Det kan vara användbart att titta på klassmetoderna islowercase, isuppercase, tolowercase och touppercase i Character. B4. I bildbehandling är en vanlig operation att ändra färg på alla bildpunkter (pixlar) i ett sammanhängande område, det vill säga ett område som för närvarande har en och samma färg och där bildpunkterna är grannar vertikalt eller horisontellt (men inte bara diagonalt), så kallad flood fill. En viss punkts grannar kan alltså nås genom att rita ett +-tecken över punkten. Bokstaven å har två inneslutna sammhängande områden, ringen ovanför respektive droppen i bokstavens nederdel. Bokstaven Å har också två inneslutna sammanhängande områden, ringen och triangeln i bokstavens överdel. För båda bokstäverna utgör hela området runtomkring ett tredje område. a) Implementera metoden Misc.floodFill. Den ges en array med arrayer av int, två koordinater för en utgångspunkt i det sammanhängande området som ska fyllas, och en ny färg (intvärde). Den första arrayen är en array med rader (y), varje rad är sedan en egen array med separata färgvärden av typen int (x). Metoden ska alltså fylla hela det enfärgade område som den utpekade bildpunkten ingår i, med den nya angivna färgen. Observera att området både kan begränsas av bildpunkter med andra färger och av arrayernas kanter, så se till att inte försöka läsa eller skriva till några koordinater som inte finns. b) Hur många nivåer av rekursion har din lösning, det vill säga hur många nivåer av funktionsanrop ligger på stacken samtidigt? Vilken tidskomplexitet, i värsta fall? Motivera och uttryck båda svaren med Θ-notation, i termer av antalet rader m och antalet kolumner n.
B5. Antag att det finns tre algoritmer A, B och C för at 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 sekuner 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? B6. I bilagan finns 6 (mer eller mindre fullständiga) klasser som representerar olika typer av maskiner: Machine, CoffeeMachine, Robot, Humanoid, IndustrialRobot och CoffeeRobot. Det finns också en klass, MachineUser, som använder de 6 klasserna, samt ett interface som heter Movable. Det har smugit sig in ett antal fel i koden. Identifiera dessa och ange hur koden borde ha skrivits i stället! Du kan anta att klasserna Screen och Speaker finns och att de innehåller de metoder som anropas.