LYCKA TILL!!!!

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)