Övning 4. Arv och andra relationer



Relevanta dokument
Introduktion till arv

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Högskolan Dalarna sid 1 av 5 Data-sektionen Hans-Edy Mårtensson

TDDC76 Programmering och datastrukturer

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Polymorfi. Objektorienterad och komponentbaserad programmering

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Tentamen EDAF30 Programmering i C++

Laboration 1: Figurer i hierarki

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

Malmö högskola 2008/2009 CTS

Övningar Dag 2 En första klass

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

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

TENTAMEN OOP

5 Arv och dynamisk bindning FIGUR

TDDC76 - Programmering och Datastrukturer

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

Programmering B med Visual C

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

TDDI14 Objektorienterad programmering

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

C++ Slumptalsfunktioner + switch-satsen

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

TENTAMEN I DATAVETENSKAP


Classes och Interfaces, Objects och References, Initialization

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

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

TDIU01 - Programmering i C++, grundkurs

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

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Laboration A Objektsamlingar

Minnestilldelning (allokering) och frigörande (avallokering) av minne

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

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

DD2387 Programsystemkonstruktion med C++ Tentamen 2

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

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

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Tillämpad programmering

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Generiska konstruktioner. Kursbokens kapitel 13

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

Klasshierarkier - repetition

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

C++ Objektorientering - Klasser. Eric Elfving

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Skizz till en enkel databas

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

1 Klasser och objektorientering Vad är objektorientering?

Gissa det hemliga talet

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

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

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

TENTAMEN OOP

Laborationsanvisning. Geometriska figurer. Steg 2, laborationsuppgift 3. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

OOP Objekt-orienterad programmering

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

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Tentamen OOP

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

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Lab5 för prgmedcl04 Grafik

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

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Typkonvertering. Java versus C

Arv. Objektorienterad och komponentbaserad programmering

Programsystemkonstruktion med C++

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

JAVA Mer om klasser och objektorientering

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

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

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

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

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

LÖSNINGSFÖRSLAG TENTAMEN

TUTORIAL: KLASSER & OBJEKT

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

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

Transkript:

Högskolan Dalarna Objektorienterad Analys & Konstruktion, 10p 1 Övning 4. Arv och andra relationer Stegvis förfining som programutvecklingsmetodik Det är mycket viktigt att du jobbar stegvis när du utvecklar dina klasser. Börja med den enklaste konstruktorn någon enkel metod. Koda, kompilera och provkör. Gå sedan vidare och ta en metod i taget. I varje steg vet du då att om något blir fel, så måste det bero på det som du nyss har lagt till! 1. Designa en Person-klass som håller reda på ett namn och födelsedatum. Klassen Person ska ha två konstruktorer. - Person(char *name, int birthdate); - Person(); //Ska fråga efter namn och födelsedatum med hjälp av cout. Lägg till metoder för att skriva ut och beräkna vem som är äldst - const char *info(); // Returnerar en pekare till en textsträng med namnet och födelsedatum - void print(); // Skriver ut namnet och födelsedatumet med hjälp av info - bool isolderthen(person &enperson); // Returnerar "false" om enperson är äldre. Prova att skapa några objekt och anropa deras metoder. 2. Modifiera din klass så att den kan hålla reda på hur många personer som skapats i programmet. Skriv ut antalet innan du lämnar main(). Detta måste du lösa genom att i klassen införa ett attribut enligt följande, static int personcounter;. Glöm inte att initsiera din personräknare till 0. Det kan du göra i klassens definitionsfil med följande sats, int Person::PersonCounter = 0;. Lägg till en statisk medlemsfunktion som returnerar antalet personer. 3. Fråga om ett antal. Skapa sedan ett fält med Person-pekare av denna storlek. Loopa igenom och skapa varje objekt genom att dessa frågar om sina data. Skriv ut info om alla objekt. Sök sedan rätt på den yngsta och äldsta personen i fältet och skriv ut deras namn.

