Laboration 2. Objektorienterad programmering. Syfte

Relevanta dokument
Laboration 2. returnerar true om det är omöjligt för roboten att göra move() utan att. exekveringsfel erhålls, annars returnera false.

Programmering = modellering

Mer om metoder och abstraktioner

Objektorienterad programmering

Objektorienterad programmering

Metoder och top-down design

Föreläsning 4. Föreläsning 4

Föreläsning 4. Top-Down Design Metoder Parameteröverföring. Metoder Parameteröverföring

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningsförslag övning 2.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Lösningsförslag: Instuderingsfrågor, del D

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Objektorienterad programmering D2

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lab5 för prgmedcl04 Grafik

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen, EDA501 Programmering M L TM W K V

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

TENTAMEN OOP

Arv och polymorfism i Java

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Malmö högskola 2008/2009 CTS

Laboration 4: Digitala bilder

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Grundläggande programmering med C# 7,5 högskolepoäng

TENTAMEN I. OBJEKTORIENTERAD PROGRAMMERING för Z1. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Tentamen, EDAA10 Programmering i Java

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Tentamen, EDAA20/EDA501 Programmering

trafiksimulering Intro OU5 trafiksimulering

Föreläsning 3-4 Innehåll

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen i Programmeringsteknik I, ES,

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Objektsamlingar i Java

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen TEN1 HI

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Administrivia. hh.se/db Verónica Gaspes (Kursansvarig) 2 Mattias Enervall (Övningsassistent) Examination. 1 Skriftlig tentamen (betyg)

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Laboration A Objektsamlingar

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Administrivia. hh.se/db Verónica Gaspes (Kursansvarig) 2 Daniel Petersson (Labassistent) Examination. 1 Skriftlig tentamen (betyg)

Laboration 3, uppgift En klass för en räknare

Laboration 1 - Grunderna för OOP i Java

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

tentaplugg.nu av studenter för studenter

TENTAMEN OOP

Objektorientering i liten skala

Del A (obligatorisk för alla)

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Föreläsning 5. Föreläsning 5

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen OOP

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen i Programmering

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen, EDA501 Programmering M L TM W K V

Att skriva till och läsa från terminalfönstret

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Exempel på program med objekt Klass med main-metod. Föreläsning 3-4 Innehåll. Övning Viktiga begrepp

Föreläsning 13 Innehåll

JAVA Mer om klasser och objektorientering

Transkript:

Laboration 2 Objektorienterad programmering Syfte Syftet med dessa uppgifter är att få övning i att använda en färdig klass samt att bryta ner ett programmeringsproblem i små meningsfulla delproblem, dvs tänka i olika abstraktionsnivåer. Ni skall försöka och minimera användningen av upprepade instruktionssekvenser, och i stället deklarera lämpliga metoder (abstraktioner). Som en riktlinje bör de metoder ni definierar inte innehålla mer än 10 satser. Redovisning Lämna in samtliga källkodsfiler som en komprimerad zip-fil i Fire. Metoderna ni utvecklar skall ha beskrivande namn och en kommentar som anger för- och eftervillkor: // before: none // after: robot is facing opposite direction public static void turnaround() { robot.turnleft(); robot.turnleft(); Introduktion I denna laboration skall ni programmera en robot som modelleras av den givna klassen Robot. En robot vistas i en enkel värld, som modelleras av klassen RobotWorld. Världen består av ett rutmönster av celler som är objekt av klassen Cell. Det finns tre olika typer av celler, mörka celler, ljusa celler och murar. INSTITUTIONEN FÖR DATAVETENSKAP Chalmers Tekniska Högskola Besök: Rännvägen 6 Telefon: +46 (0)31-772 6154 E-post: alexg@chalmers.se Web: http://www.cse.chalmers.se/edu/course/tda540/

