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:

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:

  1. 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.
  2. 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 eller Nisse Tax 6 år 8 kg svans=3.7.
  3. 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 ut Hunden med det angivna namnet är borttagen. Ni behöver inte tänka på komplikationen att det kan finnas flera hundar med samma namn.
  4. 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:

Programmet skall vara kommandostyrt och följande kommandon skall kunna ges:

Vilken person äger prylen: Sara
Vilken sorts pryl: Smycke 
Vilket sorts smycke: Halsband
Är smycket av guld? Ja
Antal ädelstenar: 7
I registret finns:
Sara	12875
Kalle	92400
Nisse	8200
Karin	48400
Rikast är Kalle som sammanlagt äger 92400
   Ring		3800
   Plasma-tv	38600
   Ericsson	43000
   Stereo	7000

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:

  1. Skapa person
  2. Skapa pryl
  3. Visa alla
  4. Visa rikaste
  5. Visa viss person
  6. Börskrasch
  7. 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: 2
Dessutom 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.

Allt material är gjort av Stefan Möller DSV 2007 - 2010 och är skyddat av lagen om upphovsrätt.