Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Relevanta dokument
Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

Lösningsförslag till tentamen TDP004 Objektorienterad Programmering Teoretisk del

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

SP:PROG3 HT12 Tenta

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

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

TDDI14 Objektorienterad programmering

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

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

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

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

TENTAMEN OOP

Arv. Objektorienterad och komponentbaserad programmering

TDDC76 - Programmering och Datastrukturer

Tentamen EDAF30 Programmering i C++

LÖSNINGSFÖRSLAG TENTAMEN

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

TENTAMEN OOP

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Tentamen *:85/2I4123 C

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

allokeras på stacken dynamiskt new delete

Polymorfi. Objektorienterad och komponentbaserad programmering

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Introduktion till arv

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

TENTAMEN OOP

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

F8: Typkonvertering i C++

Programsystemkonstruktion med C++

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

TDDC76 Programmering och datastrukturer

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen EDAF30 Programmering i C++

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Arv bakgrund (kap. 9)

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

DD2387 Programsystemkonstruktion med C++ Tentamen 2

OOP Objekt-orienterad programmering

5 Arv och dynamisk bindning FIGUR

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen, EDA501 Programmering M L TM W K V

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

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

Tentamen i Programmering

tentaplugg.nu av studenter för studenter

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det).

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Objektsamlingar i Java

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

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

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Kurskod D0010E Datum Skrivtid 5tim

Laboration 13, Arrayer och objekt

Objektorienterad programmering i Java

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen OOP

Det finns många flaggor till g++,

C++-programmets beståndsdelar

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

Tentamen i Grundläggande programmering STS, åk 1 lördag

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

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

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Konstruktion av klasser med klasser

TDDC76 - Programmering och Datastrukturer

Klasshierarkier - repetition

Tentamen, EDAA10 Programmering i Java

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

Tentamen EDAF30 Programmering i C++

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

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

Tentamen ID1004 Objektorienterad programmering April 7, 2015

Lösningsförslag till exempeltenta 2

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

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

OOP Tentamen

1 Klasser och objektorientering Vad är objektorientering?

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

Tentamen EDAF30 Programmering i C++

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Transkript:

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag Datum: 2008-08-14 Tid: 08-12 Plats: PC6-PC7 i E-huset. Jour: Per-Magnus Olsson, tel 285607 Jourhavande kommer att besöka skrivsalarna varje timme under skrivtiden. Hjälpmedel: Teoretisk del: Inga. Praktisk del: En bok om C++. Betygsättning: Max antal poäng: 42 med 21 poäng vardera på teori och praktikdel. Poäng Betyg 36-44 5 30-37 4 23-29 3 0-22 U Anvisningar: Börja med den teoretiska delen. När du är klar med den lämnar du in den och får den praktiska delen. När du har lämnat in den teoretiska delen kan du inte återvända till den. Skriv svaret på varje uppgift på ett separat blad. Uppgifterna är inte ordnade efter svårighetsgrad. Lycka till!

TDP004 Objektorienterad Programmering Teoretisk del 1. En viss funktion finns i tre versioner: A, B och C enligt nedan. Det enda som skiljer dem åt är inparametern. A. double Calculate(LargeObject object) B. double Calculate(LargeObject* object) C. double Calculate(LargeObject& object) Om LargeObject tar upp mycket minne, hur påverkas exekveringstiden för version B jämfört med version A? Snabbare, långsammare eller ingen skillnad? Varför? Om LargeObject tar upp mycket minne, hur påverkas exekveringstiden för version C jämfört med version A? Snabbare, långsammare eller ingen skillnad? Varför? (6p) Båda: snabbare pga mindre minneskopiering. 2. Jämför funktionerna static int DoSomething(LargeObject& object) int DoSomething(LargeObject& object) const Vad är skillnaden mellan en const-funktion och en static-funktion (funktionerna är identiska i övrigt)? Kan en funktion vara både static och const? Förklara varför eller varför inte? (3 + 3p) En const-funktion får använda men inte ändra på medlemsvariabler. Den får bara anropa andra funktioner som är const. En static-funktion existerar oberoende av alla instanser av klassen och får därför enbart använda variabler och andra funktioner som är static. Det behöver inte ens finnas någon instans av klassen för att en static-funktion ska existera. En funktion kan inte vara både const och static, detta eftersom definitionerna på en static och en const-funktion motsäger varandra. 3. Du ska använda koden för klassen Vehicle som basklass för subklassen Motorcycle. När du designar Motorcycle ser du att du kommer att använda och ändra medlemsvariablerna på många ställen, så du vill kunna göra detta utan att använda Getfunktionerna. Med nedanstående kod fungerar dock inte detta på det sätt som du skulle vilja. Varför? Hur vill du lösa det och vad får din lösning för några konsekvenser? (4p) class Vehicle Vehicle(int vehicleid, std::string vehiclecolor); ~Vehicle(); void SetOwner(Person* Owner);