En robot befinner sig på en viss plats i världen (som anges av ett objekt av klassen Location) och har en riktning (som anges med statiska heltalskonstanterna Robot.NORTH, Robot.EAST, Robot.SOUTH eller Robot.WEST). Roboten kan förflytta sig i världen i horisontell respektive vertikal riktning och utföra enkla instruktioner. Om roboten försöker förflytta sig utanför världen eller ta sig igenom en mur uppstår ett exekveringsfel. De instruktioner som en robot kan utföra är: void move() void turnleft() void makedark() void makelight() boolean ondark() boolean frontisclear() boolean atendofworld() Location getlocation() int getdirection() void setdelay(int t) förflyttar sig ett steg framåt; om roboten hamnar utanför världen eller i en mur fås ett exekveringsfel vrider sig 90 åt vänster färgar rutan den står på till mörk; om rutan redan är mörk fås ett exekveringsfel färgar rutan den står på till ljus; om rutan redan är ljus fås ett exekveringsfel returnerar true om roboten står på en mörk ruta, annars returneras false returnerar true om det är möjligt för roboten att göra move() utan att ett exekveringsfel erhålls, annars returnera false returnerar true om det är omöjligt för roboten att göra move() utan att hamna utanför världen, annars returneras false returnerar robotens position i världen som ett objekt av typen Location returnerar robotens riktning sätter hastigheten med vilken roboten rör sig; parametern t anger antalet millisekunder mellan varje rörelse Börja med att skapa en nytt projekt i IntelliJ och kopiera samtliga filer från zip-filen som finns på kursens hemsida under fliken Laboration 2 med namn i projektets src catalogen.

