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

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

Arv och polymorfism i Java

Objektsamlingar i Java

TUTORIAL: KLASSER & OBJEKT

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

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

Objektorienterad programmering D2

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

Laboration 1 - Grunderna för OOP i Java

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Länkade listor och automatisk testning

Objektorienterad programmering Föreläsning 5

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

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

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Föreläsning 5-6 Innehåll

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

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.

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

Lab5 för prgmedcl04 Grafik

Malmö högskola 2008/2009 CTS

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

JAVA Mer om klasser och objektorientering

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

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

TUTORIAL: SAMLING & KONSOLL

Relationer mellan objekt

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Föreläsning 1 & 2 INTRODUKTION

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Java, klasser, objekt (Skansholm: Kapitel 2)

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Övningar Dag 2 En första klass

Labyrinter Algoritmer och datastrukturer Obligatorisk Laboration nr 6

Modeller, Objekt och Klasser

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

Statistik över heltal

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Klasser och objekt. Henrik Johansson. August 20, 2008

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Chapter 4: Writing Classes/ Att skriva egna klasser.

Programexempel: tärningsspel. Programexempel: tärningsspel Kasta tärning tills etta. Klassen Die Specifikation. Slumptalsgenerator Klassen Random

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

Objektorienterad programmering i Java

Objekt, Klasser, Paket m. m.

PROGRAMMERINGSTEKNIK TIN212

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Agenda. Objektorienterad programmering Föreläsning 13

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

Föreläsning 13 Innehåll

OOP Objekt-orienterad programmering

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

Tentamen, EDAA10 Programmering i Java

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Lösningsförslag övning 2.

OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540) Ansvarig: Jan Skansholm, tel eller

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

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

Kopiering av objekt i Java

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

Introduktion. Byggstenar TDBA

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

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.

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Design av en klass BankAccount som representerar ett bankkonto

Tentamen OOP

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

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Programmering för språkteknologer II, HT2014. Rum

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Transkript:

(7) Objektinteraktion Objektorienterad programmering 2 Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt. Mål Efter övningen skall du kunna konstruera ett program med flera klasser och där flera objekt samverkar för att lösa ett problem. Du skall förstå hur man kan koppla ihop objekt genom att konstruktorn i en klass sparar objektreferenser till andra objekt i klassens instansvariabler. Utvecklingsmiljö BlueJ på valfri plattform. Litteratur Kursboken kap -2. Färdig programkod Given programkod finns på kursens hemsida i zip-filen er->programkod för labbarna->sticks.zip. Labbgrupper Arbetet genomförs och redovisas i grupper om två personer. Redovisning Senaste redovisningsdag, se kurs-pm samt Fire. Om du inte registrerat labbgrupp i Fire än: Gör laboration 0.0 innan du fortsätter! Ladda upp följande till Fire: o källtextfiler i java, alltså filer med namn som slutar på.java, för de klasser du utvecklat själv, d.v.s. Sticks.java, ComputerPlayer.java, HumanPlayer.java, samt GameEngine.java o README.txt med allmänna kompmentarer om lösningen. Glöm inte att trycka på SUBMIT i Fire!

