Salstentamen måndag 12 mars
Uppgiften består i att skriva ett terminalprogram som kan administrera ett fiktivt kycklingburgarehak McAnkas. Uppgiften innehåller många trådar men trots detta så är det inget krav på ditt program att vara trådsäkert. Det är tillåtet att ändra eller ersätta den givna koden men den huvudsakliga funktionaliteten ska vara kvar. Variabelnamn kan med fördel förbättras.
Uppgift 1
Ladda ner filerna
Grocery.java
McAnkas.java
OrderListenerThread.java
OrderServer.java
RestockThread.java
från hemsidan. Kompilera med
javac G*.java M*.java O*.java R*.java
OrderServer.java är ett program som simulerar kunder som köper kycklingbitar. När man kör programmet skriver det då och då (efter några slumpade sekunder) ut en beställning på t.ex. 3 kycklingbitar. Programmet skriver dels ut på en nätverksport samt på skärmen för att du ska kunna följa vad som händer. Första gången du kör programmet väntar den på klientprogrammet.
Om råvarorna tar slut får man beställa mer. Grocery.java är ett program som simulerar grossisten där McAnkas kan köpa flera påsar med kyckling. Programmet läser indata från en nätverkssocket. En siffra förväntas och den anger hur många påsar kyckling McAnkas ska köpa. Efter en liten stund (det tar ett tag att expediera beställningen) skriver programmet på en socket samt på skärmen.
McAnkas.java simulerar restaurangen som säljer friterade kycklingbitar. När man kör programmet får man upp en liten meny där man kan se hur det går för restaurangen. McAnkas har två trådklasser till sin hjälp, dels OrderListenerThread.java som lyssnar på OrderServer.java och uppdaterar antalet sålda kycklinbitar samt kycklinginnehavet, dels RestockThread.java som gör beställningar till Grocery.java servern och uppdaterar kycklinginnehavet.
Du kommer att behöva tre terminaler för att köra tre program samtidigt. Börja med att öppna en terminal och kör programmet OrderServer t.ex.:
java OrderServer 10011
öppna en ny terminal och kör programmet Grocery t.ex.:
java Grocery 10022
öppna en tredje terminal och kör programmet McAnkas t.ex.:
java McAnkas 10011 10022
Programmet visar en meny:
1) skriv antal beställningar hitintills
2) beställ mer kyckling
3) status
9) quit
Prova menyalternativen. Notera att OrderServer har börjat skriva ut beställningar. Menyalternativet status visar inte kycklingbeståndet, bara antal sålda hittils.
Uppgift 1a
Din första uppgift blir att förbättra status så att även kycklingbeståndet skrivs ut.
Uppgift 1b
Uppdatera status så man kan se hur mycket pengar man fått in under dagen. Varje kycklingbit kostar kunden 5 kr. En påse kyckling (från Grocery.java) kostar McAnkas 40 kr.
Uppgift 1c
Förbättra statusuppdateringen så att man kan se när den senaste beställningen gjordes av en kund. Använd dateformat "hh:mm:ss" (det finns exempel på dateformat i koden).
Uppgift 2
Föreståndaren till McAnkas vill undersöka när på dagen det säljs mycket kycklingbitar Det kan behövas mer personal i köket då.
Spara undan varje köp av kycklingbitar och när köpet gjordes. Inför ett nytt menyalternativ där man får ange två tider på formen "hh:mm:ss" (tips: se bortkommenterad kod i status) och därefter skriver programmet ut hur mycket som inhandlats. Utskrifter till användaren får du bestämma själv men de ska vara lätt att förstå.
Uppgift 3
Ändra koden så att det även beställs kycklingburgare. En kycklingburgare kostar kunden 15kr och består av en kycklingbit i ett bröd. En påse med 20 bröd kostar McAnkas 30kr att beställa.
Uppdatera status samt din implementation av uppgift två med att även hantera kycklingburgare. Inför möjligheten att beställa bröd från Grocery.
Uppgift 4
Skriv en metod som givet två tidpunkter skriver ut hur mycket pengar Mcankas har fått in under den tiden. Om du vill kan du slå ihop eller återanvända koden i uppgift två.
Uppgift 5
Förutom namnen så är det inte så stor kodskillnad på RestockThread.java och OrderListenerThread.java. Från början är skillnaden enbart:
mcankas.nrKycks += x * 20; // 20 i varje
jämfört med:
mcankas.sold += x;
mcankas.nrKycks -= x;
Därtill har kod du skrivit för att lösa uppgifterna tillkommit. Kodupprepning lär det dock fortfarande vara. Visa hur man kan lösa kodupprepningen med ett interface. Vid tidsbrist behöver denna uppgift inte implementeras endast diskuteras.
Munta
Efter att programmeringsuppgiften redovisats ska följande begrepp muntas i annan sal.
Objektorienterad design
Arv
Klassdiagram
Aggregat
Arv (är en slags, is a)
Association (har en)
Aggregat (har/består av)
Komposition/aggregat (består av)
Åtkomst (private/public ...)
Medlemsvariabel/attribut
Paket (package)
Abstrakt datatyp, Interface
Problemställning: för små, för stora?
Överlagra (överladda/överskriva i anteckningarna)
Dynamisk bindning
Polymorfi
Programmeringsteknik
Typkonvertera
Typparametrisering
Undantag (exceptions)
Trådar
Enhetstestning
Algoritmer och datastrukturer
Vektor vs länkad lista
Associative array
Hashning
Binärt sökträd
Binär sökning
Sorteringsalgoritmer
Quicksort
Mergesort
Räknesortering (distribution sort)
Valfri enkel kvadratisk sortering
Designprinciper
Single Responsibility
Abstraction (luta sig mot)
Liskov's Substitution Principle
MVC – model, view, controller
Observer pattern
Singleton
Open/Closed Principle (utökning vs modifiering)
Dependency Inversion Principle
För betyg A ges annan uppgift och munta se kurspm.