Högskolan Dalarna Objektorienterad Analys & Konstruktion, 10p 2 4. Designa och implementera klassen Familj. Ett objekt av typen Familj kan innehålla 0, 1, eller flera Personobjekt. Följande metoder ska ingå i klassen Familj. Familj(const char *efternamn); // Skapar ett familje-objekt med ett visst efternamn, men utan personer - Familj() // Skapar ett familje-objekt där efternamnet läses in med hjälp av // cin >>. Familj(const char *efternamn, Person medlemmar[]); // Skapar ett familje-objekt med ett visst efternamn och medlemmarna // tas från fältet medlemmar. void addmedlem(person &enperson); // Lägger till en medlem i familjen - const *char info(); // Returnerar en pekare till en textsträng med information om hela // familjen (all dess medlemmar) - void print(); // Se klassen Person - Person getmedlem(int i); // Returnerar en pekare till den i:te medlemmen i familjen, om den // finns. Om i är mindre än 0 eller större än antal medlemmar 1 // ska värdet 0 (NULL) returneras. int antalmedlemmar(); // Returnerar antalet medlemmar i familjen Skriv ett testprogram och skapa 2-3 familjer. 5. Modifiera din familjeklass så att du kan hålla reda på hur många familjer som skapats i programmet. Skriv ut antalet innan du lämnar main(). 6. Fråga efter ett antal. Skapa sedan en vektor med Familje-pekare av denna storlek. Loopa igenom och skapa varje objekt genom att dessa frågar om sina data. Skriv ut info om alla objekt. Loopa sedan igenom fältet och lägg till några personer här och var. Skriv sedan ut all information på nytt.

Högskolan Dalarna Objektorienterad Analys & Konstruktion, 10p 3 7. Designa och implementera en klasshierarki Fordon, LandFordon respektive VattenFordon, samt Bil, MotorCykel, och SegelBat. Deklarera klassen Fordon som en abstrakt basklass. Inför minst ett attribut per klass. Lägg till en metod const char *info() i varje klass. Denna ska returnera en beskrivande textsträng för objektet i fråga. Skapa några olika sorters fordonsobjekt och skriv ut information om dem. Använd gärna slumpning om du tycker det verkar tråkigt att hitta på variabelvärden. 8. Lägg till populationsräkning i Fordonsklassen, dvs räkning av hur många Fordonsobjekt som skapas. Skriv ut antalet skapade fordon i slutet av programmet. Notera att denna gång räknar vi fordon och inte antalet bilar eller motorcyklar. 9. Skriv en funktion skapafordon(), enligt nedanstående beskrivning: Fordon *skapafordon() switch(rand()%2) case 0: return new Bil( ABC123 ); case 1: return new MotorCykel( XYZ789 ); //Det här ska aldrig inträffa prova att anropa funktionen i main() enligt följande: Fordon *fordon[10]; for (int i=0; i<10; i++) fordon[i] = skapafordon(); for (i=0; i<10; i++) cout << fordon[i]->info(); 10. Modifiera klassen Person så att en person kan äga äga ett fordon. Lägg till metoder för att lägga till och ta bort ägarskap av fordon. Ändra också klassen Persons funktion info så att även info för eventuellt fordon anropas. 11. Konstruera en klassherarki för ytor. För varje typ av yta i klassherarkin ska det vara möjligt att beräkna ytans storlek. Skapa först en generell basklass Yta. Låt därefter klasserna Triangel, Rektangel och Cirkel ärva från basklassen Yta. Skapa även de båda klasserna LikbentTriangel och Kvadrat. Dessa båda klasser ska ärva av Triangel respektive Rektangel. Skriv ett program i vilket några ytor instanseras Låt dessa objekt skriva ut storleken på de ytor som de representerar.

