LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDA017, Programmeringsteknik för C, E, I och Pi 2017 03 15, 14.00 19.00 Anvisningar: Tentan innehåller fyra uppgifter. Preliminärt ger uppgifterna 7 + 21 + 6 + 11 = 45 poäng. För godkänt betyg krävs 22,5 poäng. Läs igenom hela tentan innan du sätter igång. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. Resultatet läggs in i Ladok när rättningen är klar och anslås inte på anslagstavlan. Tentamensvillkor: Om du tenterar utan att vara tentamensberättigad annulleras din skrivning. För att undvika att någon skrivning annulleras av misstag kommer alla som, enligt institutionens noteringar, tenterat utan att vara tentamensberättigade att kontaktas via epost. Felaktigheter i institutionens noteringar kan därefter påtalas fram till nästa tentamenstillfälle då resterande skrivningar annulleras.
2(6) 1. Flera stora matvarubutiker har idag även en webbutik. I vissa webbutiker finns det möjlighet att välja bland recept och att automatiskt lägga ingredienserna i varukorgen. Vid val av recept kan man ange hur mycket som ska lagas eller bakas och ingredienslistan till varukorgen anpassas då därefter. Klassen Ingredient används för att hålla reda på information om en ingrediens i ett recept. Klassen är färdigskriven. Ingredient /** Skapar en ny ingrediens som heter name, med mängden quantity, enheten unit och med varunumret itemnbr */ Ingredient(String name, double quantity, String unit, int itemnbr); /** Returnerar namnet på ingrediensen */ String getname(); /** Returnerar mängden av ingrediensen */ double getquantity(); /** Returnerar enheten i vilken ingrediensen mäts */ String getunit(); /** Returnerar ingrediensens varunummer */ int getitemnumber(); /** Returnerar en textuell beskrivning av ingrediensen på formen "Morot 0.3 kg" */ String tostring(); Klassen Recipe håller reda på alla ingredienser i ett visst recept. I andra sammanhang innehåller ett recept även instruktioner för hur man lagar maträtten, men de instruktionerna bortser vi från här. Recipe /** Skapar ett nytt recept för maträtten name med de ingredienser som finns i listan list */ Recipe(String name, ArrayList<Ingredient> list); /** Returnerar en strängrepresentation av receptet innehållande namnet samt en listning av alla ingredienser och dess mängd */ String tostring(); /** Returnerar en lista med de ingredienser som behövs till detta recept. Ingredienslistans mängder är duplicerad times gånger mot originalreceptet */ ArrayList<Ingredient> getitems(double times); Uppgift: Implementera klassen Recipe enligt specifikationen ovan. Ledning och anvisningar: Ingredient innehåller inga metoder för att ändra på t.ex. mängden eftersom vi inte vill att ett befintligt recept ska kunna ändras utifrån (av misstag). Att en kund dubblerar ett recept ska ju inte påverka receptet som sådant utan bara de specifika varor som returneras av metoden getitems (eftersom samma recept kan antas visas för alla som använder webbutiken). Det betyder att getitems måste returnera en lista med nya ingrediensobjekt. tostring-metoden ska ge en sträng på följande format: Ugnsfisk babyspenat 70.0 g torskryggfiléer 4.0 st salt 1.0 tsk
3(6) dill 1.0 kruka grädde 2.0 dl vitlöksklyfta 1.0 st citron 0.5 st 2. Matvarubutiken på webben måste också ha ett sätt att hålla reda på vad kunderna beställer. Varje kund har en varukorg som beskriver alla varor den har samlat på sig, hur mycket av varje vara som är vald, samt dess pris. Kunden kan lägga varor i varukorgen via valda recept, men man kan också lägga till enstaka varor. För att hålla reda på varje vara i varukorgen har vi klassen ShoppingItem enligt specifikationen nedan. Klassen är färdigskriven. ShoppingItem /** Skapar ett nytt ShoppingItem-objekt. Med benämningen name, mängden q angiven i enheten unit, enhetspriset price och varunummret itemnbr */ ShoppingItem(String name, double q, String unit, double price, int itemnbr); /** Returnerar namnet på varan */ String getname(); /** Returnerar mängden av varan */ double getquantity(); /** Returnerar enheten i vilken varan mäts */ String getunit(); /** Returnerar varans varunummer */ int getitemnumber(); /** Returnerar priset per enhet för denna vara */ double getprice(); /** Returnerar varans totalpris (beräknat på mängden och enhetspriset) */ double gettotalprice(); /** Ändrar mängden av varan till mängden newquant */ void setquantity(double newquant); /** Returnerar en textuell beskrivning av varan på formen "Morot 0.3 kg; 3.87 (12.90 kr/kg)" */ String tostring();
4(6) Klassen ShoppingBasket beskriver en varukorg enligt specifikationen nedan. ShoppingBasket /** Skapar en tom varukorg */ ShoppingBasket(); /** Lägger till varan item till varukorgen, om varan redan finns uppdateras mängden på befintlig vara */ void additem(shoppingitem item); /** Lägger till ingredienserna i receptet r, duplicerat times gånger, till denna varukorg */ void addrecipe(recipe r, double times); /** Hämtar totalkostnaden för alla varor i denna varukorg */ double getsubtotal(); /** Returnerar en vektor med alla varor i denna varukorg. Varorna i vektorn är sorterade stigande med avseende på varans namn */ ShoppingItem[] getitemsinorder(); Uppgift: Implementera klassen ShoppingBasket enligt specifikationen ovan. Ledning och Anvisningar: Då ingredienserna från ett recept hämtas och ska läggas i varukorgen måste varukorgen ha något sätt att hitta aktuellt pris på varje ingrediens motsvarande vara. Därför får ni anta att vi har tillgång till en klass PriceList som håller reda på aktuell prislista. Klassen PriceList har en metod som ni behöver och den är deklarerad så här: /** Ger priset för produkten med nummer itemnumber */ public static double getprice(int itemnumber) Varunumret kan antas vara unikt för varje vara (och samma för motsvarande ingrediensobjekt). En viss vara mäts alltid i samma enhet. Metoden getitemsinorder får sortera den interna listan men inte på något sätt ändra dess innehåll.
5(6) 3. Webbutiken har även andra klasser för att övergripande hålla reda på alla varor och ordrar. Vi behöver inte bekymra oss så mycket för dessa men i en av klasserna behövs en metod för att beräkna statistik och denna har du fått i uppgift att skriva. Klassen innehåller alla ordrar och en lista över alla varor i lager. Metoden ska räkna ut i hur många ordrar varje vara beställs. En skiss av klassen beskrivs i koden nedan. OrderHandler public class OrderHandler { private ArrayList<ShoppingBasket> orders; private ArrayList<ShoppingItem> allitems; } public OrderHandler(){ orders = new ArrayList<ShoppingBasket>(); allitems = new ArrayList<ShoppingItem>(); } //Andra metoder som håller mängden av ordrar och varor //uppdaterad under tiden som webbutiken är igång /** Returnerar en vektor där varje element anger hur många gånger motsvarande varunummer förekommer bland ordrarna. */ public int[] itemstatistics(){ //Denna kod ska du skriva } Uppgift: Implementera metoden itemstatistics. Ledning: Varorna i allitems är sorterad på varunummer. Man får anta att alla varunummer är större än noll och inte orimligt stora. Vi vet inte vilka varunummer som är giltiga, det är alltså t.ex. inte ok att anta att första varan börjar på ett. Exempel: Om varan med det högsta varunumret i webbutiken är 7 och OrderHandler innehåller 2 ordrar med följande varunummer i: varunummer i order 1 varunummer i order 2 3 6 1 1 2 2 5 så ska vektorn som returneras från itemstatistics se ut så här: 0 2 2 1 0 1 1 0
6(6) 4. Som ni ser i uppgift 1 och 2 så är klasserna Ingredient och ShoppingItem ganska lika. Båda innehåller namn (name), mängd (quantity), enhet (unit) och varunummer (itemnumber). ShoppingItem innehåller också ett pris och några extra metoder. Klasserna Ingredient och ShoppingItem är alltså likartade, de beskriver varor på nästan samma sätt men används i lite olika sammanhang vilket gör att man kan argumentera för att strukturera klasserna med hjälp av arv. Uppgift: Beskriv hur klasserna Ingredient och ShoppingItem kan struktureras om med arv. För fullpoäng ska följande finnas med: angiven superklass (i förekommande fall) kompletta attributdeklarationer för varje klass i ditt förslag komplett konstruktor för varje klass i ditt förslag kompletta tostring-metoder för varje klass angivelse av vilka övriga metoder som ska finnas i vilken klass (metoderna behöver alltså inte implementeras, det räcker att du visar var de ska ligga). Det är alltså samtliga befintliga metoder för ShoppingItem och Ingredient som ska placeras ut på rätt ställe.