Uppgift 1 I filen Cleaner.java finns ett program i vilket en värld och en robot skapas. Koden har följande utseende: public class Cleaner { private Robot robot; public static void main(string[] args) { Cleaner cleaner = new Cleaner(); cleaner.createenviroment(); cleaner.cleancorridors(); private void createenviroment() { RobotWorld world = RobotWorld.load("src/square.txt"); robot = new Robot(1, world.getnumcols() - 2, Robot.WEST, world); robot.setdelay(250); // The robot cleans the corridor by making the colour of each cell light // before: The room has four corridors, forming a square // The robot is located in beginning of one of the corridors, facing // the corridor in counter-clockwise direction. // Each corridor has a length of five cells. // All cells in the corridors are dark. // after: The robot has the same location and facing the same direction. private void cleancorridors() { //This is your work to do! Om du kompilerar och kör klassen Cleaner visas ett fönster med en värld och robot. Inget mer händer eftersom metoden cleancorridors ännu inte gör någonting. Det är din uppgift att fullborda denna metod, enligt den specifikation av metoden som anges av kommentarerna i koden ovan och som vidareutvecklas i texten nedan. Klassen innehåller en instansvariabel robot av klassen Robot, en main-metod, samt de båda instansmetoderna createenviroment() och cleancorridors(). Metoden createenviroment skapar först en värld. Världen är ett objekt av klassen RobotWorld som refereras via variabeln world. Världen skapas genom att anropa metoden RobotWorld.load, som har en textfil square.txt som parameter. Textfilen square.txt definierar hur världen kommer att se ut. Sedan skapar metoden createenviroment roboten som refereras via instansvariabeln robot. Detta sker i satsen: robot = new Robot(1, world.getnumcols() - 2, Robot.WEST, world); De två första parametrarna till konstruktorn (1 och world.getnumcols() - 2) anger i vilken position i världen roboten skall placeras. Den tredje parametern (Robot.WEST) anger robotens riktning och den sista parametern (world) anger vilken värld roboten skall bebo.

I världen har cellen längst upp till vänster positionen (0,0). Det är möjligt att fråga världen hur stor den är. Genom att anropa metoden getnumcol() tar vi reda på hur många celler världen har i horisontell led (= antalet kolumner). Om vi vill ta reda på antalet celler världen har i vertikal led (= antal rader) finns metoden getnumrow(). Slutligen gör metoden createenviroment ett anrop av metoden setdelay för att sätta med vilken hastighet roboten skall röra sig. Parametern till setdelay anger hur många millisekunder det är mellan varje rörelse. (a) Din uppgift är att komplettera metoden cleancorridors(), på så sätt att roboten genomlöper korridorerna moturs och städar dessa genom att sätta de mörka cellerna till ljusa (enligt figurerna nedan). Du får anta att samtliga korridorer är 5 celler långa och att alla celler är mörka. Före Efter Vidare får du anta att roboten står i ett hörn och är riktad på så sätt att den har ytterväggen på sin högra sida (vilket innebär att en förflyttning av roboten sker i moturs riktning i korridoren). Samtliga dessa antaganden är förvillkor till metoden cleancorridors(). När roboten utfört sin uppgift skall den befinna sig i samma tillstånd (dvs ha samma position och riktning) som den hade innan uppgiften utfördes. Din lösning skall endast använda instruktionerna move(), turnleft() och makelight(). Tips Du skall vara observant på det så kallade staket-stolp-problemet, som resulterar i ett off-by-one-error. Problemet har fått sitt namn pga det faktum att det åtgår n + 1 stolpar för att sätta upp n sektioner staket, vilket ofta leder till att en stolpe saknas när sista sektionen skall sättas upp. Analogin här är att om roboten befinner sig i början av en korridor som är 5 celler lång, behöver roboten endast göra 4 move-operationer för att komma till slutet av korridoren. När roboten står i början av en korridor är det därför lämpligt att den inte städar cellen den står i utan endast de celler som den har framför sig i korridoren. Inför en sådan metod (abstraktion) och ge den namnet clearcorridorinfront. Specificera även för- och eftervillkor (skall ges som kommentarer i koden).

(b) Förändra ditt program från deluppgift (a) på så sätt att programmet klarar av att handha korridorer som redan delvis är städade, dvs där någon cell initialt är ljus (se figuren nedan). Förvillkoret all cells in the corridors are dark till metoden cleancorridors() skall alltsåtas bort. Gör inte förändringarna direkt i klassen som du skapade i deluppgift (a) utan kopiera koden till en ny klass Cleaner2 och gör ändringarna i denna klass. Glöm inte att uppdatera förvillkoren, samt att byta alla förekomster av Cleaner till Cleaner2 (fyra ställen med en kommentar inräknat). Programmet skall testas med världen som finns beskriven i filen square2.txt. I metoden createenviroment() behöver du därför också byta ut filnamnet square.txt mot square2.txt. (c) Nu skall du förändra ditt program från deluppgift (b) på så sätt att roboten klarar att städa byggnader där de horisontella och vertikala korridorerna är olika långa (se figuren nedan). Förvillkoret each corridor has a length of five cells till metoden cleancorridors() tas alltså bort. Gör inte förändringarna direkt i klassen som du skapade i deluppgift (b) utan kopiera koden till en ny klass Cleaner3 och gör ändringarna i denna klass. Du skall testa ditt program med världen som beskrivs av filen square3.txt. (d) Nu skall du förändra ditt program från deluppgift (c) på så sätt att förvillkoret facing the corridor in counter-clockwise direction till metoden cleancorridors() tas bort. Roboten skall alltså klara av att städa korridorerna även medurs (se figuren nedan). Om roboten står i slutet av en korridor och är riktad mot väggen, är det enkelt att ta reda på om den förflyttar sig medurs eller moturs. Har roboten en vägg på sin vänstra sida är riktning-

en medurs och roboten skall svänga runt hörnet genom att vrida sig 90 åt höger, annars är riktningen moturs och roboten skall svänga runt hörnet genom att vrida sig 90 åt vänster. Gör inte förändringarna direkt i klassen som du skapade i deluppgift (c) utan kopiera koden till en ny klass Cleaner4 och gör ändringarna i denna klass. Du skall testa ditt program med världen som beskrivs av filen square3.txt. Testa ditt program för såväl då robotens rörelseriktning är moturs som medurs. För att få roboten att gå medurs ändras robotens riktning i metoden cleancorridors() till Robot.SOUTH. (e) Nu skall du förändra ditt program från deluppgift (d) på så sätt att det klarar av att roboten placeras på en godtycklig position i någon korridors längdriktning (se figuren nedan). Förvillkoret the robot is located in beginning of one of the corridors till metoden cleancorridors() tas alltså bort. Tips: Det är nödvändigt att spara undan robotens startposition för att uppfylla eftervillkoret the robot has the same location till metoden cleancorridors(). Detta görs med hjälp av operationen getlocation(), som returnerar positionen som ett objekt av klassen Location. För att kontrollera om två objekt startposition och currentposition av klassen Location är lika används instansmetoden equals enligt startposition.equals(currentposition)

Om ni kör programmet från deluppgift (d) med världen som ges i bilden ovan kommer resultatet att bli enligt bilden ovan. Den första delen av korridoren i vilken roboten påbörjade städningen är alltjämt ostädad. Ni måste alltså införa en metod som städar en korridor fram till och med en viss given position (i detta fall robotens ursprungliga startposition). Positionen (ett objekt av klassen Location) ges som parameter till metoden. Kalla metoden cleancorridoruptoposition. Gör inte förändringarna direkt i klassen som du skapade i deluppgift (d) utan kopiera koden till en ny klass Cleaner5 och gör ändringarna i denna klass. Testa programmet med samma värld och med samma initiala placering av roboten som i deluppgift (d). Testa också programmet såväl för då roboten förflyttar sig medurs som moturs, samt med att placera roboten mitt på en korridor (det du behöver göra är att ändra parametern world.getnumcols() - 2 i metoden createenviroment() till förslagsvis värdet 4). (f) Slutligen skall vi ta bort förvillkoret the room has four corridors, forming a squarer till metoden cleancorridors() och ersätta detta med förvillkoret the corridors form a closed loop. Roboten skall alltså klara av att städa korridorer enligt scenariot i figuren nedan. Ni måste kombinera abstraktionerna cleancorridorinfront och cleancorridoruptoposition till en enda abstraktion: städa korridoren tills en given position nåtts eller om en sådan position inte påträffas i korridoren tills slutet av korridoren. Abstraktionen måste återrapportera om städningen avslutats vid den givna positionen eller inte. Testa programmet med världen som beskrivs av filen loop.txt, såväl för då roboten förflyttar sig medurs som moturs.

Uppgift 2 I filen MazeFinder.java finns ett program i vilket en värld och en robot har skapats. Roboten befinner sig i ingången till en labyrint och uppdraget roboten skall utföra är att förflytta sig till utgången av labyrinten (enligt figurerna nedan). Före Efter Din uppgift är att komplettera metoden findexit(). Problemet med att ta sig igenom en labyrint, som är enkelt sammanhängande (dvs där vägarna inte bildar några slingor) kan lösas genom att följa ena väggen. Man skall alltså se till att alltid ha en vägg på på sin vänstra sida (eller att alltid ha en vägg på sin högra sida). För att kunna följa en vägg (i detta fall på den vänstra sidan) och förflytta sig ett steg har vi fyra olika fall att beakta: Sväng inte och flytta ett steg framåt Sväng vänster och flytta ett steg framåt Vänd om och flytta ett steg framåt Sväng höger och flytta ett steg framåt

Uppgift 3 I filen Escaper.java finns ett program i vilket en värld och en robot har skapats. I världen finns ett rektangulärt rum med en dörr som är en cell bred. Roboten befinner någonstans inuti rummet och har en godtycklig riktning. Det uppdrag roboten skall utföra är att förflytta sig till utgången och stanna i denna riktad mot världen utanför rummet (enligt figurerna nedan). Före Efter Din uppgift är att komplettera metoden movetoentrance(). Testa ditt program genom att placera roboten på olika positioner i rummet och med olika startriktningar på roboten.