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:
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 klassenTurtle
från lektion 3.
-
Skriv en metod
moveRandom
i klassenTurtle
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. -
Skriv en metod
distance(Turtle t)
i klassenTurtle
som beräknar och returnerar avståndet från aktuell padda till paddan som refereras av parameternt
.
Metoden har en parameter som är en objektreferens. Det finns en minilektionen som beskriver detta.
Testa metoden i interaktionsrutan! -
Skriv en ny klass
StrollingTurtles
som endast innehåller enmain
-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 metodernamoveRandom
ochdistance
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 classTexten
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 anroparThread.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:
- Gör i DrJava så får du ett tomt definitionsfönster.
- 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: -
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" imain
-metoden: Nämligen vid de två anropen avmoveRandom()
och vid anropet avdistance
. 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.
-
Kör programmet
-
Skriv ett program (dvs en ny klass med en
main
-metod) med namnetTraktrix
.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ådex
- ochy
-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 (dvsmain
-metoden) med -knappen. Så här kan det se ut efter 15 steg och när programmet avslutas: -
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));
-
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)?Primitiva är de som deklareras medint
ellerdouble
dvs
x, y, x1, y1, x2, y2, x2, y2, d
Objekttyp är de som deklareras med klassnamnenWorld
ochTurtle
dvs
w, t1, t2, t3, t4, t5
-
Vilka anrop görs till klassmetoder?
Anrop av klassmetoder görs via klassnamnet. I detta fall metoderna
random
ochsqrt
i klassenMath
. -
Vilka anrop av objektmetoder görs?
Anrop av objektmetoder görs via objektvariabler. I detta fall
move
,getXPos
ochgetYPos
-
Hur många objekt skapas av koden ovan?
Objekt skapas av
new
. Det skapas således 1World
-objekt och 3Turtle
-objekt.Observera alltså att satserna
Turtle t4 = t3
ochTurtle t5
inte skapar några objekt utan bara variabler som kan hålla reda på objekt. -
Varför behöver inte variablerna
x
ochy
på rad 5 och 6 deklareras
(det står inteint x = ...
)?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.
-
Varför får man inte skriva
t1 = t1 + 5;
trots att man får skrivax = x + 5;
?t1
är en referens till enTurtle
och för sådana objekt finns inte addition definierade. -
Vad menas med en
void
-metod? Vilka av anropen ovan är till sådana metoder?En metod som inte returnerar något värde. Metodenmove
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) -
Varför kan man inte skriva
int z = t1.move(20);
move
är envoid
-metod som alltså inte returnerar något värde. -
Varför kan man inte skriva nedanstående?
Turtle t6; t6.move(50);
t6
har inte fått något värde och refererar alltså ingetTurtle
-objekt.
-
Det är 13 st variabler (
-
Allmänna frågor
-
Vilka datatyper har du hittills sett i Java?
Primitiva typerna
int
,double
ochboolean
.
ObjekttypernaWorld
,Turtle
ochString
. -
Vad är det för skillnad på uttrycken
2
och"2"
?Det första är av heltalstyp och den andra avString
. -
Vilka värden kan uttrycket
(int) Math.random() * 2ha?Prova och förklara resultatet!
-
Hur gör man för att se vilka metoder som finns i klassen
Math
? Visa!Googla "java Math" eller gå till Java-dokumentationen -
Givet följande:
t1.getXPos(); // Sats 1 t1.move(10); // Sats 2Båda satserna är korrekta (om
t1
är enTurtle
) men en av dem är konstig.
Vilken och varför?Anropett1.getXPos();
är meningslöst eftersom det enda metoden gör är att returnera ett värde och man inte tar emot detta värde. -
Vilka delar består ett metodhuvud av och vad betyder de?
synlighet returtyp namn(formella parametrar)
Som synlighet har vi bara använt
public
och som returtyp har vi använtint
,double
ochvoid
. -
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; } } }
method1
har en formell parameter (x
) och två lokala variabler (ans
ochi
). Dessa existerar bara i den metoden och går alltså inte att använda imethod2
.
method2
måste ha enreturn
-sats eftersom den ska returnera enint
.(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.)
-
Vilka datatyper har du hittills sett i Java?
Fråga
Hur många timmar har du hittills arbetat vid dator för denna kurs?
Gå till nästa lektion eller gå tillbaka
Dölj style3dev.css för att bli av med annoteringarna!