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.

Relevanta dokument
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.

Tentamen i Programmeringsteknik I

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

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

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

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

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

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

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

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

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

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

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

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

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

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

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

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

Tentamen i Programmeringsteknik I

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

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

Tentamen i Programmeringsteknik I, ES,

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

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

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

Tentamen i Programmeringsteknik I,, KandMa/Fy,

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Del A (obligatorisk för alla)

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

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

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.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen i Programmeringsteknik I

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

DAT043 Objektorienterad Programmering

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Del A (obligatorisk för alla)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen i Grundläggande programmering STS, åk 1 fredag

Del A (obligatorisk för alla)

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Malmö högskola 2007/2008 Teknik och samhälle

Föreläsning 3-4 Innehåll

TDDD78 Viktiga begrepp, del 2

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Malmö högskola 2007/2008 Teknik och samhälle

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

LyckaTill önskar Anna

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

TENTAMEN OOP

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

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

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Föreläsnings 9 - Exceptions, I/O

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Tentamen FYTA11 Javaprogrammering

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

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

Exempel på användning av arv: Geometriska figurer

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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.

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

Objektorienterad programmering i Java

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

2 b) Följande finns definierat: import java.awt.*; public class Uppgift1b public static void main(string[] mupp) Color färg = Color.blue; Bil[] bilar

Malmö högskola 2008/2009 CTS

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

Tentamen i Programmering

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tentamen, EDAA20/EDA501 Programmering

Föreläsning 14. Filhantering

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Transkript:

Tentamen Programmeringsteknik I 2015-01-10 Skrivtid: 8.00 13.00 Hjälpmedel: Java-bok Detta är ett lösningsförslag till tentamen. Lösningarna är inklistrade i rutor vid respektive fråga i detta dokument. 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. Skriv läsligt! Använd inte rödpenna! Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer och tentamens-kod (eller namn om du saknar sådan) på alla papper. Skriv inte längst upp i vänstra hörnet - det går inte att läsa där efter sammanhäftning. Fyll i försättssidan fullständigt. Det är principer och ideér som är viktiga. Skriv så att du övertygar examinator om att du har förstått dessa även om detaljer kan vara felaktiga. Alla uppgifter gäller programmeringsspråket Java och programkod skall skrivas i Java. Koden skall vara läslig dvs den skall vara vettigt strukturerad och indenterad. Namn på variabler, metoder, klasser etc skall vara beskrivande men kan ändå hållas ganska korta. Observera att poängavdrag bland annat kan göras för icke-privata instansvariabler, dålig läslighet, upprepning av identisk kod och underlåtenhet att utnyttja given eller egen tidigare skriven metod Det är totalt 30 poäng på skrivningen. Betygsgränser: 16 räcker säkert till 3, 22 säkert till 4, 27 säkert till 5. Lycka till! Torsten Andersson och Tom Smedsaas 1

Uppgift 1 Nedanstående, inte helt korrekta, klass skall representera en cirkel. När main metoden körs är det meningen att utskriften ska se ut på följande sätt: x=0.0, y=0.0, r=0.5 x=0.0, y=0.0, r=1.0 3.141592653589793 a) När man kompilerar klassen fås följande meddelande: 2 errors found: File: Circle.java [line: 9] Error: Circle.java:9: possible loss of precision found : double required: int File: Circle.java [line: 19] Error: Circle.java:19: incompatible types found : void required: double Vad är det som är fel? Vad skall det stå? Vad som är fel: Satsen på rad 9 returnerar ett double värde, men enligt sats 8 är metodens returtyp int. På rad 19 anropas en void metod som den vore en metod som returnerar något (double). Vad som kan stå: Rad 9 ändras till: public double area () Rad 19 ändras till: c.scale(2.0); (1p) 2

