Observera att detta är en arbetsversion av sidan!
Dölj style3dev.css för att bli av med annoteringarna!

Lektion 4   Obligatorisk redovisning 1

Moment: Skriva metoder med villkors- och iterationssatser.
Begrepp som introduceras: Inga nya begrepp.
Arbetssätt: Arbeta gärna tillsammans med någon, men skriv egen kod. Diskutera med varandra!

Försök svara på de frågor som har givna svar innan du tittar på svaret. Fråga handledarna om det är något svar du inte förstår!

Uppskattad arbetstid: 4 timmar.
Redovisning: Obligatorisk redovisning för lärare/handledare enligt tiderna på kurssidan.

Metoder i klassen Turtle som är till nytta i denna lektion

Metod Funktion
Turtle(w,x,y) Konstruktor som skapar en ny sköldpadda på angivna x- och y-koordinater.
void move(int s) Flyttar paddan s punkter framåt/bakåt
void turn(int v) Vrider paddan v grader. Positivt värde ger medurs-, negativt motursvridning.
int getXPos() Returnerar paddans x-position.
int getYPos() Returnerar paddans y-position.
void turnTo(Turtle t) Vrider aktuell padda mot paddan som refereras av t.
double distanceTo(int x, int y) Returnerar paddans avstånd till punkten (x, y).

För att få en fullständig beskrivning av klassen Turtle kan du titta på dokumentationen för klassen Turtle

Kom ihåg de lite omständliga sätten att fråga efter storleken på en paddas värld:

Kom ihåg de lite omständliga sätten att fråga efter storleken på en paddas värld:
int h = t.getWorld().getHeight(); int w = t.getWorld().getWidth();

där t är en godtycklig padda, getWorld() en metod som returnerar paddans värld samt getHeight() och getWidth() metoder som returnerar världens höjd och bredd.

Uppgifter