2 (7) Problembeskrivning Ett objektorienterat program blir intressant först när flera objekt tillsammans löser ett problem. Man kan då fråga sig hur de olika objekten kan känna till varandras existens. Ett objekt kan i princip använda ett annat objekt på två sätt. Antingen har (äger) objektet det andra objektet för sig själv och bestämmer helt över dess öde (aggregationsrelation), eller så delas det andra objektet mellan flera objekt. I det senare fallet säger man att ett eller flera objekt känner till eller är associerade till det gemensamma objektet. Kopplingen mellan två objekt kan vara enkeleller dubbelriktad. I ett klassdiagram i modelleringsspråket UML ritar man en har -relation med en diamantpil, och en association med ett streck. En pilspets anger att relationen är enkelriktad. Om pilen är oriktad (ingen pilspets) känner objekten till varandra ömsesidigt. I det vänstra klassdiagrammet nedan kan man utläsa att ett A-objekt har ett B-objekt och ett C-objekt, i det högra delar ett A- och ett D-objekt ett gemensamt B-objekt. A och D kan alltså påverka B oberoende av varandra. B kan vara någon form av gemensam resurs som flera objekt utnyttjar. B A A B D Hur implementerar man ovanstående relationstyper i Java? Det finns flera möjligheter, här följer två schematiska exempel. Antag att klasserna A, B, C och D är givna. Vi visar här bara de detaljer som har med relationerna att göra. Aggregation ( har ) I klassen A gör vi på följande sätt : class A { private B bref; private C cref; public A() { bref = new B(); cref = new C(); Om vi skapar ett A-objekt med new A() så kommer A:s konstruktor att skapa de två B-objekten automatiskt och vi får då en instans av ovanstående klassdiagram. Association ( känner till ) I klassen A gör vi på följande sätt : C class A { private B bref; bref syftar på inparametern bref public A(B bref) { this.bref = bref; this.bref syftar på instansvariabeln bref

3 (7) och motsvarande i D class D { private B bref; public D(B bref) { this.bref = bref; Som vi ser ovan kan inga A- eller D-objekt skapas utan att ange referenser till ett B-objekt när objekten skapas. Eftersom A och D beror av B måste vi skapa B-objektet först, och sen A- och D-objekten i valfri ordning: B b = new B(); A a = new A(b); // koppla ihop a med b D d = new D(b); // koppla ihop d med b De skapade objekten och deras inbördes relationer kan visas i ett objektinstansdiagram: a :A bref b :B d :D bref Studera dessa exempel noga och förvissa dig om att du förstått innan du går vidare! Av klassdiagrammet framgår egentligen inte entydigt om A och D skall dela samma B-objekt, eller kunna vara associerade till var sitt B-objekt, och koden ovan tillåter givetvis även att A och D får var sitt B-objekt. Sådan information kan behöva preciseras i kommentarer i diagrammet för att man säkert skall veta hur det är tänkt.

www.cse.chalmers.se/ /~holmer/ 4 (7) Uppgift Vi skalll göra ett objektorienterat program som spelar tändsticksspelet. Spelet skalll spelas av två spelare, datorn och användaren. Man börjar med en hög av 2 stickor. Varje spelare tar t i turordning bort en eller två stickor från högen. Den som tvingas ta den sista stickan förlorar. Användaren gör första draget. Nedan finns ett exempel som visar hur dialogen med användaren skall se ut. Följande klasser skall finnas i programmet (de beskrivs mer i detalj senare) ): Sticks Håller reda på stickorna. ComputerPlayer Spelar spelet för datorns räkning. HumanPlayer Sköter dialogen med användaren. Drar stickorr för användarens räkning. GameEngine Styr spelordningen mellan datorn och användaren. UserInterface Läser in heltal från tangentbordet. Skriver textmeddelanden på skärmen. Klassen är färdig. I BlueJ kommer projektet att se s ut så här Sticks left: 2 Sticks left: 9 2 Sticks left: 6 2 Sticks left: 3 Sticks left: 0 Sticks left: 7 2 Sticks left: 4 Sticks left: BlueJ skiljer ej mellan de två relationstypr perna vi pratat om utan ritar allt som associationer. GameEngine skalll skapa och ha ett objekt av varje av de övrigaa klasserna. ComputerPlayer och HumanPlayer skall dessutom associeras till Sticks, samtt HumanPlayer till UserInterface. Använd metodiken som beskrivits på föregående sidor. Allmänna krav på koden Lösningen skall uppfylla följande krav: Inga utskrifter av typ System.ou ut.println får göras i de egenutvecklade klasserna. För meddelanden till användaren och inläsning av tal skall UserInterface användas. Alla instansvariabler skall vara privata utan undantag! Inga slaskvariabler får f deklareras som instansvariabler. De skall vara lokala i resp. metod där de används. lab2.docx Objektorienteradd programmering, DAT050, DAI 2, 6/7, lp 2 Nr 5

5 (7) Lämplig arbetsgång Börja med att implementera och testa klassen Sticks. Skapa ett objekt på objektbänken i BlueJ och kontrollera att objektet fungerar som det skall. Tänk igenom testfallen! Fortsätt med ComputerPlayer och HumanPlayer. Skriv metodstubbar i klasserna, d.v.s. tomma metoder som endast returnerar 0. Detta räcker tills vidare för att kunna utveckla GameEngine. Implementera därefter GameEngine. Deklarera instansvariablerna och skriv konstruktorn. Kompilera och skapa ett objekt. När detta fungerar skriver du rungame. Utveckla loopen stegvis. Kompilera och testa ofta! När ovanstående kompilerar och exekverar felfritt kan du börja utveckla metoden move i ComputerPlayer och HumanPlayer, alltså en move-metod i vardera klassen. Om du gjort rätt skall nu spelet fungera felfritt! Klassbeskrivningar public class Sticks Håller reda på antalet kvarvarande stickor. private int maxnoofsticks; Ursprungligt antal stickor. private int sticksleft; Kvarvarande antal stickor. Konstruktorer public Sticks(int n) Skapar en tändstickshög med n stickor genom att initiera instansvariablerna på lämpligt sätt.. public Sticks() Skapar ett tändstickshög med 2 stickor. 2 public void newgame() Initierar/återställer objektet till ursprungligt antal stickor. public int sticksleft() Returnerar antalet kvarvarande stickor. public int take(int n) Om n 2 minskas antalet stickor med n och det kvarvarande antalet ges som returvärde, om det finns så många, annars returneras -. 2 En konstruktor kan anropa en annan med syntaxen this(parametrar);

6 (7) public class ComputerPlayer Spelar spelet för datorns räkning. private Sticks sticks; Referens till objektet med tändstickshögen. Konstruktor public ComputerPlayer(Sticks sticks) Initierar instansvariabeln sticks med referensen i inparametern sticks. public int move() Genomför datorns drag genom att dra ett lämpligt antal stickor från sticks. För vissa antal av kvarvarande stickor finns en vinnande spelstrategi. Denna skall tillämpas i metoden på ett generellt sätt, lösningen får ej baseras på en uppräkning av specialfall. Metoden skall returnera antalet kvarvarande stickor. public class HumanPlayer Sköter dialogen med användaren samt drar stickor från högen för användarens räkning. private Sticks sticks; Referens till objektet med tändstickshögen. private UserInterface ui; Referens till användargränssnittsobjektet. Konstruktorer public HumanPlayer(Sticks sticks,userinterface ui) Initierar instansvariablerna med de givna objekten. public int move() Frågar användaren efter ett antal stickor att dra. Vid ev. fel skall lämpligt felmeddelande skrivas ut och användaren ges en ny chans. Detta fortgår tills ett korrekt antal angivits. Därefter dras stickorna från högen. Metoden skall returnera antalet kvarvarande stickor. public class GameEngine Styr spelordningen mellan datorn och användaren. private Sticks sticks; private ComputerPlayer computerplayer; private HumanPlayer humanplayer; private UserInterface ui; Konstruktor public GameEngine() Skapar objekt av samtliga övriga klasser och sparar referenser till dessa i instansvariablerna. Kopplar ihop ComputerPlayer-objektet med Sticks-objektet, samt HumanPlayer-objektet med Sticks-objektet och UserInterface-objektet.

7 (7) public void rungame() Låter upprepade gånger användaren och datorn göra var sitt drag drag. Användaren skall alltid göra första draget. Om något av dragen resulterar i en tom hög skall vinnaren utropas och spelet avslutas. public class UserInterface Klassen innehåller metoder för inläsning av heltal från tangentbordet, samt utskrifter av meddelanden i textfönstret. Denna klass är färdig. public int nextint() Läser ett heltal från tangentbordet. Talet returneras. Om felaktiga tecken förekommer i indataraden ignoreras resten av raden och 0 returneras. Meddelandemetoder som skriver olika meddelandetexter i textfönstret. public void sticksleftmsg(int n) public void howmanysticksmsg() public void illegalmovemsg() public void computerwinmsg() public void playerwinmsg() Lycka Till!