b) När dessa kompileringsfel rättats ger en körning följande utskrifter: Circle@11fb24d3 Circle@11fb24d3 3.141592653589793 Förklara resultatet. Ändra klassen så att utskriften blir som förväntat (mainmetoden får dock inte ändras). (2p) Vid en utskrift av Circle objekt kommer en tostring metod att anropas. Eftersom det saknas en tostring metod i klassen Circle kommer en tostring metod i klassen Object att användas och den orsakar den utskrift som visas. Med följande tostring metoden i klassen Circle kommer utskriften bli som önskas: return "x="+this.x + ", y="+this.y + ", r="+this.r; c) Skriv metoden collide som returnerar true om två cirklar kolliderar med varandra, annars false. Två cirklar anses kollidera om avståndet mellan deras centrumpunkter är mindre än summan av deras radier. Exempel på anrop (givet att c2 och c är Circle objekt): if (c2.collide(c)) { System.out.println("Kollision" ); (3p) public boolean collide(circle c) { double dx = this.x - c.x; double dy = this.y- c.y; double d = Math.sqrt(dx*dx + dy*dy); return d <= this.r + c.r; Uppgift 2 Givet är följande klass: public class Book { private String isbn; // Bokens identitet private int number; // Antal exemplar av boken private double price; // Bokens pris public Book(String isbn, int number, double price) { this.isbn = isbn; this.number = number; this.price = price; // b-uppgiften return "["+this.isbn+","+this.number+","+this.price+"]"; public static void main (String[] arg) { // Boktitel med identiteten 999-91-7000-150-5, antal ex 10, priset 500 kr Book b = new Book("999-91-7000-150-5",10,500.00); System.out.println(b); for (int i=1; i<=3; i++) { if (b.buy(4)) { // Önskar köpa fyra exemplar av boken System.out.println("Köpet genomfört: " + b); 3

else { System.out.println("Köpet gick ej att genomföra: " + b); // main // Slut klassen Book Metoden buy i klassen Book saknas dock för att mainmetoden skall fungera. Metoden skall hantera ett köp av ett antal exemplar av den aktuella boken, om köpet går att genomföra. a) Skriv den saknade metoden buy så att när man kör mainmetoden får följande resultatutskrift: [999-91-7000-150-5,10,500.0] Köpet genomfört: [999-91-7000-150-5,6,500.0] Köpet genomfört: [999-91-7000-150-5,2,500.0] Köpet gick ej att genomföra: [999-91-7000-150-5,2,500.0] (3p) public boolean buy(int n) { if (this.number<n) { return false; this.number=this.number-n; return true; b) Om satsen this.price = price; ändras till price = price; Vad blir resultatutskriften av mainmetoden i det fallet? Motivera svaret. (1p) Instansvariabeln price kommer därmed inte att tilldelas något värde i konstruktorn, dvs den kommer att ha sitt initiala värde som är 0.0. Detta betyder att Book objekt kommer få ett pris på noll kronor. Resultatutskriften blir identisk som den visade, förutom att värdet 500.0 ersätts med 0.0. Uppgift 3 Givet är följande: public class BookStore { private String name; private Book[] books; private int numberofbooktitles; public BookStore(String name, int n) { this.name = name; this.books = new Book[n]; this.numberofbooktitles=0; String s=this.name + ":"; for (int i=0; i<this.numberofbooktitles; i++) { s = s + this.books[i]; 4

return s; public static void main(string[] arg) { BookStore bs = new BookStore("Bokhandeln",20); // Bok med identiteten 999-91-7000-150-5, antal ex 14, priset 500 kr Book b = new Book("999-91-7000-150-5",14,500.00); bs.addbook(b); System.out.println(bs); // Bok med identiteten 888-88-7000-150-7, antal ex 5, priset 400 kr b = new Book("888-88-7000-150-7",5,400.00); bs.addbook(b); System.out.println(bs); // Prisändring -10% (dvs prissänkning) double pricechange = -10.0; bs.changeprices(pricechange) System.out.println("Prisändring " + pricechange + "%"); System.out.println(bs); // Slut klassen BookStore Skriv de båda metoderna addbook och changeprices som saknas i klassen BookStore. Metoden addbook skall lägga till en ny bok i affären. Metoden changeprices skall göra en prisändring av alla böcker. Prisändringen anges med ett procenttal. Om du tycker att det saknas en eller flera metoder i klassen klassen Book för att kunna lösa denna uppgift, så skriv i så fall även dessa metoder. Resultatet skall bli följande när man kör mainmetoden ovan: Bokhandeln:[999-91-7000-150-5,14,500.0] Bokhandeln:[999-91-7000-150-5,14,500.0][888-88-7000-150-7,5,400.0] Prisändring -10.0% Bokhandeln:[999-91-7000-150-5,14,450.0][888-88-7000-150-7,5,360.0] public void addbook(book b) { if (this.numberofbooktitles<this.books.length) { this.books[this.numberofbooktitles]=b; this.numberofbooktitles++; (9p) public void changeprices(double pricechange) { for (int i=0; i<this.numberofbooktitles; i++) { double price = this.books[i].getprice(); this.books[i].setprice( price*(1+pricechange/100.0)), Metoden changeprices behöver kunna ändra priset på en bok. Det kan lösas med två metoder I klassen Book, nämligen getprice och setprice: public double getprice() { return this.price; public void setprice(double newprice) { this.price=newprice; Alternativt med bara EN metod changeprice: public void changeprice(double pricechange) { this.price=(1+pricechange)*this.price; 5

Uppgift 4 Antag att en individ har en identitet och ett antal egenskapsvärden, där varje sådant egenskapsvärde är ett heltal 0 9. Om vi har två individer kan vi beräkna hur bra dessa båda individer matchar med varandra med avseende på egenskapsvärdena. Ett exempel: En individ A har följande egenskapsvärden: 9, 0, 0, 2, 3. En individ B har följande egenskapsvärden: 9, 0, 0, 1, 6. Matchningen beräknas genom att man summerar alla kvadrater på skillnaderna mellan värdena för individerna. En matchning mellan individ A och B ger matchningsvärdet 10 eftersom: (9 9) 2 + (0 0) 2 + (0 0) 2 + (2 1) 2 + (3 6) 2 = 1+9=10 Givet är följande skal till en klass Individ som representerar en individ som har en identitet och ett antal egenskapsvärden. public class Individ { public Individ(String ident, int[] values) { this.id=ident; this.featurevalues = new int[values.length]; for (int i=0; i<values.length; i++) { this.featurevalues[i]=values[i]; String s = ""; for (int i=0; i<this.featurevalues.length; i++) { s = s + this.featurevalues[i] + " "; return "<" + this.id + " " + s + ">"; public static void main (String[] arg) { int [] featurevaluesa = {9,0,0,2,3; int [] featurevaluesb = {9,0,0,1,6; Individ inda = new Individ("A",featureValuesA); Individ indb = new Individ("B",featureValuesB); System.out.println(indA); System.out.println(indB); int match = inda.matchingvalue(indb); System.out.println("Matchningsvärdet är " + match); a) Skriv de instansvariabler som saknas (1p) private String id; private int[] featurevalues; b) Metoden matchingvalue saknas. Skriv den metoden så att den passar mainmetoden och när den körs skall resultera i följande utskrifter: <A 9 0 0 2 3 > <B 9 0 0 1 6 > Matchningvärdet är 10 (4p) 6

public int matchingvalue(individ annan) { int sum=0; for (int i=0; i<this.featurevalues.length; i++) { sum = sum + (int) (Math.pow( this.featurevalues[i]-annan.featurevalues[i], 2)); return sum; c) Är det grundkopiering eller djupkopiering som utförs i konstruktorn i klassen Individ? Svaret måste motiveras. (1p) Det är djupkopiering. Motivering: Satsen this.featurevalues = new int[values.length]; skapar en array och elementen i arrayen values kopieras därefter till arrayen this.featurevalues. Om det hade varit frågan om grundkopiering hade konstruktorn bara bestått av en sats så här: this.featurevalues = values; Därmed refererar de båda arrayerna till samma array. Uppgift 5 Föregående uppgift handlade om att matcha invidividers egenskaper. Antag att individernas data finns i textfilen individdata.txt. Filen kan se ut så här: kim.nilsson@pollax.se 5 1 3 1 8 fia.jonsson@pollax.se 4 6 4 5 3 bill.ek@pollax.se 2 9 8 9 9 ida.lonn@pollax.se 5 7 3 8 2 my.ehn@pollax.se 3 9 1 1 4 bo.gran@pollax.se 9 1 3 5 6 eva.ronn@pollax.se 3 3 0 5 3 dan.lind@pollax.se 8 8 7 9 1 Varje rad i filen består av data för en individ, först på raden finns identiteten, därefter följer fem egenskapsvärden. Filen kan bestå av ett godtyckligt antal individer. Följande program utför en matchning av individerna, alla mot alla, som finns i filen individdata.txt: import java.io.*; public class Matching { public static void main (String[] arg ) throws IOException { Group g = new Group("individdata.txt"); Individ[] best = g.bestmatch(); System.out.println("Bästa match:" + best[0] + " och " + best[1]); System.out.println("Antal individer: " + g.getantal() ); System.out.println(g); // main // Matching Om man kör mainmetoden fås följande resultat: 7

Antal individer: 8 <kim.nilsson@pollax.se 5 1 3 1 8 > <fia.jonsson@pollax.se 4 6 4 5 3 > <bill.ek@pollax.se 2 9 8 9 9 > <ida.lonn@pollax.se 5 7 3 8 2 > <my.ehn@pollax.se 3 9 1 1 4 > <bo.gran@pollax.se 9 1 3 5 6 > <eva.ronn@pollax.se 3 3 0 5 3 > <dan.lind@pollax.se 8 8 7 9 1 > Bästa match:<fia.jonsson@pollax.se 4 6 4 5 3 > och <ida.lonn@pollax.se 5 7 3 8 2 > Programmet jämför alla par av individer och beräknar det par som matchar bäst, dvs har det lägsta matchningsvärdet (se föregående uppgift). Mainmetoden använder sig av klassen Group som finns på nästa sida, där uppgiften fortsätter. Givet är följande skal till klassen Group: import java.util.*; import java.io.*; public class Group { private ArrayList<Individ> individlist; public Group (String filnamn) throws IOException { this.individlist = new ArrayList<Individ>(); File input = new File(filnamn); if (!input.exists()) { System.out.println("Filen '" + filnamn + "' existerar ej"); return; Scanner fsc = new Scanner(input); String id; int [] eg = new int[5]; while (fsc.hasnextline() ) { id = fsc.next(); for (int i=0; i<5; i++) { eg[i]=fsc.nextint(); Individ ind = new Individ(id,eg); this.individlist.add(ind); fsc.close(); public int getantal() { return this.individlist.size(); String s =""; for (int i=0;i<this.individlist.size();i++) { s = s + this.individlist.get(i) + "\n"; return s; // Metoden bestmatch saknas //... // Group 8

Skriv metoden bestmatch som saknas i klassen Group. Metoden skall beräkna det par av individer som matchar bäst. Antag att det ej finns fler än ett sådant par. Metoden skall passa mainmetoden i klassen Matching och så att resultatutskrifterna blir som i körexemplet på föregående sida. (5p) Metoden skall returnera en Individ array public Individ[] bestmatch() { // Skapa en array för resultatet Individ [] best = new Individ[2]; int index1=-1, index2=-1, m, min=10000000; // En dubbelloop för att beräkna alla kombinationer av individer // i = 0.. (antal individer minus ett) for (int i=0; i<this.individlist.size()-1; i++) { // j = i+1.. (antal individer) for (int j=i+1; j<this.individlist.size(); j++) { // Beräkna matchvärde mellan i och j m = this.individlist.get(i).matchingvalue( this.individlist.get(j)); // Om detta värde är lägre än det lägsta if (m<min) { index1=i; // "Bästa" paret av individer index2=j; min=m; // j-loopen // i-loopen best[0]=this.individlist.get(index1); best[1]=this.individlist.get(index2); return best; 9