; Person* GetOwner() const; int GetVehicleID() const; std::string GetVehicleColor() const; private: int m_id; Person* m_owner; std::string m_color; Medlems-variabler/funktioner som är private ärvs inte till basklasser, dvs är omöjliga att komma åt direkt i basklasserna. Ett förslag är att flytta alla medlemsvariabler som är private till att vara protected istället. Detta påverkar inte existerande interface utåt, eftersom andra, icke-ärvande klasser inte kommer åt protected data. Om andra klasser ärver från basklassen påverkas dessa på så vis att de nu får tillgång till de medlemsvariabler som tidigare var private. De kommer dock att fungera på samma sätt som tidigare, men koden kanske känns lite omständig nu när det är möjligt att direkt komma åt variablerna. 4. Vad är multipelt arv? I kursen tog vi upp ett välkänt problem med multipelt arv. Beskriv detta. (4p) Det är när en klass ärver från mer än en klass. Problem inträffar när man har en arvshierarki enligt nedan. Båda klasserna B och C implementerar den virtuella funktionen f(), medan D inte gör det. Vad som händer D->f() anropas är odefinierat. A virtual int f(); B int f(); C int f(); D 5. I samband med arv är det viktigt att tänka på minneshantering. Vad är det som är särskilt med minneshanteringen vid arv och hur löser man det? (2p) Programmeraren måste se till att allt minne som subklassen allokerat dynamiskt lämnas tillbaka. Detta löses genom att ha en virtuell destruktor i basklassen. Om man inte har detta anropas inte subklassens destruktor, och det minne som subklassen har allokerat dynamiskt lämnas inte tillbaka.

Praktisk del 1. Implementera klassen Lightbulb med två public-variabler: name av typen std::string och strength av typen int. Skriv sedan en medlemsfunktion i samma klass: void PrintSortedLightbulbs(std::vector<Lightbulb*> lightbulbs) vilken först sorterar i ordning enligt följande ordning: glödlamporna ska sorteras i alfabetisk ordning på sortens glödlampa, och om det finns flera glödlampor av samma sort så ska dessa sorteras så att en med lägre styrka kommer före en med högre styrka. Efter att vectorn har sorterats ska den skrivas ut, från första till sista elementet. Ovanför utskriften av typen och styrkan ska det stå Type strength. Exempel på utskrift: Type strength ----------------- Diode 5 Diode 12 LowEnergy 10 LowEnergy 30 Normal 25 (7p) Det är viktigt att sorteringskriteriet är korrekt eftersom det kan behövas två jämförelser för att sortera korrekt. Det är möjligt att anropa sort med andra funktioner än en statisk medlemsfunktion, detta är ett av många möjliga sätt att lösa det. #include <string> #include <vector> #include <algorithm> #include <iostream> class Lightbulb Lightbulb(void); ~Lightbulb(void); std::string type; int strength; static bool Sorting(const Lightbulb* a, const Lightbulb* b)

std::string typea = a->type; std::string typeb = b->type; if(typea == typeb) return (a->strength < b->strength); else return typea < typeb; void PrintSortedLightbulbs(std::vector<Lightbulb*> lightbulbs) std::vector<lightbulb*>::const_iterator i; //Sort vector. sort(lightbulbs.begin(), lightbulbs.end(), Sorting); //Print vector std::cout << "Type Strength"<<std::endl; std::cout << "-------------"<<std::endl; ; for(i = lightbulbs.begin(); i < lightbulbs.end(); ++i) std::cout<<(*i)->type <<" " <<(*i)->strength <<std::endl; 2. Implementera en basklass Testcase med de båda subklasserna TestAddition, TestSubtraction. Klassen TestCase ska ha en funktion Run vilken ska ta två parametrar av typen const int, och utföra lämplig operation på dessa, och resultatet av operationen ska returneras. Subklasserna ska implementera funktionen Run, och vilken operation som ska utföras kan man se i klassnamnet. Låt kompilatorn verifiera att funktionen Run inte ändrar några medlemsvariabler. Efter att du har implementerat dessa klasser, skapa en instans av varje subklass och lägg dessa i en std::list. Iterera genom alla instanser i listan och anropa Run för vart och ett av elementen, med av dig valda inparametrar (10p). Enbart koden för TestCase och dess subklasser ges här. class Testcase

Testcase(void); virtual ~Testcase(void); virtual int Run(const int a, const int b) const = 0; ; class TestAddition : public Testcase TestAddition() ; ~TestAddition() ; int Run(const int a, const int b) const return a + b; ; class TestSubtraction : public Testcase TestSubtraction() ; ~TestSubtraction() ; int Run(const int a, const int b) const return a - b; ; class TestMultiplication : public Testcase TestMultiplication() ; ~TestMultiplication() ; int Run(const int a, const int b) const return a * b; ;

3. Skriv en funktion int ConvertToBinary(const std::string number) som konverterar en binär representation av ett tal till en vanligt heltal. Du får förutsätta att number enbart innehåller ettor och nollor. Exempel: om ConvertToBinary anropas med en sträng innehållande 110111 så bör den returnera 55, om den anropas med 101 så ska den returnera 5 etc (5p). int ConvertToBinary(const std::string number) int exponent = 0; int sum = 0; //Iterate from the end, as the least significant bit is at the end. for(int i = number.size() - 1; i >= 0; i--) //We only care if the number is 1. if(1 == number[i]) sum += static_cast<int>(pow(2.0, exponent)); exponent++; return sum; Det inns många olika sätt att lösa den här uppgiften detta är ett av dem.