DVS SU/KTH 1 (6) OOP OOP Omtenta 2008-02-16 10.00 15.00 Avser kurserna: DSK1:OOP GES:OOP ID1013 GKOOP-distans Anvisningar Skriv namn och personnummer på varje inlämnat blad. Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. Max antal poäng är 30. För att bli godkänd på tentan (minst betyg E) krävs dels minst 4 poäng sammanlagt på uppgift 1 och uppgift 2 och dels minst 15 poäng sammanlagt på hela tentan. För högre betyg krävs: Betyg D: minst 18 poäng samt högst en uppgift med 0 poäng. Betyg C: minst 21 poäng samt ingen uppgift med 0 poäng. Betyg B: minst 24 poäng samt ingen uppgift med 0 poäng. Betyg A: minst 27 poäng samt uppgifterna lösta med korrekt användande av objektorienterade principer (t.ex. inkapsling, ej upprepning av kod). Betyget Fx med möjlighet att komplettera ges till studenter som fått 12-14 poäng eller som fått mer än 14 poäng men missat att få 4 poäng på uppgift 1+2. Hjälpmedel Samtliga läroböcker om Java är tillåtna hjälpmedel. Kompendier räknas INTE som läroböcker. Lycka till!!!! Lösningsförslag kommer att presenteras på kursens webbsidor.
DVS SU/KTH 2 (6) OOP Uppgift 1 (6 poäng) Om man exekverar följande programrader, vad kommer att att skrivas ut på skärmen (du skall i dina svar vara noga med vad som skrivs på vilken rad, alltså beakta skillnaden mellan print och println). A int tal = 7; int annat = 10; if (tal > annat) System.out.println( Stol ); else System.out.println( Bord ); annat -= 2; if (++tal > annat) System.out.println( Drake +tal); else System.out.println( Tiger +tal); B int x=3; while (x<8){ System.out.println(x++); for (int y=1; y<x; y+=2) System.out.print(y+ ); System.out.println(x++); C int[] arr = new int[8]; int tal1=10, tal2=3; for (int x=0; x<arr.length; x++){ arr[x] = tal1+tal2; tal1--; tal2+=x; for (int x : arr){ System.out.print(x+ ); if (x%4 == 0) System.out.println();
DVS SU/KTH 3 (6) OOP Uppgift 2 (6 poäng) Om man exekverar (interpreterar) följande Java-program - vad kommer att skrivas ut? main-metoden ligger i class Upp2, startas alltså med: java Upp2 class Upp2{ public static void main(string[] args){ Riffe[] alla = new Riffe[5]; alla[0]=new Lessa("Varg"); alla[1]=new Unver(4); alla[2]=new Lessa("Tiger"); alla[3]=alla[1]; alla[4]=alla[0]; for (Riffe ri : alla) ri.skriv(); class Riffe{ private static String[] färg = {"Gul", "Blå", "Röd", "Vit"; private static int nummer = 0; private String str = "Svart"; public Riffe(){ str = färg[nummer++]; public Riffe(String str){ this(); this.str = str; public void skriv(){ for (int x=getnummer(); x>0; x--) System.out.print(str); System.out.println(); public int getnummer(){ return nummer; class Lessa extends Riffe{ private String min = "Kaffe"; public Lessa(String str){ min = str; public void skriv(){ System.out.println("Lessa: "+min); super.skriv(); class Unver extends Riffe{ private int antal = 2; public Unver(int antal){ super("grön"); this.antal = antal; public int getnummer(){ return antal;
DVS SU/KTH 4 (6) OOP Uppgift 3 (6 poäng) Skriv ett litet Java-program (en klass med en main-metod) som ber användaren mata in ett antal heltal och som sedan skriver ut de talen på tre olika rader. På första raden skall alla tal i intervallet 1-100 skrivas ut, på den andra raden skall alla tal i intervallet 101-1000 skrivas och på tredje raden skall resten av talen skrivas (de som är mindre än 1 och de som är större än 1000). Programmet skall först fråga användaren efter hur många tal som skall matas in. Därefter får användaren mata in alla dessa tal. Sist skrivs talen ut på tre rader. När programmet körs skall det se ut ungefär så här: Hur många tal? 15 Tal 1> 17 Tal 2> 831 Tal 3> -43 Tal 4> 11 Tal 5> 99 Tal 6> 312 Tal 7> 1763 Tal 8> 0 Tal 9> 912 Tal 10> 38 Tal 11> 114 Tal 12> -68 Tal 13> 100 Tal 14> 3 Tal 15> 987 17 11 99 38 100 3 831 312 912 114 987-43 1763 0-68
DVS SU/KTH 5 (6) OOP Uppgift 4 (6 poäng) I ett litet Java-program har man bl a ett antal Varelser. Alla varelser har ett namn samt egenskapen att de kan låta. Så här ser dessa klasser ut: class Varelse{ private String namn; public Varelse(String namn){ this.namn=namn; public String getnamn(){ return namn; class Hund extends Varelse{ public Hund(String namn){ super(namn); public void låta(){ System.out.println(getNamn()+": Vov Vov Vov"); class Brandbil extends Varelse{ public Brandbil(String namn){ super(namn); public void låta(){ System.out.println(getNamn()+": Tut Tut Tut"); class Politiker extends Varelse{ public Politiker(String namn){ super(namn); public void låta(){ System.out.println(getNamn()+": Jag lovar, Jag lovar..."); Man vill i programmet ha en metod som får (som argument) en ArrayList som innehåller ett antal blandade varelser (Hund-, Brandbil- och Politiker-objekt) och som skall låta alla varelserna i ArrayListan låta. Ett försök att skriva en sådan metod kommer här: public void allaskalåta(arraylist<varelse> alla){ for (Varelse v : alla) v.låta(); Tyvärr fungerar metoden allaskalåta ovan inte utan det blir fel. A) Vilken typ av fel (kompileringsfel, exekveringsavbrott, logiskt fel) blir det? B) Varför blir det fel? C) Hur skulle man kunna åtgärda så att det fungerar? (vid del C ovan är det tillåtet att föreslå förändringar både i Varelse-klasserna och i metoden allaskalåta)
DVS SU/KTH 6 (6) OOP Uppgift 5 (6 poäng) Skriv klassen Test som skall innehålla en textsträng och ett heltal. Om man i något program använder klassen Test på följande sätt: Test t1 = new Test("Struts", 3); Test t2 = new Test("Pingvin"); System.out.println(t1); System.out.println(t2); så skall följande skrivas ut: Struts Struts Struts Pingvin Om man i ett program gör följande: Test t1 = new Test("Skata", 3); t1.öka(); t1.öka(); System.out.println(t1); så skall följande skrivas ut: Skata Skata Skata Skata Skata När ni skriver klassen Test så skall samtliga attribut, konstruktorer och metoder ha lämpliga åtkomstmodifierare.