OOP
På denna sida finns alla uppgifter.
Inlämningsuppgifter
Uppgifterna består av programmeringsuppgifter som skall lösas genom att implementeras och testköras i Java. Uppgifterna skall lösas i grupper om 1-3 studenter (det är alltså INTE tillåtet att jobba fyra eller fler i en grupp). Studenten skall kunna redogöra för sin lösning och motivera de olika val som gjorts vid lösningen. Om man jobbat i grupp om 2 eller 3 studenter skall ALLA i gruppen kunna redogöra för VARJE del av lösningarna. Det är alltså inte tillåtet att "dela upp" uppgifterna och göra varsin del. Samtliga gruppmedlemmar skall kunna redogöra för samtliga delar av lösningarna.
Inlämningsinstruktioner
OBS - följ instruktionerna EXAKT annars kommer er uppgift inte att rättas.
Inlämning skall ske via kursens First Class-konferens, i underkonferensen Inluppar. OBS att det är flera olika studentgrupper som läser kursen så var noga med att du lämnar in uppgiften i korrekt FC-konferens. Vilken FC-konferens som gäller för vilka studenter framgår av Startsidan.
Inlämning görs genom att skicka ett brev till konferensen med rubriken "Inlupp 1" respektive "Inlupp 2". I brevtexten skall stå namn+personnummer för samtliga gruppmedlemmar. Vidare skall källkoderna (filerna med extension .java) skickas med som attachment. OBS alltså att det är .java-filerna skall skickas in. Dessa filer får inte vara komprimerade på något sätt (alltså INTE zippade eller jarade eller på annat sätt komprimerade). Givetvis skall samtliga filer som ingår i lösningen skickas in.
För att bli rättade i första rättningsomgången så skall:
- Inlämningsuppgift 1 lämnas in senast 2011-12-11
- Inlämningsuppgift 2 lämnas in senast 2012-01-16
En andra rättningsomgång kommer att finnas i anslutning till omtentan, man skall då lämna in senast 2012-03-05.
Inlämningsuppgift 1
Denna uppgift är lämplig att börja med efter föreläsning 6.
OBS att det är INTE meningen att denna uppgift skall lösas med hjälp av arv.
Skriv ett program som hanterar ett litet register över hundar som finns på en kennel. För varje hund som registreras skall finnas namn, ras, ålder och vikt.
Programmet skall vara kommandostyrt och fyra olika kommandon skall kunna ges:
- Registrera. Användaren får frågor om namn, ras, ålder och vikt för hunden. Ett hundobjekt skapas och läggs in i kennel-registret.
-
Lista. Användaren får en fråga om minsta svanslängd och programmet skriver ut en lista på alla hundar hos kenneln som har längre svanslängd än denna minsta angivna (om man anger 0 så kommer alltså alla hundar att skrivas ut, anger man 10 så skrivs bara de hundar vars svanslängd>=10 ut). Svanslängden för en hund kan räknas ut med den fiffiga formeln:
svanslängden=åldern*vikten/10
. Denna formel gäller för alla hundar UTOM taxar. En tax har alltid svanslängden 3.7. Vid utskriften skall alla hundens attribut samt svanslängden skrivas ut, t.ex.Fido Pudel 4 år 7 kg svans=2.8
ellerNisse Tax 6 år 8 kg svans=3.7
. -
Ta bort. Användaren får en fråga efter namnet på hunden som skall tas bort. Hunden med det angivna namnet skall tas bort ur kennel-registret. Om det inte finns någon hund med det angivna namnet så skall programmet skriva ut
Hund med det namnet fanns ej i registret
annars skall det skrivas utHunden med det angivna namnet är borttagen
. Ni behöver inte tänka på komplikationen att det kan finnas flera hundar med samma namn. - Avsluta. Programmet avslutas. En tråkig effekt är att när programmet avslutas så "försvinner" allt lagrat data (objekt som skapas ligger i primärminnet och finns bara så länge programmet körs). Alla registrerade hundar försvinner alltså. Vi kommer senare på kursen att prata om hur man kan lagra data mellan två körningar men i detta program struntar vi i detta.
En hund representeras som ett objekt av klassen Hund. Varje hund har ett antal attribut. Dessa attribut skall vara inkapslade, alltså deklarerade som private
. Åtkomst till attributen sker genom lämpliga metoder (som då är deklarerade som public
).
De olika Hund-objekten som skapas skall lagras i en datasamling. Här skall ArrayList<Hund>
användas. Hantering av Hund-objekt görs då genom att skapa ett objekt av samlingsklassen och i detta objekt anropa olika metoder, exempelvis add för att addera en ny hund till samlingen.
Att ett program är kommandostyrt fixas lämpligen genom att man i huvudprogrammet (main-metoden) har en loop där användaren får mata in ett kommando (i detta exempel en siffra mellan 1 och 4) och sedan utförs det kommandot. Detta upprepas tills användaren ger kommandot för att avsluta, då bryts loopen. Man bör här ge något lämpligt felmeddelande om ett felaktigt kommando matas in.
Vid lösningen av denna uppgift kan ni förutsätta att användaren gör rätt. Om man t.ex. frågar efter ett heltal så kan ni förutsätta att ett heltal verkligen matas in (skulle något annat matas in så leder det förmodligen till ett exekveringsavbrott). Det behövs alltså inga indatakontroller för att man skall bli godkänd.
Innan ni lämnar in skall ni (givetvis) testa att ert program fungerar som det ska. Görs lämpligen genom att ni skapar några hundar (varav minst en är en tax) och sedan provar att lista alla dessa (genom att ange minsta svanslängd vid listningen som 0, då skall alla hundarna skrivas ut).
Därefter ange lämplig annan minsta svanslängd så att ni ser att inte alla skrivs ut. Kontrollera att detta fungerar som det ska. Ta sedan bort en av hundarna, lista igen och kontrollera så att den borttagna hunden verkligen försvunnit. Det är en mycket viktig del av programmering att testa koden man skrivit för att se att den fungerar som den ska.
Inlämningsuppgift 2
Ni skall skriva ett litet registerprogram som håller reda på personer och dessa personers olika prylar (värdesaker). En person identifieras med sitt namn (namnen är unika, två personer kan alltså ej ha samma namn, se vidare Skapa person nedan) och innehåller de prylar som personen äger. Prylar är saker som har ett visst värde. Det finns tre olika slags prylar, nämligen smycken, aktier och apparater.
Ett smycke består av namn ("Ring", "Halsband" etc.), antal ädelstenar samt ifall smycket är av silver eller av guld. En aktie (egentligen aktiepost) har ett namn ("Ericsson", "Asea" etc.), ett antal samt ett pris (vad varje aktie är värd). Priset på en aktie skall kunna ändras. En apparat har ett namn ("Tv", "Dator" etc), ett inköpspris och ett slitage (ett tal mellan 1 och 10 där 10 betyder helt ny och 1 mycket sliten). För varje pryl skall man kunna beräkna dess värde. Beräkningen går till på olika sätt beroende på vilken sorts pryl det är:
- Smycken: om smycket är av guld så är värdet 2000, om det är av silver så är värdet 700. Dessutom ökar värdet med 500 för varje ädelsten
- Aktier: värdet är antalet * priset
- Apparater: värdet varierar beroende på slitaget. Om slitaget är 10 (apparaten är ny) så är värdet lika med priset, är slitaget 9 är värdet 90% av priset, är slitaget 8 är värdet 80% av priset osv.
Programmet skall vara kommandostyrt och följande kommandon skall kunna ges:
- Skapa person. En ny person skapas genom att programmet frågar efter personens namn. Om det redan finns en person i registret med det namnet ges ett felmeddelande, annars skapas personen och läggs in i registret.
- Skapa pryl. En pryl skapas via en dialog. Programmet frågar efter namn på personen som skall äga prylen, vilken sorts pryl det är samt den prylens olika attribut. Därefter skapas ett prylobjekt som adderas till den personens prylsamling. Om ingen person med det angivna namnet finns ges ett felmeddelande. Dialogen skulle t.ex. kunna se ut så här:
Vilken person äger prylen: Sara Vilken sorts pryl: Smycke Vilket sorts smycke: Halsband Är smycket av guld? Ja Antal ädelstenar: 7
- Visa alla. En lista över alla personer i registret skrivs ut. För varje person skrivs ut personens namn samt det sammanlagda värdet av personens prylar ut. Detta värdet beräknas som summan av personens olika prylars värde. Listan skulle t.ex. kunna se ut så här:
I registret finns: Sara 12875 Kalle 92400 Nisse 8200 Karin 48400
- Visa rikaste. Namn, sammanlagda värdet samt de olika prylarna skrivs ut för den person i registret som har högst värde. Skulle t.ex. kunna se ut så här:
Rikast är Kalle som sammanlagt äger 92400 Ring 3800 Plasma-tv 38600 Ericsson 43000 Stereo 7000
- Visa viss person. Programmet frågar efter namnet på en person och skriver ut den personen (inklusive personens prylar, som ovan). Om personen ej finns i registret ges ett felmeddelande.
- Börskrasch. Alla aktier i hela världen blir värdelösa. Ert program skall gå igenom alla personers alla prylar. För alla aktie-prylar sätts priset till 0. (Obs att detta ej gäller retroaktivt, utan nya aktier som adderas efter börskraschen kan ha pris).
- Avsluta. Programmet avslutas.
Obs att dialog-exemplen ovan endast är exempel på hur det skulle kunna se ut. Er dialog behöver ej se ut exakt på det sättet. Ni får t.ex. gärna använda dialogrutor med JOptionPane om ni vill.
Ni kan själva välja hur användaren skall kunna ange vilket kommando som skall utföras. T.ex. kan man tänka sig en kommandostyrning liknande den från inlämningsuppgift 1 med kommandona:
- Skapa person
- Skapa pryl
- Visa alla
- Visa rikaste
- Visa viss person
- Börskrasch
- Avsluta
Samtliga attribut i de olika klasserna skall vara inkapslade, dvs deklarerade som private och endast åtkomliga via public-metoder.
Programmet skall dessutom ha indatakontroller så att programmet inte kraschar om användaren skulle mata in felaktiga värden. Om man t.ex. frågar efter antal aktier (ett heltal) och användaren svarar "Groda" så skall ett felmeddelande skrivas ut. Hur indatakontroller görs behandlas på föreläsning 12.
Vidare skall programmet vara byggt så att klass Person skall vara generell ur den aspekten att om ni lägger till en ny sorts pryl (t.ex. Kontanter eller Bilar) så skall ni inte behöva förändra klass Person alls.
Frivillig extra utökning 1 - filhantering
Ett sådant här registerprogram är ganska värdelöst om inte datat som finns i primärminnet (de olika personerna och dessa personers alla prylar) lagras på sekundärminnet mellan olika exekveringar. Lägg därför till filhantering som gör att datat sparas mellan två programkörningar. Lämpligt är att registret automatiskt sparas när programmet avslutas och att det laddas in igen när programmet startas nästa gång (filhantering har diskuterats på föreläsning 12).
Denna filhantering rekommenderas (bra övning!), men eftersom vi gått genom filhantering så pass lite på kursen är det inte obligatoriskt.
Frivillig extra utökning 2 - borttag
Lägg till funktionaliteten borttag. Både på person-nivå och på pryl-nivå. På person-nivå så får användaren möjlighet att mata in namnet på den oönskade personen. Programmet ser till att personen med angivet namn tas bort ur registret. Finns ingen person med sådant namn så ges ett felmeddelande.
Borttag av en av en persons prylar är lite svårare. Här måste man först fråga efter vilken person, därefter vilken av prylarna som skall tas bort. Skulle t.ex. kunna göras med följande dialog:
Vilken person: Kalle Kalle har följande prylar: 1 Ring 3800 2 Plasma-tv 38600 3 Ericsson 43000 4 Stereo 7000 Vilken av prylarna skall bort: 2Dessutom lägger man till två nya kommandon, Ta bort person och Ta bort pryl, i kommandostyrningen. Denna utökning bör göras först efter att den obligatoriska delen fungerar som den ska.
Lösningsstrategi inlupp 2
Inlämningsuppgift 2 resulterar i ett lite större program än tidigare exempel/inlämningsuppgift. Det gör att man bör lösa uppgiften i olika steg. Försöker man skriva allt på en gång finns stor risk att programmet blir oöverskådligt och svårhanterat. Nedan beskrivs några steg som jag rekommenderar att ni följer.
Steg 1
Skapa klasser för de olika prylarna. Eftersom det finns gemensamma delar hos de olika prylarna kan det vara lämpligt att lägga detta i en klasshierarki, där det som är gemensamt för alla prylar läggs i en superklass, och det som är specifikt för de olika sorternas prylar läggs i ett antal subklasser. Då blir det också enkelt att lägga till nya sorters prylar.
Testa att dessa klasser fungerar genom att skriva ett litet testprogram (en klass med en main-metod) där ni skapar ett antal prylar och lägger in dem i en ArrayLista. Se till att ni kan skriva ut alla prylarna på skärmen. Lägg även till en liten kodsnutt som summerar värdet av de skapade prylarna och skriver ut det.
Att efterhand skriva små testprogram är ett bra sett att försäkra sig om att ens programkod så långt är korrekt.
Detta steg kan påbörjas efter föreläsning 10.
Steg 2
Skriv klass Person. En person skall alltså kunna äga ett antal prylar, bör då dels innehålla en prylsamling (förslagsvis en ArrayList) och dels en metod för att addera en ny pryl till personen. En person skall också innehålla en metod som beräknar och returnerar sammanlagda värdet på personens prylar.
Vidare så måste det finnas möjlighet att utifrån en person som äger ett antal prylar kunna utföra en börskrasch, dvs se till att personens alla aktier får priset 0.
OBS att klass person skall skrivas så att den skall kunna användas oförändrad även om man lägger till en ny sorts pryl (se sista stycket under inlämningstexten, före de frivilliga utökningarna).
Testa att klass person fungerar genom att i ett testprogram skapa en person, skapa ett antal prylar samt skriv ut personen. Se till att personen kan skrivas ut på de två olika sätten, alltså dels namn+förmögenhet (se kommandot Visa alla):
Kalle 26400
och dels personens olika prylar (se kommandot Visa rikaste):
Ring 2700 Ericsson 16200 Plasma-TV 7500
Kontrollera även att börskraschen fungerar genom att först skriva ut personens namn, förmögenhet och prylar. Sedan anropa börskrasch-metoden och slutligen skriva ut personen igen (nu med alla aktier värdelösa).
Detta steg görs när steg 1 är klart.
Steg 3
Skriv det kommandostyrda huvudprogrammet med dialogen enligt uppgiftstexten. Se till att ha indatakontroller vid alla inmatningar. Gör ett kommando i taget, kontrollera att det funkar som det ska innan ni gör nästa kommando.
Detta steg bör inte påbörjas förrän efter föreläsning 14. På föreläsning 14 kommer vi att diskutera hur ett sådant kommandostyrt program kan se ut, hur man delar upp det i metoder etc.