Tentamen OOP 2015-03-14



Relevanta dokument
TENTAMEN OOP

TENTAMEN OOP

Grundläggande programmering med C# 7,5 högskolepoäng

OOP Objekt-orienterad programmering

Objektorienterad programmering D2

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

TENTAMEN OOP

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 1 & 2 INTRODUKTION

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

OOP Omtenta

SMD 134 Objektorienterad programmering

OOP Omtenta

Föreläsning 3-4 Innehåll

Programmeringsteknik med C och Matlab

OOP Tentamen

Lösningsförslag, tentamen FYTA11 Javaprogrammering

"if"-satsen. Inledande programmering med C# (1DV402)

Tentamen i Objektorienterad programmering

Tentamen, EDAA20/EDA501 Programmering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Chapter 3: Using Classes and Objects

Objektorienterad programmering i Java

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

F4. programmeringsteknik och Matlab

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

OOP Tenta

OOP Omtenta

Övningar Dag 2 En första klass

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

OOP Tentamen

trafiksimulering Intro OU5 trafiksimulering

Redovisning av inlämningsuppgifter

OOP Omtenta

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

OOP Objekt-orienterad programmering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Laboration 1 - Grunderna för OOP i Java

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

LÖSNINGSFÖRSLAG TENTAMEN

Tentamen, EDAA10 Programmering i Java

Programmering för språkteknologer II, HT2014. Rum

Objektsamlingar i Java

OOP Objekt-orienterad programmering

Tentamen. Grundläggande programmering i Java A 5p, DTAA

Programmering A. Johan Eliasson

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Föreläsning REPETITION & EXTENTA

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Java, klasser, objekt (Skansholm: Kapitel 2)

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

1 Funktioner och procedurell abstraktion

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Malmö högskola 2008/2009 CTS

Tentamen. Lösningsförslag

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Föreläsning 3. Iteration while-satsen

Tentamen , Introduktion till Java, dtaa98, dtea53

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Tentamen, EDA501 Programmering M L TM W K V

OOP Objekt-orienterad programmering

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Föreläsning 6: Introduktion av listor

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

PROGRAMMERING-Java TENTAMINA

OOP Objekt-orienterad programmering

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Att använda pekare i. C-kod

Tentamen ID1004 Objektorienterad programmering May 29, 2012

5 Grundläggande in- och utmatning

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Transkript:

Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning ska svaren ligga sorterade efter frågornas nummer, inte efter den ordning du besvarat dem. Betygsättning 1 Maxpoängen på tentan är 50. Fx Minst 20 poäng på tentan. Betyget kan också ges om man får minst 25 poäng, men missar att få minst 8 poäng sammanlagt på fråga 1 och 2. E Minst 8 poäng sammanlagt på fråga 1 och 2, samt minst 25 poäng totalt. D Minst 8 poäng sammanlagt på fråga 1 och 2, samt minst 30 poäng totalt. C Minst 8 poäng sammanlagt på fråga 1 och 2, minst 35 poäng totalt, samt ingen uppgift med 0 poäng. B Minst 40 poäng totalt, samt ingen uppgift med 0 poäng. A Minst 45 poäng totalt. Hjälpmedel Inga hjälpmedel förutom den syntaxsammanfattning som delas ut på tentan. Lycka till! Lösningsförslag läggs upp i Moodle senast tre arbetsdagar efter tentatillfället. 1 På tentan stod det 10 poäng istället för 8 som krav på fråga 1 & 2 vilket stämde med hur tentan ursprungligen var planerad. Detta ändrades under kursen. Denna betygsskala är ar alltså den som gäller vid rättningen.

