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
moveRandomi klassenTurtlesom 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 klassenTurtlesom 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
StrollingTurtlessom 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 metodernamoveRandomochdistancefö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
StrollingTurtlesmed 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
StrollingTurtlesmed 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 medintellerdoubledvs
x, y, x1, y1, x2, y2, x2, y2, d
Objekttyp är de som deklareras med klassnamnenWorldochTurtledvs
w, t1, t2, t3, t4, t5 -
Vilka anrop görs till klassmetoder?
Anrop av klassmetoder görs via klassnamnet. I detta fall metoderna
randomochsqrti klassenMath. -
Vilka anrop av objektmetoder görs?
Anrop av objektmetoder görs via objektvariabler. I detta fall
move,getXPosochgetYPos -
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 = t3ochTurtle t5inte skapar några objekt utan bara variabler som kan hålla reda på objekt. -
Varför behöver inte variablerna
xochypå 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 enTurtleoch 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. Metodenmoveovan ä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
movebehö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);
t6har 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,doubleochboolean.
ObjekttypernaWorld,TurtleochString. -
Vad är det för skillnad på uttrycken
2och"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
publicoch som returtyp har vi använtint,doubleochvoid. -
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; } } }
method1har en formell parameter (x) och två lokala variabler (ansochi). Dessa existerar bara i den metoden och går alltså inte att använda imethod2.
method2må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!