Lektion: Tentamen 2012-03-14

Moment: Öva på en tentamensuppgifter.

Denna lektion består av programmeringsuppgifterna på tentamensskrivningen som gavs 2012-03-14. Texten är något modifierad för att passa som datorlektion. Titta gärna på originaltentan.

Uppgift 2

Öppna den givna klassen Circle i ett eget fönster eller i DrJava

Deluppgifter

  1. Man kan rikta viss kritik mot den ena av de två konstruktorerna liksom mot en av metoderna? Vilka och vad är kritiken?
  2. Skriv en metod copy() som returnerar en kopia av det egna objektet.
  3. Skriv metoden collide(Circle c) som returnerar true om det egna objektet kolliderar med cirkeln c, annars false. Två cirklar anses kollidera om avståndet mellan deras centrumpunkter är mindre än summan av deras radier.
  4. (Extrauppgift - var inte med på skrivningen) Hur skall man testa att copy-metoden fungerar? Komplettera main-metoden så att även copy-metoden testas!

Uppgift 3

I denna uppgift hanterar vi "en värld med cirklar" dvs objekt av typen Circle från föregående uppgift.

Öppna kodskelettet till klassen CircleWorld i ett eget fönster eller i DrJava

En testkörning av programmet kan tänkas produceras följande output:


  > run CircleWorld
  Circle< 0,46  0,37  0,41>
  Circle< 0,38  0,74  0,26>
  Circle< 0,97  0,57  0,26>
  Circle< 0,93  0,66  0,27>
  Circle< 0,73  0,82  0,50>
  Circle< 0,02  0,21  0,36>
  Collisions: 9
  Too many circles

Deluppgifter

  1. Skriv klar konstruktorn CircleWorld(int n) som skall skapa en värld med plats för n cirklar (men inte lägga in några).
  2. Skriv klar metoden add(Circle c) som lägger till en cirkel till världen. Om den inte får plats skall ett felmeddelade ges och inget inlägg göras.
  3. Skriv en metod som räknar ut det totala antalet cirkelkollisioner. Metoden skall alltså titta på alla möjliga par av cirklar och se om detta par kolliderar. Vid tre cirklar kan det således vara upp till tre kollisioner (cirkel 1 och 2, cirkel 1 och 3 samt cirkel 2 och 3) vid fyra kan det kan det vara upp till sex kollisioner (1 kolliderar med 2, 3, 4 och 2 kolliderar med 3, 4 och 3 kolliderar med 4).

Uppgift 4

En prioritetskö är kö där uttagsordningen i första hand styrs av elementens prioritet snarare än deras ankomstordning. Patientköer i sjukhusens akutmottagningar är exempel på sådana köer. Om förhållandena ändras (t ex om någon komplikation tillstöter) så kan prioriteten behöva ändras för redan köande objekt.

Titta på kodskelettet till klassen PriorityQueue. Den implementerar prioritetsköer med objekt av typen Patient.

En körning av programmet producerar följande utskrifter:


  Aktuell kö: [(a:2), (b:4), (c:1), (d:5), (e:1)]
  Patient ut: (d:5)
  Patient ut: (b:4)
  Aktuell kö: [(a:2), (c:1), (e:1)]
  Aktuell kö: [(a:2), (c:1), (e:1), (Mx X:10)]
  Patient ut: (Mx X:10)
  Patient ut: (a:2)
  Patient ut: (c:1)
  Patient ut: (e:1)

Deluppgifter

  1. Skriv en klass Patient. Klassen skall representera en patient med namn (textsträng) och prioritet (heltal). Namnet och prioriteten skall ges som parametrar till klassens konstruktor. Förutom konstruktorn skall det finnas get-metoder för namn och prioritet, en metod för att ge en ny prioritet samt en toString-metod. Se körexemplet!
  2. Skriv klar klassen PriorityQueue dvs skriv konstruktorn, metoden isEmpty() (enligt kommentarerna), metoden put (enligt kommentar och testkörning) samt metoden get.

    Metoden get skall leta upp patienten med högst prioritet, ta ut den ur kön och returnera den. Om det finns flera patienter som har den högsta prioriteten skall den som stått längst tid i kön tas. Om kön är tom skall null returneras.

    Observera att du kan få en del ledning genom att studera de delar av koden som är given inklusive testprogrammet.

  3. Testkör och jämför output!

Tillbaka

Valid CSS!