Institutionen för Datavetenskap TENTAMEN 2015-01-17 CTH HT-14 TDA540 Tentamen för TDA540 Objektorienterad programmering DAG: 15-01-17 TID: 14:00 – 18:00 Ansvarig: Joachim von Hacht och Christer Carlsson Förfrågningar: Joachim von Hacht, 0707/311066 Christer Carlsson, ankn 1038 Resultat: Betygsgränser: erhålls via Ladok 3:a 4:a 5:a maxpoäng 24 poäng 36 poäng 48 poäng 60 poäng Siffror inom parentes: anger maximal poäng på uppgiften. Granskning: Tentamen kan granskas på studieexpeditionen. Vi eventuella åsikter om rättningen eposta och ange noggrant vad du anser är fel så återkommer vi. Hjälpmedel: Cay Horstmann: Java for everyone eller Jan Skansholm: Java direkt med Swing. Understrykningar och smärre förtydligande noteringar får finnas. Var vänlig och: Skriv tydligt och disponera papperet på lämpligt sätt. Börja varje uppgift på nytt blad. Skriv ej på baksidan av papperet. Observera: Uppgifterna är ej ordnade efter svårighetsgrad. Titta därför igenom hela tentamen innan du börjar skriva. Alla program skall vara väl strukturerade, lätta att överskåda samt enkla att förstå. Indentera programkoden!! Vid rättning av uppgifter där programkod ingår bedöms principiella fel allvarligare än smärre språkfel. LYCKA TILL!!!! Uppgift 1. a) Betrakta metoden mystery nedan: public static int mystery (int value){ if ( value < 0) value = -value; int max = 0; while ( value > 0) { int digit = value % 10; value = value / 10; if (digit > max) max = digit; } return max; }// mystery Vad returnerar metoden mystery om talet 2074 ges som parameter? Förklara vad metoden gör! (3 poäng) b) Vilken utskrift fås då nedanstående program körs? public class Counter { private static int number = 0; private int value = 0; public Counter() { number = number + 1; value = number; }//constructor public void addOne() { value = number; }//addOne public String toString() { return "[" + number + ", " + value + "]"; }//toString }//Counter public class MainClass { public static void changeValues(int n, Counter c1, Counter c2) { n = n + 1; c1 = new Counter(); c1.addOne(); c2.addOne(); }//changeValues public static void main(String[] arg) { int k = 5; Counter a = new Counter(); Counter b = new Counter(); changeValues(k, a, b); System.out.println("k= " + k); System.out.println("a= " + a); System.out.println("b= " + b); }//main }//MainClass (3 poäng) c) Nedanstående kodavsnitt ger ett kompileringsfel. Förklara vad som är fel och rätta till! do { boolean b = Math.random() < 0.5; } while (b); (1 poäng) Uppgift 2. Janne Java driver ett företag i vilket de anställda har timlön. Lönen betalas ut veckovis och om den sammanlagda arbetstiden under en vecka överskrider 40 timmar utgår övertidsersättning med 50 procent på den ordinarie timlönen för de överskjutande timmarna. Din uppgift är att skriva ett program som Janne kan använda för att räkna ut de anställdas veckolöner. Programmet skall läsa in antal utförda arbetstimmar och timlönen och därefter skriver ut den erhållna veckolönen. Du får själv välja om du vill göra in- och utmatning via dialogrutor eller använda System.in respektive System.out (se exemplen nedan). För att få full poäng på uppgiften · skall programmet utformas på så sätt att inläsningen upprepas tills användaren avbryter exekveringen (vid användning av dialogrutor genom att användaren trycker på Cancel-knappen och vid användning av System.in genom att användaren lämpligen ger ctrl z) · skall programmet innehålla en metod public static double payment(double hours, double perHour) som beräknar veckolönen. · skall programmet ge en felutskrift om ett negativt värde ges på antal arbetade timmar eller på timlönen · skall utskriften av veckolönen ges med exakt 2 decimaler. Med användning av dialogrutor Med användning av System.in resp System.out Ange antalet arbetstimmar och timlön: -10.0 30.5 Felaktig indata Ange antalet arbetstimmar och timlön: 46.5 106.5 Veckolönen är 5298.38 kronor Ange antalet arbetstimmar och timlön: (10 poäng) Uppgift 3. Skriv en metod public static int[] getIndexOfMaxValues( int[] vekt) som tar ett osorterat heltalsfält vekt och returnerar ett nytt fält som innehåller index för samtliga förekomster av det största värdet i vekt. Exempel: Antag att följande deklaration har gjorts int[] arr = {12, 3, 50, 24, 50, 32, 50, 16}; anropet getIndexOfMaxValues(arr) returnerar då fältet {2, 4, 6}, eftersom 50 är det största värdet och detta värde finns i fältet på index 2, 4 och 6. Tips: Det kan vara lämpligt att införa ett par hjälpmetoder. (6 poäng) Uppgift 4. En digital bild kan representeras som ett tvådimensionellt fält av bildpunkter. I en digital färgbild utgörs varje bildpunkt av tre heltalsvärden i intervallet 0-255, där de enskilda värdena representerar intensiteten av färgerna rött, grönt och blått. En färgbild kan avbildas med ett tredimensionellt fält av typen int[][][], är den första dimensionen definierar bildens höjd, den andra dimensionen definierar bildens bredd och den tredje dimensionen representerar färgerna rött, grönt och blått. Din uppgift är att skriva en metod public static int[][][] frosty(int[][][] samples) som tar en bild samples och returnerar en ny bild som ger effekten att se bilden samples genom en frostad glasskiva. Detta görs genom att låta färgerna i punkten (x,y) i den nya bilden tas från en annan, närliggande punkt i samples; denna punkt väljs slumpmässigt så att dess x- och y-koordinater ligger högst fem bildpunkter från x resp y. Original bild Filtrerad bild (7 poäng) Uppgift 5. Ett Fibonacci-ord är en specifik sträng av ettor och nollor t.ex. "01001010". Sekvensen definieras som: s0 = "0" s1 = "01" sN = sN-1 + sN-2 (det första Fibonacci-ordet) (det andra Fibonacci-ordet) (det N:te Fibonacci-ordet) De 6 första Fibonacci-orden är "0" "01" "010" "01001" "01001010" "0100101001001" Skriv en metod som givet ett heltal n (>= 0) returnerar det n:te Fibonacci ordet. Ingen felhantering krävs. Exempel: fibonacciWord(0) fibonacciWord(3) -> "0" -> "01001" (6 poäng) Uppgift 6. Vi vill översätta svenska meningar till "allspråket". Detta sker genom att, för alla svenska ord, lägga till "all" efter den första konsonanten. Exempel: "Hej! Hur är läget?" -> "Hallej! Hallur ärall lalläget?" Vi antar att alla ord och meningar åtskiljs av exakt ett mellanslag. Skapa en klass AllLanguage med följande metoder: ger sant om ch är en konsonant annars falskt. a) private boolean isConsonant(char ch) (2 poäng) b) private int indexOfFirstConsonant(String word) ger index för första konsonant. Om konsonant saknas returneras -1. (3 poäng) c) public String toAll(String swe) givet en sträng på svenska returneras översättningen till allspråket. (3 poäng) För att lösa uppgifterna är det tillåtet att använda följande metoder från klassen String: charAt(int i) ger teckent vid index i. indexOf(char ch) ger index för tecknet ch, -1 om tecknet saknas. length() ger längden av strängen. subString(int start, int end) ger en delsträng från start till end-1. subString(int start) ger en delsträng från start till strängens slut. split(String str) delar upp en sträng i en array av delsträngar utifrån ett visst tecken. Returnerar fält med String-objekt (String[]). Exempel: "aaa:bb:cccc:dd".split(":") -> { "aaa", "bb", "cccc", "dd" } Uppgift 7. Vi skall skriva ett program för ett kortspel. Spelet spelas av två spelare med en kortlek. Kortleken ligger med baksidan upp mellan spelarna. Spelarna drar växelvis det översta kortet från leken. Spelarna har alltid ett visst antal kort på handen. a) Identifiera och skapa några centrala klasser för en objektmodell av spelet. Ange för varje klass några centrala attribut (instansvariabler) och en konstruktor. Inget annat behöver anges. (4 poäng) b) Skapa en metod buildGame() som bygger och returnerar hela objektmodellen. Metoden behöver inte ligga i någon klass, skriv den "rakt av". Om något under byggandet "mer eller mindre" upprepas behöver du inte koda detta, skriv bara en kommentar t.ex. // Same for ... (2 poäng) b) Antag att vi har en kommandorad och trycker "p". Detta skall medföra att modellen ändras så att aktuell spelare har dragit ett kort från leken. Skapa metoder i modellen för att åstadkomma detta. Du får använda Listmetoderna nedan. (4 poäng) Tillåtna metoder från List-gränssnittet remove(int index) tar bort elementet med givet index ur listan. addAll( List<?> elements) lägger till en lista med element (av vilken typ som helst) sist i listan. isEmpty() sant om listan är tom annars falskt. Uppgift 8. a) Redogör för likhet mellan objekt i Java. (2 poäng) b) Antag att vi har en klass Player med en instansvariabel String name. Vi definerar att två player-objekt är lika om de har lika namn. Ge ett kodexempel på hur vi kan implementera vår definition av likhet för Player-klassen (endast likhet inget annat krävs). (4 poäng)
© Copyright 2024