UMEÅ UNIVERSITET Datavetenskap 080319 DELPROV2 Objektorienterad programmeringsmetodik (för ÖI), 7.5p 5DV081, 5DV090 Datum : 080319 Skrivtid : 4 timmar (start ca 8:15 alt ca 13:00) Hjälpmedel : Allt. Kommunikation med andra personer (direkt eller indirekt) är dock inte tillåten, som t ex via mail, mobiltelefon, gemensamma kataloger etc. Antal uppgifter : 4 Totalpoäng : 32 (halva poängtalet av Delprov1+Delprov2 krävs normalt för godkänt) Kryssa för de uppgifter du lämnar in på försättsbladet. Tankegången skall vara lätt att följa. Alla antaganden som inte är uppenbara skall redovisas. Namn, personnummer, användarnamn och sökvägen till filen/filerna skall finnas på all källkod som skrivs ut. Källkod skrivs ut i ett ickeproportionellt typsnitt (t.ex. courier). Tips! Försök lösa alla uppgifter! Observera att uppgifterna inte är ordnade efter svårighetsgrad. Det är ditt ansvar att övertyga om att du besitter den kunskap som efterfrågas. Uppgifter kan vara felformulerade, fråga om du är osäker eller tycker att något verkar konstigt. Redovisa dina resonemang så är det lättare att bortse från skrivfel. Det är viktigt att du löser den givna uppgiften! OBS! Kontrollera att din dator fungerar innan du börjar på allvar. Lycka till! Innan du börjar skall du ha skapat en katalog för provet. Katalogen ska heta pp080319 och finnas i katalogen edu/java i er hemkatalog UMEÅ UNIVERSITET 901 87 UMEÅ Johan Eliasson Tel.: 070-2378695 e-mail: johane@cs.umu.se
Regler för det praktiska provet Detta är en del av examinationen och skall alltså ske under tentamensliknande förhållanden. Examinationen är individuell och betygsgrundande. Detta får följande konsekvenser: o Man är personligt ansvarig för de lösningar som lämnas in o Om man hittar lösningar eller delar av lösningar på nätet eller i litteraturen bör detta tydligt anges. Du är fortfarande skyldig att själv vara fullständigt insatt i den lösning du redovisar och på uppmaning ska du kunna svara för innehåll och funktion i hela eller delar av lösningen. o Självklart får man inte söka eller hämta kod från någon av de övriga tentanderna, detta betraktas som fusk och handläggs som sådant Några riktlinjer för hur lösningarna bedöms: o Koden skall följa god programmeringsmetodik, vilket t.ex. innebär konsekvent indenterad och lämpligt kommenterad källkod. o Lösningen behöver inte gå att kompilera för att ge full poäng, så låt inte troliga syntaxfel ta för mycket tid i anspråk om du känner dig övertygad om att du löst det givna problemet. o Det räcker därför inte att en lösning fungerar för att ge full poäng, även här måste man på ett rimligt sätt underordna sig kravet på god programmeringsmetodik Källkod till några av uppgifterna finns tillgängligt på websidan: http://www.cs.umu.se/kurser/5dv081/vt08/pp/1234.html 2
Uppgift 1. (8 poäng) Implementera en klass Tidtagarur med metoder nollställ, starta, stoppa och avläs. En instans av klassen är en representation av ett tidtagarur (och alltså kan användas för att ta reda på hur lång tid som har förflutit), som kan nollställas, startas, stoppas och avläsas. Du kan anta att avläsningen (som sker mha metoden avläs) alltid sker i millisekunder. Om tidtagaren stoppas och sedan startas igen så ska den bortse från den tid som förflutit då tidtagaren var stoppad, men ta hänsyn till tiden som förflutit innan stoppet. Att starta en tidtagare som redan är startad, eller stoppa en som redan är stoppad, ska inte ha någon effekt. Avläsning av tiden ska bara gå att göra på ett stoppat tidtagarur (metoden ska returnera -1 om någon försöker göra detta). Metoden nollställ ska nollställa tidtagaren (stoppa den och sätta den uppmätta tiden till 0). Ledning: Använd den statiska metoden System.currentTimeMillis(), som returnerar tiden i form av en long som anger antalet millisekunder sedan midnatt 1 januari 1970, för att beräkna hur lång tid som har förflutit. Ex på användning; Tidtagarur t=new Tidtagarur(); t.starta(); //Här skulle sak1 som tar tid kunna stå t.stoppa(); // Här skulle sak2 som tar tid kunna stå t.starta(); // Här skulle sak3 som tar tid kunna stå t.stoppa(); System.out.println(t.avläs()); /*Bör skriva ut sammanlagda tiden som sak1 och sak3 tog 3
Uppgift 2. (8 poäng) I denna uppgift så skall du skriva två stycken klasser, Circle och Rectangle, som skall ärva från klassen Shape nedan (Shape och Uppg2 är också tillgängliga på websidan för provet). Klasserna ska representera en cirkel respektive rektangel med en position och storlek. Klasserna skall vara skrivna så att koden i metoden main-metoden i klassen Uppg2 nedan fungerar. Ni måste själva lista ut vilka attribut och metoder som kan tänkas behövas för att få koden att fungera. import java.awt.point; public class Uppg2 { public static void main(string[] args) { double areasum=0; Shape mycircle = new Circle(new Point(20,20),20); /*Position,radius Rectangle myrectangle =new Rectangle(new Point(20,20),20,10); /*Position,height,width Shape[] myarray=new Shape[2]; myarray[0]=mycircle; myarray[1]=myrectangle; /*Calculate the sum of the areas of the two Shapes for(int x=0;x<2;x++) areasum=areasum+myarray[x].area(); System.out.println(areaSum); System.out.print( Position of the rectangle: ); System.out.println( ( + myarray[1].getposition().x +, + myarray[1].getposition().y+ ) ); //Should print (20,20) import java.awt.point; abstract class Shape { protected Point position; public Shape(Point pos) { position=pos; public Point getposition() { return position; /*-------------------------------------------------- *Abstract method for calculating the area of a shape. *-------------------------------------------------- abstract public double area(); Arean för en: cirkel = π*radien 2, rektangel = bredden*höjden 4
Uppgift 3. (8 poäng) Din kompis har just startat ett företag som hyr ut bilar. Hon behöver köpa mjukvara till företaget som kan hantera verksamheten. Hon ber dig att ta fram ett designförslag för systemet som hon kan använda vid förhandlingar med mjukvaruleverantörerna. Biluthyrningsfirman hanterar uthyrning och återlämnande av fordon. Det finns två typer av kunder, vanliga kunder och affärskunder från företag som får en speciell rabatt. En förare hyr ett fordon för en viss tidsperiod, specificerad via överenskommet datum och klockslag för hämtning respektive återlämning. Fordonet måste återlämnas till uthyrningsstället senast på angiven återlämningstid annars så måste en straffavgift betalas. Fordonen är indelade i olika kategorier (ekonomi, kompakt, standard, mellan, lyx) för vilka olika taxor tillämpas. Hyresavgiften beräknas genom att multiplicera antalet uthyrningsdagar med dagstaxan för aktuellt fordon. Förare under 25 år måste betala en extra försäkringsavgift. Lämna in ett förslag till design som innehåller lämpliga klasser och hur de hänger ihop. För varje klass ska viktiga attribut och metoder finnas med. Du ska beskriva din design genom ett UML-klassdiagram. OBS! I denna designuppgift ska du inte implementera någon kod. Du ska inte heller göra någon design för användargränssnittet till systemet. Lösningen ska innehålla en god objektorienterad ansats. 5
Uppgift 4. (8 poäng) I denna uppgift så ska ni skriva en implementation av en klass som hanterar logiken i mynt-/sedel-hanterare åt en affär. Givet har ni en klass Currency som svarar mot ett mynt eller sedel (finns även tillgänglig på websidan för det praktiska provet). Tillgängliga valörer på mynten/sedlarna är 1, 5,10,50,100,500 och 1000 kronor. Er klass ska ha minst följande publika metoder ArrayList<Currency> pay( ArrayList<Currency> amountpaid) Används för att göra en betalning. Summan av beloppen på mynten/sedlarna i amountpaid bör överstiga beloppet som ska betalas (och som satts med setamounttopay) annars ska ett undantag kastas. Returnerar eventuell växel (som ska tas från de mynt/sedlar som använts vid tidigare betalningar), eller en tom ArrayList om personen som handlade betalade med jämna pengar. Kan växel ej ges (på grund av att mynt/sedlar saknas ska ett undantag kastas). Se algoritm för växelutbetalningen nedan. void setamounttopay(int amounttopay) Sätter beloppet som ska betalas vid nästa betalning till att vara amounttopay minst en konstruktor Växelalgoritm Indata: tillgängliga växlingsmynt/sedlar, växelbelopp 1. Så länge som vi inte betalt tillbaka all växel 1.1. Välj ut ett mynt/sedel av högsta tänkbara valör som är under eller lika med växelbeloppet som är kvar bland de mynt/sedlar vi har till hands 1.2. Minska växelbeloppet med myntets/sedelns valör 1.3. Betala tillbaka myntet i växel Klassen Currency public class Currency implements Comparable<Currency> { private int value; * Konstruktor för Currency * @param value värdet på myntet/sedeln endast värdena * 1,5,10,50,100,500 och 1000 är giltiga. * @throws IllegalArgumentException om felaktigt värde på * parametern public Currency(int value) { if(value==1 value==5 value==10 value==100 value==500 value==1000) { this.value=value; else throw new IllegalArgumentException(""+value); 6
* Metod för att hämta värdet på myntet/sedeln * @return värdet public int getvalue() { return value; * Jämför detta mynt/sedel med ett annat objekt. * Mynt/sedlar med samma valör anses vara lika public boolean equals(object o) { try { Currency c=(currency) o; return value==c.value; catch(classcastexception e) { return false; * Genererar en hashkod för objektet public int hashvalue() { return value; * Storleksjämförelse av mynt. * @return Returnerar:<br> * -1 om parameterobjektet har ett värde som är mindre än * objektet<br> * 0 om objekten har samma värde<br> * 1 om parameterobjektet har ett värde som är större * än objektet vars metod anropades<br> public int compareto(currency c) { if(value>c.value) return 1; if(value<c.value) return -1; return 0; * Konverterar dett mynt/sedel till en sträng * @return Strängrepresentationen av objektet public String tostring() { return value + " kr"; 7