6
2017-XX-XX.kl.14-19 Tentaupplägg Allmänna Tips Läs igenom ALLA uppgifterna. Välj den du känner är lättast först. Det kan gärna ta 10-20 minuter. Försök skriva saker som kan vara problem i uppgifterna. Är det något du absolut kommer att fastna på så kanske det är fel uppgift att ge sig på. Tiden du lägger på att noga läsa uppgifterna tjänar du in på att välja rätt uppgift. Kolla ibland till kommunikationsfönstret. Det kan ha kommit information till alla utan att ni skickat in en fråga. Om ni har problem med eclipse eller dylikt som INTE har med uppgifterna att göra, räck upp handen så kommer en assistent. Detsamma gäller om hur man kopierar givna filer. Frågor om själva uppgifterna tar vi i första hand via tentasystemet. Testa ditt program noga innan du skickar in. Om din lösning inte är korrekt kommer du få ett kompletteringsmeddelande och har möjlighet att rätta den och skicka in igen. Kompletteringar måste dock åtgärdas. Vi tolererar inte att ni spammar oss med samma lösning om och om igen. Kommando Effekt cp given_files/* . Kopierar alla givna filer till mappen du står xdg-open given_files/tenta.pdf Öppnar själva tentan. Blir läsbar då tentan startar. eclipse & Startar eclipse. Generella krav (gäller för alla uppgifter om inget annat anges): Fullständiga uppräkningar och kodduplicering skall undvikas med klasshirarkier och polymorfi i de fall det inte går att generalisera på andra sätt (underprogram, loopar, etc.). Korrekt inkapsling krävs, d.v.s. rätt synlighet på instans/klassvariabler och metoder. Lämpliga konstruktorer skall finnas för alla klasser. Instansvariabler får inte användas som globala/lokala variabler (d.v.s använd parametrar och lokala variabler i första hand). Korrekt användning av static krävs. Överanvändning av instanceof och typkonverteringar kan leda till komplettering. Betygsgränser: Tid TDDE10/11 725G90/91 2 poäng 19:00 Betyg 3 Betyg G 3 poäng 18:00 Betyg 4 3 poäng 16:45 Betyg VG 3 poäng 16:30 Betyg 5 ≥4 poäng 18:00 Betyg 5 ≥4 poäng 18:15 Betyg VG Bonustid från avklarade laborationer tillkommer till dessa tidsgränser. Tiden för betyg G överstiger dock aldrig 5 timmar. OBS: Delpoäng delas inte ut på uppgifterna. För att få poäng på en uppgift måste man alltså lösa uppgiften helt (och enligt specifikation). M.v.h. /Torbjörn och Erik

2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

TentauppläggAllmänna Tips

Läs igenom ALLA uppgifterna. Välj den du känner är lättast först. Det kan gärna ta 10-20 minuter. Försök skriva saker som kan vara problem i uppgifterna. Är det något du absolut kommer att fastna på så kanske det är fel uppgift att ge sig på. Tiden du lägger på att noga läsa uppgifterna tjänar du in på att välja rätt uppgift. Kolla ibland till kommunikationsfönstret. Det kan ha kommit information till alla utan att ni skickat in en fråga. Om ni har problem med eclipse eller dylikt som INTE har meduppgifterna att göra, räck upp handen så kommer en assistent. Detsamma gäller om hur man kopierar givna filer. Frågor om själva uppgifterna tar vi i första hand via tentasystemet. Testa ditt program noga innan du skickar in. Om din lösning inte är korrekt kommer du få ett kompletteringsmeddelande och har möjlighet att rätta den och skicka in igen. Kompletteringar måstedock åtgärdas. Vi tolererar inte att ni spammar oss med samma lösning om och om igen.

Kommando Effektcp given_files/* . Kopierar alla givna filer till mappen du stårxdg­open given_files/tenta.pdf Öppnar själva tentan. Blir läsbar då tentan startar. eclipse & Startar eclipse.

Generella krav (gäller för alla uppgifter om inget annat anges):• Fullständiga uppräkningar och kodduplicering skall undvikas med klasshirarkier och polymorfi

i de fall det inte går att generalisera på andra sätt (underprogram, loopar, etc.).• Korrekt inkapsling krävs, d.v.s. rätt synlighet på instans/klassvariabler och metoder.• Lämpliga konstruktorer skall finnas för alla klasser.• Instansvariabler får inte användas som globala/lokala variabler (d.v.s använd parametrar och

lokala variabler i första hand).• Korrekt användning av static krävs.• Överanvändning av instanceof och typkonverteringar kan leda till komplettering.

Betygsgränser: Tid TDDE10/11 725G90/912 poäng 19:00 Betyg 3 Betyg G

3 poäng 18:00 Betyg 43 poäng 16:45 Betyg VG3 poäng 16:30 Betyg 5

≥4 poäng 18:00 Betyg 5≥4 poäng 18:15 Betyg VG

Bonustid från avklarade laborationer tillkommer till dessa tidsgränser. Tiden för betyg G överstiger dock aldrig 5 timmar.

OBS: Delpoäng delas inte ut på uppgifterna. För att få poäng på en uppgift måste man alltså lösa uppgiften helt (och enligt specifikation).M.v.h./Torbjörn och Erik

Page 2: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

SkidsemesterI följande uppgifter används en skidåkning/skidsemester som bakgrund till uppgifterna. I Sverige är detsedan långt tillbaka en tradition att åka upp till fjällen (antingen med familj, eller med kompisar) och åka skidor. Det vanliga upplägget är att man åker till ett specifikt ställe, en skidanläggning, som har allt: d.v.s. skidbackar, liftar, hotell (eller hyrstugor), skiduthyrning, krogar m.m. I uppgifterna används den fiktiva skidorten Vinterdalen. Här följer en lista på skidåkningstermer som ändå kanske behöver förtydligas. Om du är bekant med skidåkning kan du hoppa direkt till uppgifterna.

Skidor Två platta avlånga skenor som fästs med pjäxor vid en skidåkares fötter. Används för attglida snabbt framåt på snöklätt underlag. Finns flera typer, t.ex. Slalom-skidor och Längd-skidor.

Skidåkare Person som tar på sig skidor och åker nedför en snöklädd backe.Pjäxor En typ av hårda (ibland mjuka) skor eller stövlar som är specialdesignade för att fästas i

skidor eller snowboard.Snowboard Enskild platt skena som en person står på för att, likt skidåkare, åka nedför en snöklädd

backe.Lift Mekaniskt system som för skidåkare uppåt i backen. Finns flera typer, t.ex. knapplift

som är extra barnvänlig, sitt-lift (i princip en soffa av metall som kan forsla flera personer samtidigt) och ankar-lift (en notoriskt jobbig lift som man ofta ramlar i).

Liftkort Passerkort som krävs för att få åka lift. Köps vanligtvis då man anländer till skidanläggning, är personligt och är bara giltigt under en viss tidsperiod.

Pist Skidbacke som är pistad, d.v.s. iordninggjord för utförsåkning.

Barn som åker ankarlift.

Två-sitsig sittlift och snowboardåkare.Att sitta ner i backen är extra skönt om man åker snowboard.

Kvinna som har hyrt pjäxor och skidor.

Page 3: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

Uppgift 1 - Snöfarare [1p]I denna uppgift skall du skapa några klasser som behövs för Vinterdalens bokningssystem. Klassen SkierGroup finns redan påbörjad i mappen given_files. En SkierGroup representerar en grupp människor som åker skidor eller snowboard tillsammans. En person som åker framåt/nedåt på snö kallar vi för en snöfarare (eng. SnowGoer). Följande klasser/metoder skall implementeras enligt följande UML-diagram och beskrivningar.

För snöfarare (klassen SnowGoer) gäller att de alltid har ett namn och en ålder. SnowGoer har metoden printYourself() som skriver ut snöfarens namn och ålder. SnowGoer har även en abstrakt metod slowDown(), metoden skall användas då snöfararen måste bromsa upp i backen.

Skier är en subklass till SnowGoer som representerar skidåkare. Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1 (Gustav-Wasa-style) eller 0 (backhoppning) stavar. Antalet stavar skall lagras i Skier-klassen och anges då man instansierar en Skier. Då man anropar printYourself() på en skidåkare så skrivs det ut t.ex. ut "Skier with 2 poles" (under informationen från SnowGoer). Då man anropar slowDown() på en Skier skrivs följande ut på skärmen"Points ski tips towards each other".

Snowboarder är en subklass till SnowGoer som representerar snowboardåkare. Då man anropar printYourself() på en skidåkare så skrivs det ut, "Snowboarder" (under informationen från SnowGoer).Då man anropar slowDown() på en snowboarder skrivs följande ut på skärmen "Swoops in and sprays lots of snow".

SkierGroup skall ha en metod add som lägger till en snöfarare till gruppen, en metod remove som tar bort en snöfarare från gruppen och en metod haveFun() som anropar printYourself() och slowDown() på varje snöfarare i gruppen. Gruppen kan vara godtyckligt stor, men ordningen på snöfararna i gruppen ärinte viktig. Du skall inte ändra på de metoder som redan finns i SkierGroup. (Du får dock modifiera kroppen till konstruktorn).

Ett huvudprogram, SkierGroupTest.java, finns färdigt i mappen given_files.

SkierGroup+add(SnowGoer)+remove(SnowGoer)+haveFun()

SnowGoer- name- age+printYourself()+slowDown()

Skier- poles+printYourself()+slowDown()

Snowboarder+printYourself()+slowDown()

1 0..*

Page 4: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

Uppgift 2 - Familjekort [1p]För att locka fler familjer till skidorten har Vinterdalen bestämt sig för att erbjuda en ny typ av liftkort för familjer. Liftkortet lämpar sig för familjer som inte tänker dela på sig under skidåkningen utan hela tiden liftar tillsammans. Vanligtvis kostar liftkorten i Vinterdalen ganska mycket, men detta liftkort kommer endast kosta 200 kr per familjemedlem (kortet räcker alltid en vecka). Du skall i denna uppgiftskapa klassen FamilyPass enligt nedanstående UML och beskrivningar:

Klassen LiftPass finns redan färdig i Vinterdalens datorsystem. Du skall inte ändra på LiftPass. FamilyPass är en subklass till denna klass.

FamilyPass skall endast ha en konstruktor som tar en parameter: antalet familjemedlemmar på kortet. Konstruktorn skall sedan läsa så många personnummer från tangentbordet (en per rad) och lagra dem. Vi utgår från attanvändaren alltid matar in korrekta personnummer och att detta inte behöver kontrolleras.

Om det i inmatningen matas in något personnummer som redan matats in så skall undantaget DuplicatePersonNumberException kastas. Man skall inte vara tvungen att fånga detta undantag. Även undantagsklassen skall du skapa själv i denna uppgift.

TIPS: Tänk på att strängar bäst jämförs med metoden equals.

LiftPass- cost- daysValid…

FamilyPass- pnrs : String[]

Page 5: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

Uppgift 3 - Sittlift [2p]Vinterdalen behöver ny mjukvara för alla sittliftar. Som en del av detta system behövs en ADT för att representera själva liften. ADT:n skall heta ChairLift och skall användas för att lagra en linjär mängd grupper av skidåkare. Om du inte vet hur en sittlift fungerar kan du kolla på bilden i början av tentan. Tänk dig ett långt tåg av vagnar som man har kopplat ihop med sig själv så att det blir en slinga. Liften "roterar" i stort sätt hela tiden. Skidåkare kliver på längst ner i baken och kliver av när de nått toppen. I verkligheten händer det att folk också åker ned med liften, men det bortser vi helt ifrån i denna uppgift. I praktiken behöver man dock ibland stanna liften om det blir trubbel vid på/avstigning (folk ramlar). En grupp skidåkare representeras av klassen SkierGroup (finns påbörjad i mappen given_files). Då en ChairLift instansieras skall man ange hur många skidåkargrupper som maximalt kan åka (upp) i liften samtidigt.

Sittliften har följande operationer:List<SkierGroup> runSteps(int n, List<SkierGroup> g);Kör sittliften n steg. För varje steg som körs skall det första SkierGroup-objekt tas bort från g och kliva på liften. Om g blir tom under denna körning måste ADT:n hålla reda på att motsvarande sitsar åker upp tomma. De skidåkningsgrupper som har nått toppen av backen kliver av och läggs till i en lista somreturneras från metoden. Ordningen i listan skall bli samma ordning som grupperna klev av i.

List<SkierGroup> runSteps(int n);Samma funktion som operationen ovan, fast inga skidåkare kliver på. Dock kan skidåkare kliva av, så även här returneras en lista med vilka som klivit av.

Exempel på huvudprogram:ChairLift lift = new ChairLift(8);   // max 8 grupper kan åka upp samtidigtList<SkierGroup> groups = new ArrayList<>();groups.add(new SkierGroup("A"));groups.add(new SkierGroup("B"));groups.add(new SkierGroup("C"));

lift.runSteps(5, groups);  // Grupp A, B och C kliver på, två sitsar tomma.lift.runSteps(2);          // två sitsar till blir tomma.

groups.add(new SkierGroup("D"));groups = lift.runSteps(2, groups); // Grupp D kliver på, en sits till                                   // blir tom, A kliver av.groups = lift.runSteps(3);      // Tre sitsar till blir tomma, B kliver av,                                // C kliver av, en tom sits kommer upp.

for (SkierGroup sg : groups) {  System.out.print(sg.getName() + " ");  // ut på skärmen kommer "B C "}Motsvarande finns även i filen ChairLiftTest.java i given_files.

TIPS: Kommentarerna i den givna filen illustrerar lite tydligare vad som händer i varje steg. Gör en print-metod i ChairLift som skriver ut hur det ser ut i liften just nu. Den är användbar när du skall felsöka din ADT.

Page 6: 2017-XX-XX.kl.14-19 Tentaupplägg - IDATDDE10/this_year/exam/old_exams/practice/... · Skidåkare har, utöver snöfarares egenskaper, ett antal stavar. Man kan ha 2 (standard), 1

2017-XX-XX.kl.14-19

Uppgift 4 - Svarta backar [2p]I Vinterdalen beskriver man hur svåra backar är med en färg. T.ex. är gröna backar mycket lätta, medansvarta anses vara svåra (blått => lätt, rött => mellansvår). Nu har de en ny idé, även andra saker kan ha "svårighetsgrad", t.ex. liftarna, eller off-pistområden (backar som inte är förberedda för åkning, där åker man på egen risk). Off-pistområden har dock inte färger som svårighet, utan en sifferskala som kan gå hur högt upp som helst.

Teknikerna hos Vinterdalen behöver hjälp med en del av koden. Teknikernas kod ser ut på detta sätt (Color är från paketet java.awt):Slope anAverageSlope = new Slope(Color.RED);SnowyArea area = anAverageSlope;HasDifficulty<Color> dif = anAverageSlope;

AnchorLift anchorLift = new AnchorLift();HasDifficulty<Color> dif2 = anchorLift;

if (anAverageSlope.getDifficulty().equals(anchorLift.getDifficulty())) {  Color c = anchorLift.getDifficulty();  System.out.println("Samma svårighetsgrad: " + c);}

OffPistArea off = new OffPistArea(3);SnowyArea area2 = off;HasDifficulty<Integer> dif3 = off;int i = off.getDifficulty();

Det är viktigt att koden ovan går att kompilera. Teknikerna har också givet lite kod som de vet inte skall gå att kompilera (fortsättning från ovan):

area.getDifficulty();       // FEL, en SnowyArea har inte svårighetsgrad.anAverageSlope = anchorLift // FEL, en lift är inte en pist.dif2 = dif3;                // FEL, olika typer av svårighetsgrad.area = dif;                 // FEL, en HasDifficulty är inte en SnowyArea.dif = area;                 // FEL, en SnowyArea är inte en HasDifficulty.

Följande kodsnutt bör ge en varning, men går att kompilera: if (anAverageSlope.getDifficulty().equals(off.getDifficulty())) {   // VARNING, går ej att jämföra pister med offpistområden.}

Koden ovan finns given i filen BlackSlopesTest.java i given_files. Du skall alltså skapa de fem typer som används ovan. Svårighetsgraden för ankarliften får du välja själv.

TIPS: Rita upp ett UML-diagram för dig själv så blir det lättare.