Fråga 1 Flervalsfrågor (10 poäng) Denna fråga består av 10 delfrågor av flervalstyp liknande de som funnits i testen i Moodle. På varje delfråga kan noll, ett, eller flera alternativ vara korrekta. Varje delfråga ger 1 poäng om samtliga korrekta alternativ är markerade och 0 poäng om detta inte är uppfyllt. Till skillnad från testen i Moodle kan man alltså inte få delpoäng. A. Givet denna kod: String s1 = ABC ; String s2 = s1; s1 = null; Vad returnerar s2.length()? 1. null 2. 0 3. 3 4. Inget, programmet kraschar eftersom det kastas ett undantag B. Vilka av följande är legala returtyper för metoder i Java? 1. int 2. Integer 3. public 4. void C. Vilka av nedanstående programsatser skriver ut 1+2 på skärmen? 1. System.out.print("1+2"); 2. System.out.print(""+1+2); 3. System.out.print(""+(1+2)); 4. System.out.print(1+"+"+2); D. Vilken typ av fel hittar kompilatorn? 1. Fel som uppkommer under körning 2. Semantiska fel 3. Syntaktiska fel 4. Inga av ovanstående feltyper E. Vilka av nedanstående nonsensnamn är troligtvis namn på klasser? 1. hundsvans 2. Hundsvans 3. HundSvans 4. HUNDSVANS F. Vad blir resultatet av 18.0 / 5 i Java? 1. 3 (dvs. en int) 2. 3.0 (dvs. en double) 3. 3.6 (dvs. en double) 4. 4 (dvs. en int)

