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

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

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

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 ä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:

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 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

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

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Länkade strukturer, parametriserade typer och undantag

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.

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 Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

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 anmälningskod ö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.

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

F7: Rekursiv till iterativ, sammanfattning, genomgång av omtentan Carl Nettelblad

Föreläsning 14 Innehåll

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

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

Tentamen Datastrukturer, DAT037 (DAT036)

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.

Föreläsning 9 Innehåll

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

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

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

Tentamen i Programmeringsteknik I

Programmering för språkteknologer II, HT2014. Rum

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

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 vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen, Algoritmer och datastrukturer

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

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

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

Föreläsning 4 Datastrukturer (DAT037)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

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

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

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.

Tentamen i Programmeringsteknik I

Föreläsning 10 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 9 Datastrukturer (DAT037)

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

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

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 14. Filhantering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Sökning och sortering

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

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

DAT043 Objektorienterad Programmering

Föreläsning 1 Datastrukturer (DAT037)

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

Föreläsning 4 Datastrukturer (DAT037)

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Teoretisk del. Facit Tentamen TDDC (6)

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 4 Innehåll

Tentamen Datastrukturer D DAT 035/INN960

Tentamen Datastrukturer (DAT037)

Föreläsning 3. Stack

Dugga Datastrukturer (DAT036)

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

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning 3 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen, EDAA10 Programmering i Java

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning Datastrukturer (DAT037)

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TENTAMEN OOP

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

Transkript:

Tentamen Programmeringsteknik II 2018-05-28 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 kan 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 Item lagrar information om element i en bibliotekskatalog. Till den hör ett interface Duplicable för att kopiera sådana objekt. 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 SmallGame utgör ett litet händelsestyrt spel med händelseloopen i main. 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. 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, Map, Scanner och Set bifogad, liksom klasshierarkierna för några undantagsklasser.

Del A (obligatorisk för alla) A1. Ringa in rätt alternativ. På näst sista frågan kan flera alternativ vara rätt. På sista frågan kan du dra streck eller skriva bokstäver från högerkolumnen vid varje funktion i vänsterkolumnen. a) Du har skrivit ett användargränssnitt genom att ärva från JPanel. Du märker att det oftast inte syns när något har ändrats, men om användaren växlar fönster dyker det ibland upp. Du har kommit på att du måste anropa en metod för att säkert se till att världen ritas upp. Vilken metod ska du anropa? 1) drawcomponent 2) paintcomponent 3) performrendering 4) repaint b) Vilken typ av traversering ska du göra om du vill besöka noderna i ett binärt sökträd i storleksordning? 1) pre-order 2) post-order 3) next-order 4) in-order 5) up-order c) I vilken av följande datastrukturer går det snabbast att hitta det största elementet? Sorterad innebär i det här fallet att elementen kommer i stigande ordning. 1) En sorterad enkellänkad lista 2) En sorterad dubbellänkad lista 3) En sorterad cirkulär lista 4) Ett balanserat binärt sökträd d) Vad händer om man inte fångar ett kastat Java-undantag i ett enkelt program? 1) Programmet avslutas utan att indikera vad som gick fel 2) Programmet avslutas med en felutskrift 3) Programmet fortsätter köra utan att indikera att något gick fel 4) Programmet ger en felutskrift och fortsätter att köra e) Vilken typ av undantag behöver inte fångas eller deklareras med throws i metodhuvudet? 1) Throwable 2) Error 3) RuntimeException 4) IOException f) Vilket av följande nyckelord används (i klassdeklarationen) för att ange att en Java-klass ärver från en annan? 1) extends 2) implements 3) inherits 4) super

