DVS SU/KTH 1 (6) OOP OOP Omtentamen 09-02-21 10.00 15.00 Avser kurserna: DSK1:OOP GES:OOP ID1013 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 String str1="europa", str2="amerika"; int tal=7; if (tal++ > 7) System.out.println(str1 + tal++); else System.out.println(str2 + tal++); System.out.println(str1 + tal + str2); B int tal1=10, tal2=20; while (tal1 < tal2){ tal2-=2; for (int i=tal1; i<tal2; i+=2) System.out.print(i+" "); System.out.println(tal1++); C int[]arr=new int[10]; int x=17; for (int index=0; index<arr.length; index++){ arr[index]=x; x-=3; if (x<index) arr[index]+=5; System.out.println("Arrayen:"); for (int z : arr) System.out.println(z);
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 Uppg2, startas alltså med: java Uppg2 class Uppg2{ public static void main(string[]args){ Fnyrr[] obj = new Fnyrr[4]; obj[0]=new Hocke(1); obj[1]=new Smatte(); obj[2]=new Smatte(); obj[3]=new Hocke(3); for (int x=0; x<obj.length; x++) obj[x].skriv(4); class Fnyrr{ public static String[]färg={"Röd","Blå","Gul","Vit","Grön"; public static int nummer=0; public String minfärg="svart", djur="björn"; public Fnyrr(){ minfärg=färg[nummer++]; public Fnyrr(int tal, String djur){ minfärg=färg[tal]; this.djur=djur; public void skriv(int antal){ for (int x=nummer; x<antal; x++) System.out.println(minFärg+" "+djur); class Hocke extends Fnyrr{ public static String[] alla={"katt","hund","gris","elefant"; public Hocke(int tal){ super(tal, alla[tal]); class Smatte extends Fnyrr{ public String grej="igelkott"; public void skriv(int antal){ System.out.println(grej); super.skriv(3);
DVS SU/KTH 4 (6) OOP Uppgift 3 (6 poäng) Skriv ett Java-program som frågar användaren efter ett antal ord (String ar). Programmet skall fortsätta att fråga efter ord tills användaren matar in ett ord som redan blivit inmatat. Då skall inmatningen avslutas och programmet skall skriva ut hur många inmatade ord det var (det sista ordet, dubletten, skall ej räknas). Dialogen skulle t.ex. kunna se ut så här: Skriv ett ord: Kokosboll Skriv ett ord: Mjölk Skriv ett ord: Skidåkning Skriv ett ord: Gaffel Skriv ett ord: Badboll Skriv ett ord: Grodyngel Skriv ett ord: CD-spelare Skriv ett ord: Gaffel Det var 7 olika ord som matades in. När ordet Gaffel matades in för andra gången upptäcker alltså programmet en dublett och inmatningen avslutas. För varje inmatat ord så måste man alltså kontrollera om det är likadant som något av alla tidigare inmatade ord.
DVS SU/KTH 5 (6) OOP Uppgift 4 (6 poäng) Följande klasser för att hantera olika sorters Mat finns (OBS klasserna innehåller även lämpliga konstruktorer, dessa är dock ointressanta för denna uppgift): abstract class Mat{ private int vikt; public int getvikt(){ return vikt; class Godis extends Mat{ private int socker; public int getkalori(){ return getvikt()*socker; class Kött extends Mat{ private String sort; private int fetthalt; public int getkalori(){ if (sort.equals( Ko )) return getvikt()*fetthalt/3; else return getvikt()*fetthalt/2; class Fisk extends Mat{ private boolean färsk; public int getkalori(){ if (färsk) return getvikt()/2; else return getvikt(); En programmerare har sedan skrivit en metod som får in (som argument) ett antal blandade objekt (Godis, Kött och Fisk-objekt, skapade på annat ställe i programmet) och som returnerar summan av kalorierna för dessa objekt. Denna metod ser ut så här: public int summakalori(arraylist<mat> maten){ int sum=0; for (Mat m : maten) sum+=m.getkalori(); return sum; Tyvärr fungerar inte denna metod, det blir ett fel. 1. Vilken sorts fel blir det? (kompileringsfel, exekveringsavbrott eller logiskt fel) 2. Varför inträffar felet? 3. Hur kan man rätta till felet? (ni får föreslå förändringar antingen i metoden summakalori eller i klasserna eller i både metoden och klasserna)
DVS SU/KTH 6 (6) OOP Uppgift 5 (6 poäng) Följande klasser finns: abstract class Frukt{ private int vikt; public int getvikt(){ return vikt; class Apelsin extends Frukt{ private int diameter; public int getdiameter(){ return diameter; class Banan extends Frukt{ private int längd; public int getlängd(){ return längd; Klasserna innehåller även lämpliga konstruktorer, ej relevanta för denna uppgift. Ni får (om ni så önskar) lägga till saker i klasserna ovan. Redovisa i så fall vad ni vill lägga till och var (i vilken/vilka klasser) ni vill lägga till det. Er uppgift är att skriva en metod som får en ArrayList<Frukt> som parameter. ArrayListan är fylld med blandade Apelsin- och Banan-objekt. Ni skall sedan ur den arraylistan ta bort den kortaste Bananen. Dvs det Banan-objekt vars metod getlängd returnerar det minsta värdet skall deletas från arraylistan. Ni kan förutsätta att det i parameter-listan finns minst en Banan så det finns alltså ett objekt som skall tas bort. Om det finns flera Banan-objekt som har samma (korta) längd kan vilket som helst av dessa tas bort.