Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering
|
|
- Lisbeth Berglund
- för 9 år sedan
- Visningar:
Transkript
1 Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA54 Tentamen för TDA54 Objektorienterad programmering DAG: TID: 14: 1: Ansvarig: Joachim von Hacht och Christer Carlsson Förfrågningar: Joachim von Hacht, 77/31166 Christer Carlsson, ankn 13 Resultat: erhålls via Ladok Betygsgränser: 3:a 24 poäng 4:a 36 poäng 5:a 4 poäng maxpoäng 6 poäng Siffror inom parentes: Granskning: Hjälpmedel: Var vänlig och: anger maximal poäng på uppgiften. Torsdag 24/9 kl -13 och fredag 25/9 kl -13, rum 6 i EDIT-huset. Cay Horstmann: Java for everyone eller Jan Skansholm: Java direkt med Swing. Understrykningar och smärre förtydligande noteringar får finnas. 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!!!!
2
3 Uppgift 1. a) Vad skrivs ut av följande program? Förklara! public class SomeClass { private int x, y; private static int z; public SomeClass(int a, int b, int c) { x = a; y = b; z = c; }//constructor public String tostring() { return x + " " + y + " " + z; }//tostring }//SomeClass public class Main { public static void main(string[] s) { SomeClass a = new SomeClass(1, 2, 3); SomeClass b = new SomeClass(4, 5, 6); System.out.println(a); System.out.println(b); }//main }//Main b) Vad blir utskriften när nedanstående program exekveras? import java.util.arrays; public class Question1b { public static void fill(int d, int[] arr) { for (int i = ; i < arr.length; i++) { arr[i] = d; d += 2; } } //fill public static void main(string[] args) { int d = ; int[] arr = new int[4]; fill(d, arr); System.out.println(d); System.out.println(Arrays.toString(arr)); }//main }//Question1b c) Betrakta nedanstående klass: public class Question1c { public static void main(string[] args) { int a = 3; double b = 2; double c = cubify(a, b); } public static void cubify(double x, int y) { double result = Math.pow(x, 3) + Math.pow(y, 3); return result; }//cubify }//Question1c Det finns två kompileringsfel i koden. Vad är fel och hur skall felen åtgärdas? (2 poäng) (2 poäng) (2 poäng)
4 Uppgift 2. BMI (Body Mass Index) är ett tal som anger ifall man väger för mycket eller för litet. BMI-talet beräknas som vikten dividerat med längden i kvadrat (vikt / längd 2 ), där vikten anges i kilogram och längden i meter. Om man t ex väger 6.5 kg och är 176 cm lång så blir BMI = 6.5 / vilket är ungefär (ett BMI-tal mellan 19 och 24 betraktas som idealvikt). Din uppgift är att skriva ett program som upprepade gånger läser in en vikt i kilo och en längd i meter och skriver ut det erhållna BMI-talet. 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). Exekveringen av programmet avbryts 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. För att erhålla full poäng på uppgiften: skall vikten och längden göras i en inläsningssats (dvs ett Scanner-objekt skall användas). skall programmet ge felutskrift om ogiltig indata ges (dvs om negativa värden ges). skall utskriften av BMI-talet anges med exakt 2 decimaler. skall programmet innehålla en metod public static double bmi(double kilo, double meter) som beräknar BMI-talet. Med användning av dialogrutor Med användning av System.in resp System.out Ge vikt i kilo och längd i meter: BMI-värdet är.33 Ge vikt i kilo och längd i meter: Ogiltig indata! Ge vikt i kilo och längd i meter: (9 poäng) Uppgift 3. En lagomvinklad triangel är vad vi i denna uppgift kallar en triangel där minst en av vinklarna är exakt 6 grader (se bredvidstående bild). De lagomvinklade trianglarna känner sig ofta förbisedda jämfört med de mycket mer kända rätvinkliga trianglarna (har så kallat mindervinkelkomplex), trots att de lagomvinklade också har en snygg formel för sina sidlängder: c 2 = a 2 + b 2 - ab Ett exempel på en lagomvinklad triangel är en trianglel med sidlängderna a = 5, b = och c = 7, ty c 2 = = =49 49=7 Skriv ett program som skipar lite rättvisa i detta triangeldrama genom att fråga efter ett heltal N (mellan 1 och 1) och sedan skriver ut hur många lagomvinklade trianglar det finns vars samtliga sidor är heltal i intervallet 1 till N. Notera: Metoden Math.sqrt returnerar ett reellt tal, men om invärdet är en perfekt kvadrat garanterar metoden att värdet som returneras är exakt - t.ex. ger Math.sqrt(25.) värdet 5. och inte eller 5.1. (6 poäng)
5 Uppgift 4. Ett teleskop avsöker en rektangulär yta av natthimmelen och samlar in data i ett endimensionellt fält. Varje datavärde utgörs av ett reellt tal och anger den ljusmängd som teleskopet upptäckte. Teleskopet sveper fram och tillbaks över himmelen enligt den ordning som anges av figuren nedan: Teleskopet lagrar datavärdena i ett endimensionellt fält av typen double. Resultatet av svepningen som visas i figuren ovan blir alltså ett fält med följande utseende: Skriv en metod public static double[][] tomatrix(double[] scanned, int nrrows) som tar ett endimensionellt fält scanned och ett heltal nrofrows. Parametern scanned innehåller de datavärden som teleskopet lagrat under en datainsamlingssession och nrofrows anger hur många svep som teleskopet gjort under sessionen. Metoden skall returnera ett tvådimensionellt fält som representera den ursprungliga rektangulära ytan av himmelen. Antag att det endimensionella fältet som visas ovan har lagrats i variabeln data då skall anropet tomatrix(data, 4) returnera matrisen ( poäng)
6 Uppgift 5. Vinjettering är ett optiskt fenomen som är karaktäristiskt för gamla fotografier. Fenomenet orsakas av att kameraobjektivet inte klarar av att belysa hela fotot jämnt - utan ljusstyrkan avtar ut mot kanterna vilket innebär att fotografiet blir mörkare i kanterna än i mitten. Din uppgift är att skriva en metod public static int[][][] vignetting(int[][][] sample) { som tar en digital färgbild samples och returnerar en ny digital färgbild som vinjetterad kopia av bilden samples. En digital färgbild representeras som ett tvådimensionellt fält av bildpunkter, där varje bildpunkt utgörs av tre heltalsvärden i intervallet De enskilda värdena i en bildpunkt representerar intensiteten av färgerna rött, grönt och blått. Vinjetteringen är åstadkoms genom att multiplicera komponenterna i varje bildpunkt i den ursprungliga bilden med värdet: 1 - (distance to center) 2 / (half of image diagonal) 2 Orginal bild Vinjetterad bild (7 poäng)
7 Uppgift 6. Ett prydnadsord är ett ord som inleds och avslutas med en likadan delsträng. Delsträngen måste vara kortare än hela ordet (en så kallad äkta delsträng). Prynadsordets grad bestäms av längden på delsträngen. Exempel : "onion" "underground" "jackhammer" "aaaa" är ett prydnadsord av grad 2 (börjar och slutar med strängen "on") är ett prydnadsord av grad 3 (börjar och slutar med strängen "und") är inget prydnadsord är ett prydnadsord av grad 3 (börjar och slutar med strängen "aaa") Med hjälp av ett prydnadsord kan man skapa en prydnadssträng. Detta görs på följande sätt: 1) Ta bort delsträngen från början av prydnadsordet 2) Strängen som blir kvar lägger man till på slutet av (hela) prydnadsordet lika många gånger som graden för prydnadsordet. Exempel : Strängen "onion" är ett prydnadsord av grad 2 som börjar och avslutas med delsträngen "on". 1) Ta bort delsträngen "on" från början av "onion", vilket ger strängen"ion". 2) Lägg till strängen "ion" 2 gånger på slutet av strängen "onion", vilket ger prydnadssträngen "onionionion". a) Skriv en metod getstartendstring som givet en sträng returnerar den delsträng som inleder och avslutar strängen om strängen är ett prydnadsord, annars returneras den tomma strängen. Exempel: Anropet getstartendstring("onion") skall returnera strängen "on" Anropet getstartendstring("aaaa") skall returnera strängen "aaa" Anropet getstartendstring("jackhammer") skall returnera strängen "" (4 poäng) b) Skriv en metod getdecoratedstring som givet en sträng skapar en prydnadssträng om strängen är ett prydnadsord, annars returneras strängen oförändrad. Du skall givetvis nyttja metoden getstartendstring från deluppgift a) i din lösningen. Exempel: Anropet getdecoratedstring("jackhammer") skall returnera strängen "jackhammer" Anropet getdecoratedstring("") skall returnera strängen "" Anropet getdecoratedstring("aaaa") skall returnera strängen "aaaaaaa" ("aaaa" + "a" + "a" +" a") Anropet getdecoratedstring("alfalfa") skall returnera strängen "alfalfalfalfalfalfa" ("alfalfa" + "lfa" + "lfa" +" lfa" + "lfa") Tips: Följande användbara metoder finns I klassen String - length() - substring(start) - substring(start, slut) - endswith("abc") // returnerar true om strängen avslutas med "abc", annars returneras false (4 poäng)
8 Uppgift 7. Asteroids är ett av de först välkända datorspelen, se bild. I spelet manövrerar en spelare ett rymdskepp. I rymden rör sig hela tiden asteroider. Spelaren kan undvika kollision med asteroider genom att flytta skeppet eller genom att skjuta sönder och splittra dem. Om skeppet krockar med en asteroid minskas antal liv för spelaren. När antalet liv är är spelrundan över. Ju längre spelaren överlever desto fler poäng får denne. Skapa klasser till en objektmodell av datorspelet Asteroids. Det skall finnas en huvudklass, AsteroidGame, som representerar hela spelet, se uppgift d). a) Ange fyra lämpliga klasser förutom AsteroidGame. (2 poäng) b) Ange några lämpliga instansvariabler för varje klass. (2 poäng) c) Ange lämpliga konstruktorer för klasserna. (2 poäng) d) Visa hur klassen AsteroidGame kan se ut. Klassen skall använda instansvariabeler och samlingar utifrån de klasser du skapade vid a). (2 poäng)
9 Uppgift. Inom programmering behöver man ibland trädstrukturer. Du skall i denna uppgift använda ett binärt sökträd. Ett binärt sökträd är uppbyggt enligt följande: Nivå 1 1 Roten Nivå 2 Barn till 1, förälder till Barn till 1, förälder till 2 och Nivå 3 Barn till, förälder till 2 och 11 2 Barn till Nivå Barn till - Ett binärt sökträd är uppbyggt av ett antal noder, som innehåller värden (i exemplet ovan lagras heltal). - Noderna i trädet nås via roten. Ett träd har exakt en rot. - Roten ligger på nivå 1 i trädet. - På varje nivå förgrenar sig trädet i två grenar, det vänstra barnet respektive högra barnet. Grenarna kan vara tomma. - Ett binärt sökträd har egenskapen att värdet i barnet till vänster är mindre än värde hos föräldern och värdet i barnet till höger är större än värde hos föräldern. - Det finns inga dubbletter i ett binärt sökträd, dvs. alla värden i trädet är unika. Man kan lagra ett binärt sökträd i ett fält (array) genom att man låter roten ha index 1 och ett vänsterbarn ha dubbla förälderns index och ett högerbarn dubbla förälderns index plus 1. Eftersom ett fält är en statisk datastruktur definierar vi trädets storlek på hur många nivåer trädet kan innehålla. Trädet ovan, som har har 4 nivåer, skulle då representeras enligt: Observera: Index i fältet används används inte. Eftersom endast positiva heltal kan lagras i trädet representeras värdet tomma noder, dvs noder där det inte finns några värden lagrade. Skriv en klass Tree i vilket heltal kan lagras. Klassen skall innehålla: a) En konstruktor som givet antal nivåer i trädet skapar ett fält (array) av korrekt storlek. (2 poäng) b) En metod insert(int n) som lägger till ett positivt heltalsvärde på rätt ställe i trädet. Ingen kontroll av ArrayIndexOutOfBoundsException behövs. Exempel: (6 poäng) 1) currenttree 1 2) currenttree.insert(15); 1 3) currenttree.insert(42);