Högskolan Dalarna Objektorienterad Analys & Konstruktion, 10p 4 12. Modifiera klasserna i föregående uppgift så att det blir möjligt att köra följande program. #include <stdlib.h> #include yta.h Yta *yta[10]=0; for (int i=0; i<10; i++) switch(rand()%5) case 0: yta[i] = Triangel(23, 25, 31); break; case 1: yta[i] = Rektangel(23, 14); break; case 2: yta[i] = Cirkel(19); break; case 3: yta[i] = Kvadrat(25); break; case 4: yta[i] = LikbentTriangel(17); break; for (i=0; i<10; i++) cout <<yta[i]->typavyta() << Area: <<yta[i]->area() <<endl; ; 13. Konstruera en klassherarki för volymer. För varje typ av volym i klassherarkin ska det vara möjligt att beräkna volymens storlek och volymens totala yta. Skapa först en generell basklass Volym. Låt därefter klasserna RatBlock och Cylinder ärva från basklassen Volym. Klassen RatBlock består av sex stycken objekt av typen Rektangel och klassen Cylinder består av två objekt av typen Cirkel och ett objekt av typen Rektangel. Utnyttja klassen Yta från föregående uppgift. Följande program ska vara möjligt att köra när de ovanstående klasserna fungerar som de ska. #include <stdlib.h> #include volym.h Volym *volym[5]=0; for (int i=0; i<5; i++) switch(rand()%2) case 0: volym[i] = RatBlock(23, 25, 31); break; case 1: volym[i] = Cylinder(23, 14); break; ; for (i=0; i<5; i++) cout << volym[i]->typavvolym(); cout << Volym: << volym[i]->volym(); cout << Area: << volym[i]->area() <<endl;

Högskolan Dalarna Objektorienterad Analys & Konstruktion, 10p 5 14. Du ska nu beskriva ett tågsätt med hjälp av C++. Längst fram i tåget skall ett lok finnas. Till loket skall det gå att koppla in vagnar i en följd efter varandra. Det ska även gå att koppla in en vagn mellan två vagnar och ta bort en godtycklig vagn i tåget. Loket ska vara en instans av klassen Locomotiv och vagnarna ska vara instanser av klassen Waggon. Loket skall kopplas till sin vagn genom att loket får tillgång till vagnens thispekare. Vagnen som är kopplad till loket skall i sin tur ha tillgång till den this-pekare som nästa vagn i tågsättet har och den vagnen ska ha tillgång till efterföljande vagns this-pekare och så vidare. Om någon pekare inte pekar på en vagn så skall den peka på NULL, dvs 0. Varje vagn ska dessutom ha en pekare till en textsträng i vilken vagnens destination specificeras. Du ska nu konstruera klasserna Locomotiv, Waggon, Train och ytterligare någon klass. Klassen Train ska innehålla en pekare till loket och en pekare som kan peka på någon av vagnarna eller loket. Train ska innehålla följande metoder: void gotothelocomotiv(); // Ställer vagnspekaren att peka på loket void gotonextwaggon(); // Flyttar vagnspekaren att peka på nästa vagn. Om den vagn som pekaren // pekar på nu är den sista vagnen så ska vagnspekaren tilldelas värdet // NULL, dvs 0. bool thebackend(); // Om vagnpekaren pekar på NULL så returneras true i annat fall // false bool emptytrain(); // Om loket inte har någon vagn kopplad efter sig, dvs om lokets pekare // pekar på NULL, så ska funktionen returnera true i annat fall // false char *inspectwaggon(); // Returnerar en pekare på den sträng som beskriver vagnens destination. void appendwaggon(wagon *waggonpek); // Kopplar in en ny vagn längst bak på tåget Waggon *removelastwaggon(); // Kopplar bort den sista vagnen i tåget void insertwaggon(wagon *waggonpek); // Sätter in en vagn efter den vagn som vagnspekaren pekar på. Waggon *removewaggon(); // Tar bort den vagn som vagnspekaren pekar på. Vagnspekaren pekar // därefter på föregående vagn eller loket. Skriv en main-funktion och provkör dina medlemsfunktioner eftersom du skapar dem. När du är klar med klasserna så kan du skriva ett litet program som flyttar om vagnarna mellan ett par tåg så att varje vagn hamnar i det tåg som går förbi vagnens destination.