Tentamen i Imperativ Programmering med Grundläggande Objektorientering, DIT012 Joachim von Hacht Datum: 2017-01-10 Tid: 14.00-18.00 Hjälpmedel: Engelskt-Valfritt språk lexikon Betygsgränser: • U: -23 • G: 24-43 • VG: 44-60 (max 60) Lärare: Joachim von Hacht, tel. 031/772 10 03. Någon besöker ca 15.00 och 16.00, Granskning: Tentamen kan granskas på studieexpeditionen. Vi ev. åsikter om rättnin- gen eposta mig och ange noggrant vad du anser är fel så återkommer jag (ev. ta en bild och skicka). Instruktioner: • För full poäng på essä-frågor krävs ett läsbart, begripligt och heltäckande svar. Generellt 1p för varje relevant aspekt av problemet. Oprecisa eller alltför generella (vaga) svar ger inga poäng. Konkretisera och/eller ge exempel. Det är aldrig någon risk att vara övertydlig! • Det räcker med enbart relevanta kodavsnitt, övrig kod ersätts med ... (aldrig import, main-metod, etc....) • Överkomplicerade lösningar kan ge poängavdrag. • Vi utgår från att användaren alltid skriver rätt och/eller gör rätt (d.v.s ingen felhantering behövs). Om felhantering skall ingå anges detta specikt. LYCKA TILL... 1 GU DIT012 D&IT Joachim von Hacht 1. Förklara med en eller ett par meningar: 4p a) Aktuell och formell parameter. b) Klass och objekt. 2. Vilka rader 1-8 nedan ger kompileringsfel? Motivera kortfattat. int i = 1; char ch = '1'; double d = 1.0; i = d; i = ch; ch = i; ch = d; d = i; d = ch; d = doIt(ch); // // // // // // // 4p 1 2 3 4 5 6 7 int doIt(int i){ return (double) i;} // 8 3. Skriv en metod digitSum( int n ) som ger siersumman för något positivt heltal n. Exempel: n 123 444 9 4p siffersumma 6 ( = 1 + 2 + 3) 12 ( = 4 + 4 + 4) 9 (= 9) 4. Skriv en metod secondLargest( int[] a) som givet en heltalsarray a returnerar det näst största talet i arrayen. Vi antar att a [1,5,3,7,2] [9,2] [3, 5, 7, 5] [7,7,7] resultat 5 2 5 7 2 a.length ≥ 2. Exempel: 6p GU DIT012 D&IT Joachim von Hacht 5. Skapa en klass för cirklar och visa hur du instansierar två cirkelobjekt samt slår ihop dessa med hjälpa av metoden merge, se nedan. Alla cirklar har en position (i 2D) samt en radie. Följande gäller: • 10p Klassen skall ha en konstruktor som givet position och radie initierar objektet med aktuella värden. • Klassen skall ha en metod som returnerar cirkelns area (A = πr2 ). För π kan Math.PI användas. Metoderna Math.pow(base,exp) och Math.sqrt() (kvadratrot) får användas. • Klassen skall ha en metod merge som slår ihop aktuell cirkel med en annan cirkel. Sammanslagningen skall skapa en ny cirkel med arean lika med summan av de sammanslagna cirklarnas areor och med position som cirkeln med störst area. 6. Skriv en metod, String rle( String str ), som returnerar en komprimerad version strängen str. Komprimeringen ersätter följder av lika tecken med ett numeriskt 8p värde för antalet tecken samt tecknet, se nedan. Strängen består bara av de engelska bokstäver (a-z, A-Z). str aaaaaeeeeefffw qqqqqqqqqqqq komprimerad 5a4e3f1w 12q Färdiga metoder (från olika klasser) som får användas. String - charAt(int i), ger tecknet 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 (inkl.) till end-1. - subString(int start), ger en delsträng från start (inkl.) till strängens slut. - toCharArray(), gör om strängen till en array med tecken StringBuilder - append(String s), lägger till strängen s sist i Stringbuilder-objektet. - append( char ch ), som ovan - setLength(), sätter aktuell längd, setLength(0) raderar alla tecken. - toString(), omvandlar StringBuilder-objektet till en String. Character - isDigit(ch) (klassmetod). Metoden returnerar sant om ch är 0-9. Integer - valueOf(String s) (klassmetod). Metoden omvandlar en sträng till ett heltal. OBS! Att metoden kastar ett undantag för tomma strängen. 3 GU DIT012 D&IT Joachim von Hacht 7. Vad kommer programmet nedan att skriva ut? Förklara i detalj genom att rita en bild med variabler, referenser och objekt (lådor, pilar, ...). Du måste rita! N n1 = new N(1); N n2 = new N(2, n1); N n3 = new N(3, n2); N n = n3; while (n != null) { out.print(n.i); n = n.n; } 8p // Now, how will this look? // What happens here? public class N { int i; N n; public N(int i) { this.i = i; } public N(int i, N n) { this.i = i; this.n = n; } } 8. Skriv en metod som givet en array av heltal, sorterade i stigande ordning, försöker avgöra om summan av tre godtyckliga element blir 0. Om en sådan summa hittas returneras en array med index till de tal som ingick i summan. Annars returneras en tom array. Metoden behöver bara returnera någon (första funna) lösning. Vi anta att längden på arrayen är ≥ 3. Exempel: Array [-9, -4, 0] [0, 0, 0, 1] [1, 2, 3] [-25, -10, -7, -3, 2, 4, 8, 10] Resultat [] [0, 1, 2] [] [1,4,6] eller [2,3,7] a) Beskriv din lösning på vanlig svenska. Vilken eller vilka idé(er) bygger lösningen på? Rita gärna! b) Skriv ner metoden i kod. 4 10p GU DIT012 D&IT Joachim von Hacht 9. Betrakta koden nedan. 6p a) Vilka rader kommer inte att kompilera. Förklara! b) Om de rader som inte kompilerar kommenteras ut, vad kommer programmet att skriva ut? Förklara! A a1 = new B(); A a2 = new C(); B b1 = new C(); B b2 = new A(); IX ix1 = new A(); IX ix2 = new C(); a2.doIt(); // Will print? public interface IX { void doIt();} public class A { public void doIt() { out.println("A doIt()");} public void doOther() { out.println("A doOther()");} } public class B extends A { public void doYetOther(){ out.println("B doYetOther()"); } } public class C extends A implements IX { public void doIt() { out.println("C doIt()");} } 5