G. Vilka av nedanstående påståenden är sanna för konstruktorer i Java? 1. Det får finnas flera 2. Har returtypen void 3. Kan heta vad som helst 4. Kan ta parametrar H. Vilka av följande datatyper kan användas för att styra en switch-sats? 1. char 2. double 3. int 4. String I. Vilket värde har variabeln s efter att nedanstående kod körts? int s=0; for(int n=0; n<3; n++){ int m=n; while(m<3){ s++; m++; 1. 3 2. 4 3. 5 4. 6 J. Vilka av variablerna i nedanstående exempelklass kan man deklarera private? class Exempelklass { int a; static int b; void m(int c) { int d; 1. a 2. b 3. c 4. d

Fråga 2 Kodförståelse (10 poäng) Om man exekverar följande programrader, vad kommer 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. Delfråga A (5 poäng) int[] arr = { 2, 0, 3, 1 ; for (int i : arr) { System.out.print(arr[i]); if (i % 2 == 0) System.out.println(); Delfråga B (5 poäng) Cont c1 = new Cont(); c1.till('a'); Cont c2 = new Cont(); c2.till("b"); Cont c3 = new Cont(); c3.till('c'); System.out.println(c1.från()); System.out.println(c2.från()); System.out.println(c3.från()); class Cont { private String s1=""; private static String s2=""; public void till(char c) { s1 += c; public void till(string s) { s2 += s; public String från() { String s = s1 + s2; s1 = ""; s2 = ""; return s;

Fråga 3 (10 poäng) Idag är det Pi-dagen. Dagen firades första gången 1988, och är lite extra speciell just i år eftersom dagens datum kan skrivas 3/14/15 i det amerikanska datumformatet En dryg halvtimme innan tentan började var klockan dessutom 9:26:53 vilket ger oss sammanlagt nio korrekta decimaler av pi. I klassen Math finns en konstant som representerar pi med den största möjliga noggrannheten som en double ger möjlighet till, och självklart ska man använda denna konstant om man vill använda pi i ett javaprogram. Det finns dock många algoritmer för att beräkna närmevärden på pi, och då är det ju bra om man också kan kontrollera hur nära det uträknade värdet hamnar det bästa möjliga värdet. Din uppgift är därför att skriva en metod som tar ett argument: en double som representerar ett närmevärde på pi, och som returnerar ett heltal som representerar hur många decimaler som är korrekta jämfört med konstanten i Math. Om heltalsdelen av argumentet inte är 3 ska metoden alltid returnera 0. Argument Returvärde Kommentar 3.1415 4 Alla de angivna decimalerna stämmer 3.1215 1 Tvåan gör allt efteråt värdelöst 3.0 0 4.14 0 För att lösa denna uppgift behöver du en algoritm för jämförelsen av decimaldelen. Det finns flera sådana, och du får gärna använda din egen för att lösa uppgiften, men en enkel version är denna: 2 Konvertera argumentet och det korrekta värdet till två strängar. Jämför strängarna tecken för tecken, med början på det tredje tecknet. Tänk på att strängarna kan vara olika långa. Fråga 4 (10 poäng) En egenskap som skiljer en kejserlig kinesisk drake från andra kinesiska drakar är att den har fem tår på varje fot istället för det normala tre eller fyra. 3 Delfråga A (8 poäng) Skriv en klass som representerar en kinensisk drake. Varje drake har ett namn och, som tidigare nämnts, ett visst antal tår. När man skapar en ny instans av klassen måste man alltid ange antalet tår medan namnet är frivilligt. Om man inte anger ett namn, eller om namnet är tomt eller null, så ska namnet automatiskt sättas till "Nìmíng" vilket (enligt Google translate) betyder anonym. Antalet tår 2 Om du efter tentan testar din metod, eller testar lösningsförslagets version kommer du eventuellt att upptäcka att den ibland ger fel svar. Detta beror på att flyttal inte är speciellt exakta och kan ignoreras i uppgiften. En god grundregel är annars att aldrig lita på att två flyttal är lika om de inte har räknats fram på exakt samma sätt. 3 Jo, det fanns en fråga på tentan som gick 2013-08-08 som har ett visst överlapp med denna. Inledningen är hämtad rakt av därifrån.

kan inte vara lägre än tre eller högre än fem. Om någon av dessa regler bryts ska antalet sättas till tre eller fem respektive. Namnet på draken ska både kunna läsas av och ändras. I det senare fallet gäller samma regler som när man skapar ett nytt objekt. Antalet tår ska däremot bara kunna läsas av, inte ändras efter att draken har skapats. Det ska dessutom gå att skriva ut objekt av klassen på javas standardsätt. Det ingår i frågan att veta vad detta betyder. När man skriver ut ett objekt som representerar en kejserlig drake ska tecknet till höger skrivas ut innan namnet. Detta är en symbol med unicode-koden 2654, och skrivs i java så här: \u2654. Delfråga B (2 poäng) Rita upp ett komplett UML-diagram för klassen. Komplett betyder i detta sammanhang samma krav som för uml-diagrammet för hundklassen i inlämningsuppgift två. Fråga 5 (10 poäng) En ganska vanlig tjänst på receptsajter är möjligheten att skriva in ett antal ingredienser och få förslag på recept som innehåller dessa ingredienser. Din uppgift är nu att skriva ett program som frågar användaren efter namnet på ett godtyckligt antal ingredienser. Därefter ska programmet skriva ut namnet och ingredienslistan på alla recept som innehåller samtliga de ingredienser som användaren angav. Detta betyder inte att receptens ingredienslista måste matcha användarens lista exakt. Recepten som skrivs ut får innehålla fler ingredienser än de som användaren angett, det enda kravet är att samtliga angivna ingredienser ska finnas med. Programmet ska alltså fungera ungefär så här: Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Ägg Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Mjölk Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Salt Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Pannkakor Mjöl 2.5 Mjölk 6.0 Ägg 3.0 Smör 2.0 Salt 0.5 Laxpaj Pajdeg 1.0 Lax 250.0 Purjo 1.0 Ägg 3.0 Mjölk 1.0 Salt 0.5 (forts.)

Till hjälp med att lösa uppgiften har du nedanstående två klasser som som måste använda dig av i din lösning. Du kan lägga till och ändra kod i de givna klasserna, men får inte ändra på signaturen på de metoder och konstruktorer som redan finns. Recepten kan du anta finns i en variabel av typen ArrayList<Recept>. Du måste själv deklarera denna variabel på ett lämpligt ställe i ditt program och skapa en instans av ArrayList, men du behöver inte fylla listan med recept. Det ligger utanför uppgiften. Filen Recept.java import java.util.arraylist; public class Recept { private ArrayList<Ingrediens> ingredienser = new ArrayList<>(); public void läggtill(ingrediens i){ ingredienser.add(i); Filen Ingrediens.java public class Ingrediens { private String namn; private double mängd; public Ingrediens(String namn, double mängd){ this.namn=namn; this.mängd=mängd; public String namn(){ return namn; public double mängd(){ return mängd;

Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning ska svaren ligga sorterade efter frågornas nummer, inte efter den ordning du besvarat dem. Betygsättning 1 Maxpoängen på tentan är 50. Fx Minst 20 poäng på tentan. Betyget kan också ges om man får minst 25 poäng, men missar att få minst 8 poäng sammanlagt på fråga 1 och 2. E Minst 8 poäng sammanlagt på fråga 1 och 2, samt minst 25 poäng totalt. D Minst 8 poäng sammanlagt på fråga 1 och 2, samt minst 30 poäng totalt. C Minst 8 poäng sammanlagt på fråga 1 och 2, minst 35 poäng totalt, samt ingen uppgift med 0 poäng. B Minst 40 poäng totalt, samt ingen uppgift med 0 poäng. A Minst 45 poäng totalt. Hjälpmedel Inga hjälpmedel förutom den syntaxsammanfattning som delas ut på tentan. Lycka till! Lösningsförslag läggs upp i Moodle senast tre arbetsdagar efter tentatillfället. 1 På tentan stod det 10 poäng istället för 8 som krav på fråga 1 & 2 vilket stämde med hur tentan ursprungligen var planerad. Detta ändrades under kursen. Det är denna betygsskala som gäller vid rättningen.

Fråga 1 Flervalsfrågor (10 poäng) Denna fråga består av 10 delfrågor av flervalstyp liknande de som funnits i testen i Moodle. På varje delfråga kan noll, ett, eller flera alternativ vara korrekta. Varje delfråga ger 1 poäng om samtliga korrekta alternativ är markerade och 0 poäng om detta inte är uppfyllt. Till skillnad från testen i Moodle kan man alltså inte få delpoäng. A. Givet denna kod: String s1 = ABC ; String s2 = s1; s1 = null; Vad returnerar s2.length()? 1. null 2. 0 3. 3 4. Inget, programmet kraschar eftersom det kastas ett undantag B. Vilka av följande är legala returtyper för metoder i Java? 1. int 2. Integer 3. public 4. void C. Vilka av nedanstående programsatser skriver ut 1+2 på skärmen? 1. System.out.print("1+2"); 2. System.out.print(""+1+2); 12 3. System.out.print(""+(1+2)); 3 4. System.out.print(1+"+"+2); D. Vilken typ av fel hittar kompilatorn? 1. Fel som uppkommer under körning 2. Semantiska fel 3. Syntaktiska fel 4. Inga av ovanstående feltyper E. Vilka av nedanstående nonsensnamn är troligtvis namn på klasser? 1. hundsvans (variabel) 2. Hundsvans 3. HundSvans 4. HUNDSVANS (konstant) F. Vad blir resultatet av 18.0 / 5 i Java? 1. 3 (dvs. en int) 2. 3.0 (dvs. en double) 3. 3.6 (dvs. en double) Det räcker med att ett av talen är ett flyttal 4. 4 (dvs. en int)

G. Vilka av nedanstående påståenden är sanna för konstruktorer i Java? 1. Det får finnas flera 2. Har returtypen void Konstruktorer har ingen returtyp 3. Kan heta vad som helst Måste heta samma sak som klassen 4. Kan ta parametrar H. Vilka av följande datatyper kan användas för att styra en switch-sats? 1. char 2. double Ej uppräkningsbar 3. int 4. String I. Vilket värde har variabeln s efter att nedanstående kod körts? int s=0; for(int n=0; n<3; n++){ int m=n; while(m<3){ s++; m++; 1. 3 2. 4 3. 5 4. 6 Den yttre loopen går tre varv där n är 0, 1 och 2 respektive. Den inre loopen går 3-n varv, dvs 3, 2 och 1, för varje varv i den yttre. Eftersom s ökas med ett för varje varv i den inre loopen så blir s 6. 5. J. Vilka av variablerna i nedanstående exempelklass kan man deklarera private? class Exempelklass { int a; static int b; void m(int c) { int d; 1. a 2. b 3. c 4. d

Fråga 2 Kodförståelse (10 poäng) Om man exekverar följande programrader, vad kommer 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. Delfråga A (5 poäng) int[] arr = { 2, 0, 3, 1 ; for (int i : arr) { System.out.print(arr[i]); if (i % 2 == 0) System.out.println(); Svar 3 2 10 Förklaring Loopen går sammanlagt fyra varv där i sätts till 2, 0, 3 och 1 respektive. Dessa värden används för två saker: 1. Index vid utskriften, trean skrivs till exempel ut först eftersom den finns på index 2. 2. För att bestämma radbrytningarna. 2 och 0 är bägge jämna tal, och då blir i%2 0.

Delfråga B (5 poäng) Cont c1 = new Cont(); c1.till('a'); Cont c2 = new Cont(); c2.till("b"); Cont c3 = new Cont(); c3.till('c'); System.out.println(c1.från()); System.out.println(c2.från()); System.out.println(c3.från()); class Cont { private String s1=""; private static String s2=""; public void till(char c) { s1 += c; public void till(string s) { s2 += s; public String från() { String s = s1 + s2; s1 = ""; s2 = ""; return s; Svar AB C Förklaring Det skapas totalt tre objekt av klassen. Eftersom klassen saknar konstruktor så används defaultkonstruktorn i samtliga fall. Denna sätter s1 till tomma strängen, men gör inget med s2 eftersom det är en statisk variabel som inte har något med instanserna att göra. Det seplar alltså ingen roll om anropen på till kommer direkt efter skapandet av objekten som här, eller om vi hade samlat ihop dem i en grupp efter att vi skapat objekten, resultatet hade blivit samma. till, som i en riktig klass nästan säkert hade varit en konstruktor istället, finns i två överlagrade versioner. Den ena tar en char, ett enskilt tecken, som den lägger till det nuvarande värdet på s1, dvs på instansvariabeln. Eftersom vi aldrig anropar till mer än en gång på samma objekt betyder detta att c1.s1 blir A och c3.s1 blir C. Den andra versionen av till tar in en sträng och lägger till den till s2, den statiska variabeln. Eftersom variabeln är statisk så är den gemensam för alla instanser vilket förklarar varför AB returneras första gången vi anropar metoden från. Metoden nollställer också såväl s1 som s2, där den sistnämnda påverkar alla objekt, vilket förklarar att B inte returneras i de bägge andra anropen.

Fråga 3 (10 poäng) Idag är det Pi-dagen. Dagen firades första gången 1988, och är lite extra speciell just i år eftersom dagens datum kan skrivas 3/14/15 i det amerikanska datumformatet En dryg halvtimme innan tentan började var klockan dessutom 9:26:53 vilket ger oss sammanlagt nio korrekta decimaler av pi. I klassen Math finns en konstant som representerar pi med den största möjliga noggrannheten som en double ger möjlighet till, och självklart ska man använda denna konstant om man vill använda pi i ett javaprogram. Det finns dock många algoritmer för att beräkna närmevärden på pi, och då är det ju bra om man också kan kontrollera hur nära det uträknade värdet hamnar det bästa möjliga värdet. Din uppgift är därför att skriva en metod som tar ett argument: en double som representerar ett närmevärde på pi, och som returnerar ett heltal som representerar hur många decimaler som är korrekta jämfört med konstanten i Math. Om heltalsdelen av argumentet inte är 3 ska metoden alltid returnera 0. Argument Returvärde Kommentar 3.1415 4 Alla de angivna decimalerna stämmer 3.1215 1 Tvåan gör allt efteråt värdelöst 3.0 0 4.14 0 För att lösa denna uppgift behöver du en algoritm för jämförelsen av decimaldelen. Det finns flera sådana, och du får gärna använda din egen för att lösa uppgiften, men en enkel version är denna: 2 Konvertera argumentet och det korrekta värdet till två strängar. Jämför strängarna tecken för tecken, med början på det tredje tecknet. Tänk på att strängarna kan vara olika långa. 2 Om du efter tentan testar din metod, eller testar lösningsförslagets version kommer du eventuellt att upptäcka att den ibland ger fel svar. Detta beror på att flyttal inte är speciellt exakta och kan ignoreras i uppgiften. En god grundregel är annars att aldrig lita på att två flyttal är lika om de inte har räknats fram på exakt samma sätt.

Lösningsförslag public static int numberofcorrectdecimalsofpi(double pi) { // Vi måste börja med att kontrollera heltalsdelen. Om vi inte gör det // så skulle denna metod annars göra fel om vi tex skickade in 881415. if (((int) pi)!= 3) return 0; String correct = "" + Math.PI; String argument = "" + pi; int index = 2; while (index < correct.length() && index < argument.length() && correct.charat(index) == argument.charat(index)) { index++; // När vi kommer hit innehåller index hur många tecken som var lika från // strängarnas början. Från detta tal måste vi dra 2 eftersom vi inte är // intresserade av heltalsdelen, bara decimalerna. return index - 2; // Ovanstående fungerar eftersom vi redan kontrollerat heltalsdelen. // Annars skulle det funnits en risk att vi kunde få ett negativt svar. Fråga 4 (10 poäng) En egenskap som skiljer en kejserlig kinesisk drake från andra kinesiska drakar är att den har fem tår på varje fot istället för det normala tre eller fyra. 3 Delfråga A (8 poäng) Skriv en klass som representerar en kinensisk drake. Varje drake har ett namn och, som tidigare nämnts, ett visst antal tår. När man skapar en ny instans av klassen måste man alltid ange antalet tår medan namnet är frivilligt. Om man inte anger ett namn, eller om namnet är tomt eller null, så ska namnet automatiskt sättas till "Nìmíng" vilket (enligt Google translate) betyder anonym. Antalet tår kan inte vara lägre än tre eller högre än fem. Om någon av dessa regler bryts ska antalet sättas till tre eller fem respektive. Namnet på draken ska både kunna läsas av och ändras. I det senare fallet gäller samma regler som när man skapar ett nytt objekt. Antalet tår ska däremot bara kunna läsas av, inte ändras efter att draken har skapats. Det ska dessutom gå att skriva ut objekt av klassen på javas standardsätt. Det ingår i frågan att veta vad detta betyder. När man skriver ut ett objekt som representerar en kejserlig drake ska tecknet till höger skrivas ut innan namnet. Detta är en symbol med unicode-koden 2654, och skrivs i java så här:. 3 Jo, det fanns en fråga på tentan som gick 2013-08-08 som har ett visst överlapp med denna. Inledningen är hämtad rakt av därifrån.

Delfråga B (2 poäng) Rita upp ett komplett UML-diagram för klassen. Komplett betyder i detta sammanhang samma krav som för uml-diagrammet för hundklassen i inlämningsuppgift två. Lösningsförslag public class Drake { private static final String ANONYM = "Nìmíng"; private static final int MIN_TÅR = 3; private static final int MAX_TÅR = 5; private String namn; private int tår; public Drake(int tår) { this(anonym, tår); public Drake(String namn, int tår) { // Eftersom samma kontroller ska göras här som när man senare ändrar ett // namn, och en metod inte kan anropa en konstruktor annat än för att // skapa ett nytt objekt, så delegerar vi arbetet med att kontroller // namnet till set-metoden. ändranamn(namn); if (tår < MIN_TÅR) { this.tår = MIN_TÅR; else if (tår > MAX_TÅR) { this.tår = MAX_TÅR; else { this.tår = tår; public String namn() { return namn; public void ändranamn(string namn) { if (namn == null namn.isempty()) { this.namn = ANONYM; else { this.namn = namn; public int tår() { return tår; public boolean ärkejserlig() { return tår == 5;

public String tostring() { if (ärkejserlig()) { return "\u2654 " + namn + " " + tår; else { return namn + " " + tår; // Alternativ version av ovanstående som använder?: istället för en if-sats // public String tostring() { // return (ärkejserlig()? "\u2654 " : "") + namn + " " + tår; // Fråga 5 (10 poäng) En ganska vanlig tjänst på receptsajter är möjligheten att skriva in ett antal ingredienser och få förslag på recept som innehåller dessa ingredienser. Din uppgift är nu att skriva ett program som frågar användaren efter namnet på ett godtyckligt antal ingredienser. Därefter ska programmet skriva ut namnet och ingredienslistan på alla recept som innehåller samtliga de ingredienser som användaren angav. Detta betyder inte att receptens ingredienslista måste matcha användarens lista exakt. Recepten som skrivs ut får innehålla fler ingredienser än de som användaren angett, det enda kravet är att samtliga angivna ingredienser ska finnas med. Programmet ska alltså fungera ungefär så här: Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Ägg Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Mjölk Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Salt Vilken ingrediens måste vara med? (Avsluta genom att trycka return) Pannkakor Mjöl 2.5 Mjölk 6.0 Ägg 3.0 Smör 2.0 Salt 0.5 Laxpaj Pajdeg 1.0 Lax 250.0 Purjo 1.0 Ägg 3.0 Mjölk 1.0 Salt 0.5 (forts.) Till hjälp med att lösa uppgiften har du nedanstående två klasser som som måste använda dig av i din lösning. Du kan lägga till och ändra kod i de givna klasserna, men får inte ändra på signaturen på de metoder och konstruktorer som redan finns.

Recepten kan du anta finns i en variabel av typen ArrayList<Recept>. Du måste själv deklarera denna variabel på ett lämpligt ställe i ditt program och skapa en instans av ArrayList, men du behöver inte fylla listan med recept. Det ligger utanför uppgiften. Filen Recept.java import java.util.arraylist; public class Recept { private ArrayList<Ingrediens> ingredienser = new ArrayList<>(); public void läggtill(ingrediens i){ ingredienser.add(i); Filen Ingrediens.java public class Ingrediens { private String namn; private double mängd; public Ingrediens(String namn, double mängd){ this.namn=namn; this.mängd=mängd; public String namn(){ return namn; public double mängd(){ return mängd;

Lösningsförslag // Bara tostring tillagt public class Ingrediens { private String namn; private double mängd; public Ingrediens(String namn, double mängd){ this.namn=namn; this.mängd=mängd; public String namn(){ return namn; public double mängd(){ return mängd; public String tostring() { return namn+"\t"+mängd; // Här har många saker lagts till. Det som fanns från början är dock // oförändrat. import java.util.arraylist; public class Recept { private String namn; private ArrayList<Ingrediens> ingredienser = new ArrayList<>(); public Recept(String namn) { this.namn = namn; public String namn() { return namn; public void läggtill(ingrediens i) { ingredienser.add(i); public boolean innehåller(string ingrediens) { for (Ingrediens i : ingredienser) { if (i.namn().equals(ingrediens)) { return true; return false; public boolean innehålleralla(arraylist<string> ingredienskrav) {

for (String ingrediens : ingredienskrav) { if (!innehåller(ingrediens)) { return false; return true; public String tostring() { String s = namn + "\n"; for (Ingrediens i : ingredienser) { s += i+"\n"; return s; // Själva programmet import java.util.arraylist; import java.util.scanner; public class Receptlista { private static ArrayList<Recept> receptlista = new ArrayList<>(); private static Scanner tangentbord = new Scanner(System.in); // Denna metod ingår inte i uppgiften, men är nödvändig för att kunna // testköra private static void läsrecept() { Recept pannkakor = new Recept("Pannkakor"); pannkakor.läggtill(new Ingrediens("Mjöl", 2.5)); pannkakor.läggtill(new Ingrediens("Mjölk", 6)); pannkakor.läggtill(new Ingrediens("Ägg", 3)); pannkakor.läggtill(new Ingrediens("Smör", 2)); pannkakor.läggtill(new Ingrediens("Salt", 0.5)); receptlista.add(pannkakor); Recept paj = new Recept("Laxpaj"); paj.läggtill(new Ingrediens("Pajdeg", 1)); paj.läggtill(new Ingrediens("Lax", 250)); paj.läggtill(new Ingrediens("Purjo", 1)); paj.läggtill(new Ingrediens("Ägg", 3)); paj.läggtill(new Ingrediens("Mjölk", 1)); paj.läggtill(new Ingrediens("Salt", 0.5)); receptlista.add(paj); private static ArrayList<String> läskrävdaingredienser() { ArrayList<String> ingredienser = new ArrayList<>(); String ingrediens ; do{ System.out.println("Vilken ingrediens måste vara med? (Avsluta genom att trycka return)"); ingrediens= tangentbord.nextline();

if(!ingrediens.isempty()){ ingredienser.add(ingrediens); while(!ingrediens.isempty()); return ingredienser; private static void skrivutmatchangerecept(arraylist<string> ingredienskrav){ for(recept recept: receptlista){ if(recept.innehålleralla(ingredienskrav)){ System.out.println(recept); public static void main(string[] args) { läsrecept(); skrivutmatchangerecept(läskrävdaingredienser());