Du skall fortsätta att arbeta med klassen Turtle från lektion 3.
  1. Skriv en metod moveRandom i klassen Turtle som slumpmässigt vrider paddan och sedan flyttar den framåt en sträcka av slumpmässig längd. Metoden skall inte ha någon parameter.
    Testa metoden i interaktionsrutan.
  2. Skriv en metod distance(Turtle t) i klassen Turtle som beräknar och returnerar avståndet från aktuell padda till paddan som refereras av parametern t.
    Metoden har en parameter som är en objektreferens. Det finns en minilektionen som beskriver detta.
    Testa metoden i interaktionsrutan!
  3. Skriv en ny klass StrollingTurtles som endast innehåller en main-metod.

    Denna metod skall skapa en värld (400x400) med två paddor på 50 punkters avstånd från varandra (t ex på koordinaterna (175, 200) och (225, 200)). Därefter skall de flyttas omkring slumpvis tills deras inbördes avstånd överstiger 200.

    Varje gång deras inbördes avstånd understiger 20 skall texten Krock! skrivas ut (System.out.println(...)) i interaktionsfönstret.

    Programmet (main-metoden) skall givetvis använda metoderna moveRandom och distance för att lösa uppgiften eftersom dessa metoder löser problemen "flytta padda slumpmässigt" och "beräkna avståndet mellan två paddor".

    Använd nedanstående programskal:

    public class StrollingTurtles { public static void main(String[] args) throws InterruptedException { // Create the world and the turtles here and other necessary // initializations. ... ... while (....) { // Move the turtles and check for collisions ... ... ... Thread.sleep(200); // Make the program sleep for 0.2 sec. } // Print the number of steps and collisions ... ... } // End of main method } // End of class

    Texten throws InterruptedException är en deklaration av att en viss typ av händelse kan inträffa i metoden. Det är nödvändigt att ha denna när man anropar Thread.sleep(int ms). Du behöver inte förstå mer av detta än att anropet får programmet att sova angivet antal millisekunder.

    Börja så här:

    1. Gör i DrJava så får du ett tomt definitionsfönster.
    2. Klistra in det givna programskalet.

    När programmet är klart skall det skriva ut hur många steg som krävdes och hur många krockar som skedde.

    Kör programmet med -knappen.

    Så här kan det se ut i världen och interaktionsrutan:
    Bild Bild
  4. Prova gärna DrJavas debugger enligt nedanstående.
    • Kör programmet StrollingTurtles med DrJava's debugger inställd på "Step Over" (dvs manuell körning sats för sats) och variabelbevakning på den variabel som räknar antal gånger som paddorna paddorna rör sig och variabeln som räknar antal krockar.
    • Kör programmet StrollingTurtles med DrJava's debugger inställd med tre "breakpoints" i main-metoden: Nämligen vid de två anropen av moveRandom() och vid anropet av distance. Visa att du kan styra debuggern så att programmet "hoppar in" i respektive metod när de anropas och styra debuggern så att varje sats i respektive metod körs stegvis och att programmet "hoppar tillbaks" til mainmetoden. Du använder "Step Into" för att hoppa in i metoderna och "Step Over" i metoderna.
  5. Skriv ett program (dvs en ny klass med en main-metod) med namnet Traktrix.

    Programmet (dvs main-metoden) skall skapa en värld med 4 paddor. Paddorna skall placeras en vid varje hörn (20 punkter från hörnet i både x- och y-riktning). Låt sedan paddorna gå mot varandra med steget 20 ett upprepat antal gånger tills paddorna är mindre än 20 bildpunkter från världens mittpunkt. Lägg in en fördröjning i loopen så att du ser hur de rör sig.

    Tips: Du behöver använda metodena som nämndes början på detta dokument.

    Testa programmet (dvs main-metoden) med -knappen. Så här kan det se ut efter 15 steg och när programmet avslutas:
    Bild Bild
  6. Givet följande satser i interaktionsrutan:
    World w = new World(300,300); int x=100 + (int) (50*Math.random()); int y=100 + (int) (50*Math.random()); Turtle t1 = new Turtle(w,x,y); x = 100 + (int) (50*Math.random()); y = 100 + (int) (50*Math.random()); Turtle t2 = new Turtle(w,x,y); Turtle t3 = new Turtle(w); Turtle t4 = t3; Turtle t5; t2.move(40); int x1 = t1.getXPos(); int y1=t1.getYPos(); int x2 = t2.getXPos(); int y2=t2.getYPos(); double d = Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
    1. Det är 13 st variabler (w, x, y, t1, t2, t3, t4, t5, x1, y1, x2, y2, d) som deklareras i koden ovan. Vilka av dessa variabler är av primitiv typ och vilka är av objekttyp (dvs referens)? Svar
      Primitiva är de som deklareras med int eller double dvs
      x, y, x1, y1, x2, y2, x2, y2, d
      Objekttyp är de som deklareras med klassnamnen World och Turtle dvs
      w, t1, t2, t3, t4, t5
    2. Vilka anrop görs till klassmetoder? Svar
      Anrop av klassmetoder görs via klassnamnet. I detta fall metoderna random och sqrt i klassen Math.
    3. Vilka anrop av objektmetoder görs? Svar
      Anrop av objektmetoder görs via objektvariabler. I detta fall move, getXPos och getYPos
    4. Hur många objekt skapas av koden ovan? Svar
      Objekt skapas av new. Det skapas således 1 World-objekt och 3 Turtle-objekt.

      Observera alltså att satserna Turtle t4 = t3 och Turtle t5 inte skapar några objekt utan bara variabler som kan hålla reda på objekt.

    5. Varför behöver inte variablerna x och y på rad 5 och 6 deklareras
      (det står inte int x = ... )? Svar
      De är redan deklarerade på rad 2 och 3.

      Det är förbjudet att deklarare om variabler i samma metod men det är tillåtet i DrJavas interaktionsruta.

    6. Varför får man inte skriva t1 = t1 + 5; trots att man får skriva x = x + 5;? Svar
      t1 är en referens till en Turtle och för sådana objekt finns inte addition definierade.
    7. Vad menas med en void-metod? Vilka av anropen ovan är till sådana metoder? Svar
      En metod som inte returnerar något värde. Metoden move ovan är en sådan.

      (Eftersom man kan anropa en metod som returnerar värde utan att ta emot värdet kan man inte se på själva anropet om det är en void-metod. Metoden move behöver således inte vara en sådan. Man måste egentligen läsa metodens kod eller dokumentationen för att svara på frågan)

    8. Varför kan man inte skriva int z = t1.move(20); Svar
      move är en void-metod som alltså inte returnerar något värde.
    9. Varför kan man inte skriva nedanstående?
      Turtle t6; t6.move(50);
      Svar
      t6 har inte fått något värde och refererar alltså inget Turtle-objekt.
  7. Allmänna frågor
    1. Vilka datatyper har du hittills sett i Java? Svar
      Primitiva typerna int, double och boolean.
      Objekttyperna World, Turtle och String.
    2. Vad är det för skillnad på uttrycken 2 och "2"? Svar
      Det första är av heltalstyp och den andra av String.
    3. Vilka värden kan uttrycket
      (int) Math.random() * 2
      ha? Svar
      Prova och förklara resultatet!
    4. Hur gör man för att se vilka metoder som finns i klassen Math? Visa! Svar
      Googla "java Math" eller gå till Java-dokumentationen
    5. Givet följande:
      t1.getXPos(); // Sats 1 t1.move(10); // Sats 2
      Båda satserna är korrekta (om t1 är en Turtle) men en av dem är konstig.
      Vilken och varför? Svar
      Anropet t1.getXPos(); är meningslöst eftersom det enda metoden gör är att returnera ett värde och man inte tar emot detta värde.
    6. Vilka delar består ett metodhuvud av och vad betyder de? Svar
      synlighet returtyp namn(formella parametrar)

      Som synlighet har vi bara använt public och som returtyp har vi använt int, double och void.

    7. Vilka kompileringsfel blir det i nedanstående program och varför?
      public class Scope { public int method1(int x) { int ans = 1; int i = 1; while (i < x) { ans = ans*ans; } return ans; } public int method2() { ans = 2; while (i < x) { ans = ans*ans; } } }
      Svar
      method1 har en formell parameter (x) och två lokala variabler (ans och i). Dessa existerar bara i den metoden och går alltså inte att använda i method2.
      method2 måste ha en return-sats eftersom den ska returnera en int.

      (Båda metoderna har while-loopar som antingen aldrig utförs eller aldrig terminerar eftersom villkoren inte ändras i loopen. Detta ger dock inget kompileringsfel.)

Fråga

Hur många timmar har du hittills arbetat vid dator för denna kurs?


Gå till nästa lektion eller gå tillbaka

Valid CSS!