g) Vilket eller vilka av följande påståenden gäller för en rekursiv men inte en iterativ metod? 1) Metoden måste returnera ett värde 2) Metoden anropar sig själv 3) Metoden måste innehålla både if och else 4) Tidsåtgången för metoden växer linjärt med storleken på dess argument h) Vilken tidskomplexitet har följande funktioner i genomsnitt? Para ihop varje funktion i vänsterkolumnen med ett uttryck i högerkolumnen. Observera att flera funktioner kan ha samma tidskomplexitet! a) C Sökning i ett binärt sökträd b) D Sortering med samsortering ( merge sort ) c) E Sortering med instickssortering ( insertion sort ) d) B Beräkning av medelvärdet av alla element i en array e) B Sökning i en sorterad länkad lista f) C Sökning i en sorterad array A) Θ(1) B) Θ(n) C) Θ(log(n)) D) Θ(n log(n)) E) Θ(n 2 ) F) Θ(n 3 ) G) Θ(2 n )

A2. I klasen List finns en metod getallsurnames som ska returnera en Set med alla efternamn som förekommer på minst en student i listan. Skriv nödvändig kod för att denna metod ska fungera. public Set<String> getallsurnames() { Set<String> res = new HashSet<String>(); getallsurnames(first, res); return res; private static void getallsurnames(node n, Set<String> res) { if (n == null) { return; res.add(n.student.getsurname()); getallsurnames(n.next, res); A3. Direkt efter getallsurnames finns Javadoc-dokumentationen för en liknande metod. Läs dokumentationen och föreslå ett lämpligt metodhuvud för metoden. Huvudet ska återspegla den information som finns i dokumentationen, till exempel vad gäller argument och returvärde. Obs! Du behöver alltså inte implementera själva metoden. public List getstudentsinrange(string from, String to) A4. Metoden Misc.printAllKeys ska skriva ut alla nycklar i en Map som skickas in. Se till att den gör detta genom att fylla i luckorna nedan. Det är möjligt att en eller flera luckor bör lämnas tomma. public static void printallkeys(map<string, String> m) { for ( ) { String k : m.keyset() System.out.println(k); A5. Implementera en överskuggande version av hashcode, som är en standardmetod i Object, för Student. Se till att de hypotetiska personerna Sten Björn och Björn Sten inte får samma hashvärde. Du får utnyttja befintliga hashcode-metoder i andra klasser. public int hashcode() { return firstname.hashcode() + 47 * surname.hashcode();

Anmälningskod: A6. I filen Misc.java finns en metod ishello. Beskriv vilka likheter och skillnader som finns i vad som händer när metoden anropas beroende på värdet på de två argumenten s och mode. Fokusera på de skillnader som märks för den som anropar metoden. För andra värden på mode än 0 och 1 kastas ett ExamException. För null-skilda strängar returneras samma sak för 0 och 1, true om s är identisk med "Hello". Om mode är 0 och s är null kastas ett NullPointerException. I samma situation returneras false med mode 1. A7. Implementera BST.depthFor, som returnerar djupet för noden med ett visst värde i trädet, det vill säga väglängden från roten till den noden. Varje nod ska räknas in. Returnera -1 om noden inte finns. public int depthfor(int val) { return depth(root, val); private static int depthfor(node n, int val) { if (n == null) return -1; int res; if (val == n.data) { res = 0; else if (val < n.data) { res = depthfor(n.left, val); else { res = depthfor(n.right, val); return res + 1;

A8. Implementera List.smallest, som returnerar det Student-objekt som kommer först vid jämförelse med compareto. public Student smallest() { if (first == null) { return null; return smallest(first, first.student); private static Student smallest(node n, Student cand) { if (n == null) { return cand; if (n.student.compareto(cand) < 0) { cand = n.student; return smallest(n.next, cand); A9. Titta på implementationen av List.contains. Vilken tidskomplexitet har denna operation i relation till listans totala storlek n, i fallet då studenten inte visar sig finnas i listan? Ge en kort motivering och svara i termer av Θ. För att avgöra att elementet inte finns i listan måste contains besöka varje element. Varje besök tar konstant tid. Sammantaget alltså Θ(n). A10. Titta på implementationen av BST.contains. Vilken tidskomplexitet har denna operation om frågan gäller ett slumptvist valt tal av de som finns i trädet? Ge en kort motivering och svara i termer av Θ, i relation till trädets totala storlek n och inre väglängden (ipl), I = j d j, där d j är djupet för nod j. För att hitta rätt element ska sökning efter elementet ske i trädet. Varje rekursionssteg för sökningen tar konstant tid. Antalet rekursionssteg avgörs av nodens djup. En slumpvist utvald nod har djupet I/n. Sammantaget alltså Θ(I/n). För ett genomsnittligt träd med slumpvis insticksordning kommer I i sin tur att vara Θ(n log n), vilket ger att operationen i det specialfallet har komplexitet Θ(log n).

A11. List.getStudent letar efter en student med ett visst namn. Den kastar undantaget ExamException om studenten inte finns. Implementera metoden ensurestudent. Den ska använda getstudent och lägga till och returnera ett nytt studentobjekt med detta namn om det inte redan finns. public Student ensurestudent(string firstname, String surname) { try { return getstudent(firstname, surname); catch (ExamException) { Student s = new Student(firstname, surname); add(s); return s; A12. a) Vad innebär det att en metod binds dynamiskt? Att vilken metod som faktiskt anropas är beroende på den faktiska typen av ett objekt, inte vilken typ dess referens har. I Java är detta standard. Det innebär att en subklass kan överskugga olika metoder från sin basklass. b) Ge ett konkret, verkligt exempel på användning av dynamisk bindning, till exempel från kursens obligatoriska uppgifter. I den symboliska kalkylatorn användes konsekvent referenser till den abstrakta basklassen, men metodanropen bands dynamiskt till implementationen av exempelvis eval och diff i respektive subklass.

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. Metoden List.getRandom ska returnera en slumpmässigt utvald student ur listan, alla med samma sannolikhet. a) Gör den (alltid) det? Vilka problem eller fel ser du med metoden? Beskriv en möjlig lösning för att undvika problemen. För varje element har metoden samma sannolikhet (0.1) att välja det valda elementet. Det ger en förhöjd sannolikhet att välja tidiga element. Det gör det också möjligt att nå slutet av listan utan att ha valt något element. I det fallet kastas ett NullPointerException. En korrekt lösning skulle kunna slumpa ett specifikt index utifrån listans storlek och sedan rekursera för att hitta studenten med det indexet. Detta kräver dock två rekursioner, en för att ta reda på storleken och en för att hitta det index som väljs. b) Uppskatta den ursprungliga metodens genomsnittliga körtidskomplexitet i termer av listans storlek n och Θ. Motivera ditt svar. Θ(1) Eftersom metoden har en konstant sannolikhet att välja varje element blir sannolikheten att den fortsätter till listans slut försvinnande liten för tillräckligt stora n. Jämför till exempel med hur den oändliga summan inf i=1 2 i = 1. B2. Skriv den nödvändiga koden för metoden BST.listFromIndex, som ska skapa en ArrayList enbart bestående av det tal som finns lagrat på index i i trädet. Indexen räknas ordnade in-order. Körtidskomplexiteten ska vara Θ(i + log n) för balanserade träd, den får exempelvis inte vara Θ(n) oberoende av i. Om index i inte finns ska ett undantag kastas i enlighet med dokumentation. public ArrayList<Integer> listfromindex(int i) { ArrayList<Integer> res = new ArrayList<Integer>(); i = listfromindex(root, i, res); if (i >= 0) { throw new ExamException("Index not found."); private static listfromindex(node n, int i, ArrayList<Integer> res) { if (n == null i < 0) { return i; i = listfromindex(n.left, i, res); if (i == 0) { res.add(n.data); i--; i = listfromindex(n.right, i, res); return i;

B3. Klassen BST har stöd för att skapa en ArrayList med talen in-order. a) Skriv koden för den konstruktor som tar en ArrayList för att skapa ett träd från en sådan sorterad ArrayList. Skriv ytterligare hjälpmetoder vid behov. Det resulterande trädet får maximalt ha höjden log 2 n, där n är antalet element. Tänk efter hur du kan göra processen så tidseffektiv som möjligt. public BST(ArrayList<Integer> list) { root = fromarraylist(list, 0, list.size()); private static Node fromarraylist(arraylist<integer> list, int start, int end) { if (end <= start) { return null; int mid = start + (end - start) / 2; return new Node(list.get(mid), fromarraylist(list, start, mid), fromarraylist(list, mid + 1, end)); b) Motivera vilken tidskomplexitet konstruktorn har. Hur förhåller den sig till tidskomplexiteten för att lägga till samma element i trädet ett i taget i slumpmässig ordning? Hjälpmetoden gör konstant arbete och anropas en gång för varje element, plus en gång extra för varje tomt löv. Det senare skalar mindre än linjärt med totala antalet element. Alltså är det totala arbetet för konstruktorn Θ(n). Vid slumpmässig inläggningsordning skulle add användas och trädet skulle i genomsnitt bli balanserat, vilket skulle innebära n operationer med komplexitet Θ(log n), d.v.s. Θ(n log n).

B4. Metoden Misc.findHighestNumber ska gå igenom filerna 1.txt till 100.txt, öppna var och en och se vilken som har det största heltalet. Tyvärr har implementationen inte tillräcklig felhantering. Två fel som får den nuvarande koden att avbrytas på grund av undantag är att någon av filerna inte finns, och att en fil finns, men är tom. Detta ska tillåtas och metoden ska fortsätta läsa talen från övriga filer. Andra typer av fel vid läsning av filerna, som att innehållet inte är ett heltal, ska däremot resultera i att metoden kastar undantag. Föreslå lämpliga tillägg till metoden, med så konkret och korrekt kod som möjligt. Du kan hänvisa till radnummer i den befintliga metoden, eller skriva av hela metoden och göra relevanta tillägg. Ingen del av den nuvarande logiken ska förändras. public static int findhighestnumber() throws InputMismatchException { int maxval = 0; for (int i = 1; i <= 100; i++) { try { int val = new Scanner(new FileReader("" + i + ".txt")).nextint(); if (val > maxval) { maxval = val; catch (FileNotFoundException e) { catch (InputMisMatchException e) { throw e; catch (NoSuchElementException e) { return maxval;

B5. Klassen SmallGame implementerar ett hypotetiskt interface KeypressListener. Det är ett händelsestyrt spel där användaren ska tänka på ett tal från 1 till 100. Du ska göra klart spelet genom att implementera metoden keypress, utan att ändra något i händelseloopen. Datorn ska i varje steg presentera en ny gissning. Om talet är större ska användaren trycka på +, om talet är mindre ska användaren trycka på -. Om gissningen är rätt ska användaren skriva =. Då avslutas programmet. Om användaren trycker på något annat ska ingenting hända. I exemplet i bilagan avslutas programmet så fort användaren trycker på någon tangent alls. Förutom själva metoden keypress och konstruktorn SmallGame kan du vilja skapa hjälpmetoder och instansvariabler i SmallGame. Du ska däremot inte ändra i SmallGame.main. private int lo = 1; private int hi = 100; private int getguess() { return (lo + hi) / 2; private int printguess() { System.out.println("Jag gissar på " + getguess() + "."); public SmallGame() { printguess(); void keypress(char c) { switch (c) { case = : System.exit(); case + : lo = getguess() + 1; printguess(); break; case - : hi = getguess() - 1; printguess(); break;

B6. I bilagan finns delar av ett annat program med klassen Item och interfacet Duplicable. Programmet ska hantera en bibliotekskatalog. Item är tänkt att representera objekt (böcker, tidningar, CD-skivor, o.s.v.) som finns i katalogen. Skriv en icke-abstrakt klass som representerar böcker och som: a) ärver från Item b) överskuggar tostring c) kan skapas med samma parametrar som Item d) implementerar Duplicable Tänk på att inte skriva någon överflödig kod. Se till att namnge olika element i din kod på lämpligt sätt! Du behöver inte skriva Javadoc i koden. public class Book extends Item implements Duplicable { public Book(String originator, String title) { super(originator, title); public Item duplicate() { return new Book(this.originator, this.title); public int rentalperiod() { return 30; @Override public String tostring() { return "Book. Author: " + this.originator + ". Title: " + this.title + ".";