Stockholms universitet 1 (6) OOP OOP Omtenta 2011-03-05 10.00 15.00 Avser kurserna: DSK1:OOP GES:OOP ID1013 Anvisningar 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.
Stockholms universitet 2 (6) OOP Uppgift 1 (6 poäng) Om man exekverar följande programrader, vad kommer att att skrivas ut på skärmen (var noga med vad som skrivs på vilken rad, alltså beakta skillnaden mellan print och println). A B C String s1="solen", s2="månen"; int tal=5; switch (tal+2){ case 5: System.out.println(s1+tal++); case 6: System.out.println(s2+tal++); case 7: System.out.println(s1+tal++); case 8: System.out.println(s2+tal++); default: System.out.println(s1+s2); int x=18, y=2; while (x>y){ System.out.println(x+y); x-=y; for (int z=10; z<x; z++) System.out.print(z+" "); System.out.println(y++); int[]talen=new int[8]; int a=11; for (int x=0; x<talen.length; x++){ talen[x]=a--; if (x==a) a=8; for (int tal : talen){ System.out.println(tal); if (tal==a) System.out.println(tal+a);
Stockholms universitet 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 Uppgift2, startas alltså med: java Uppgift2 class Uppgift2{ public static void main(string[]args){ Topp[]alla=new Topp[4]; alla[0]=new Ner("Sallad"); alla[1]=new Botten(); alla[2]=new Ner("Gurka"); alla[3]=new Botten(); for (int x=0; x<alla.length; x++) alla[x].skriv(); class Topp{ private static int antal=0; private String ord; public Topp(String ord){ this.ord=ord; antal++; public Topp(){ this("morot"); public void skriv(){ for (int x=0; x<antal; x++) System.out.print(getOrd()); System.out.println(); public String getord(){ return ord; class Ner extends Topp{ public Ner(String ord){ super(ord); public void skriv(){ System.out.println("Tomat"+getOrd()); class Botten extends Topp{ public String getord(){ return "Paprika";
Stockholms universitet 4 (6) OOP Uppgift 3 (6 poäng) När man beräknar medelvärde kan det ibland bli konstiga resultat pga att ett extremt stort eller extremt litet värde påverkar orimligt mycket. Anta t.ex. att tio personer köper vars en lott. En person vinner 10 miljoner kronor, de övriga nio vinner ingenting dvs 0 kronor. I genomsnitt har nu dessa personer vunnit 1 miljon kronor vilket kanske inte riktigt speglar verkligheten. Eller säg att vi tar 100 anställda på IKEA. Chefen tjänar 10.000.000.000 kronor och de övriga 99 tjänar 25.000 kronor vardera. I genomsnitt skulle då en anställd på IKEA tjäna 100.024.750 kronor... Ett sätt att komma tillrätta med problemet är att vid uträkningen av medel ta bort det största och det minsta värdet och ta medel på resten. Då riskerar man inte att ett extremvärde påverkar alldeles för mycket. Er uppgift är att skriva en metod medelspecial som får en int-array som argument och som beräknar medelvärdet av talen i arrayen, men utan att det största och det minsta värdet tas med i beräkningen. Ni kan förutsätta att arrayen som kommer till er metod som argument är fylld med värden och att den innehåller minst 3 värden (så att man alltså alltid kan ta bort det största och det minsta värdet innan beräkningen). Metoden skall returnera det uträknade medelvärdet. Om följande tal finns i arrayen: 12 200 300 175000 400 så skulle medelvärdet från er metod bli 300. Man tar alltså bort det minsta (12) och det största (175000) och beräknar medelvärdet på de resterande talen (200 300 400). I java ligger alla metoder inuti en klass, det kan ni bortse ifrån i denna uppgift, det räcker att skriva själva metoden. Arrayen som kommer som argument kan vara av olika längd och ni kan förutsätta att den alltid innehåller minst tre värden.
Stockholms universitet 5 (6) OOP Uppgift 4 (6 poäng) När man behöver handla en viss vara kan det ibland vara bra att jämföra olika affärers priser för att kunna hitta den billigaste varan. Skriv ett litet Java-program där en användare får möjlighet att mata in varor, dessa varors pris samt i vilken affär varan kan köpas. För varje vara som skall matas in ställs frågorna: Pris? 28000 Affär? TV-specialisten Programmet skall tillåta inmatning av nya varor tills användaren på frågan om vara svarar STOPP. Programmet skall sedan skriva ut varunamn, pris och affär för den billigaste varan av varje sort. Dialogen i ert program skulle kunna se ut så här: Pris? 28000 Affär? TV-specialisten Vara? Soffa Pris? 3000 Affär? Soffhörnet Pris? 14500 Affär? TV-grossen Pris? 21300 Affär? Prylaffären Vara? Soffa Pris? 2500 Affär? Möbelspecialisten Vara? STOPP Följande varor är billigast: TV 50 tum 14500 TV-grossen Soffa 2500 Möbelspecialisten
Stockholms universitet 6 (6) OOP Uppgift 5 (6 poäng) Följande klasser finns: abstract class Djur{ private String namn; private int ålder; public int getålder(){ return ålder; public String getnamn(){ return namn; class Hund extends Djur{ private int vikt; public int getsvans(){ return vikt*getålder()/10; class Katt extends Djur{ private int lathet; public int getlathet(){ return lathet; 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 i vilken klass ni vill lägga till det. Er uppgift är att skriva en metod som får en ArrayList<Djur> (fylld med blandade Hund- och Katt-objekt) som argument. I metoden skall ni skriva ut namn på den Katt som har störst lathet (det Katt-objekt vars metod getlathet returnerar störst värde). Om det finns flera Katt-objekt med samma (lika stor) lathet skall alla dessa skrivas ut, om det i argument-samlingen inte finns några Katt-objekt skall texten Inga Katter skrivas. OBS metoden som ni skriver måste ju i Java ligga inuti någon klass. Det kan ni ignorera i denna uppgift, det räcker alltså med själva metoden. Utskrifterna som görs skall göras i terminalfönstret (alltså med hjälp av System.out).