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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Programmering B med Visual C

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

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

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Tentamen ID1004 Objektorienterad programmering December 15, 2012

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

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

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

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

SP:PROG3 HT12 Tenta

Imperativ programmering. Föreläsning 4

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

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

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

Klasshierarkier - repetition

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

TDDC76 - Programmering och Datastrukturer

Polymorfi. Objektorienterad och komponentbaserad programmering

5 Arv och dynamisk bindning FIGUR

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

TDDC76 Programmering och datastrukturer

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

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

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

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

Enkla variabler kontra referensvariabel

Tentamen EDAF30 Programmering i C++

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Tentamen EDAF30 Programmering i C++

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Programsystemkonstruktion med C++

Tentamen ID1004 Objektorienterad programmering October 29, 2013

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Synlighet. Namespace Scope-operatorn Klasser Vänner

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

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

Tillämpad programmering

Objektorienterad programmering

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Teoretisk del. Facit Tentamen TDDC (6)

Repetition av OOP- och Javabegrepp

2D1387, Programsystemkonstruktion med C++ 01/02 1

TDDE44 Programmering, grundkurs

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

1 Namnkontroll (NameControl)

Repetition av OOP- och Javabegrepp

Föreläsning 2 Datastrukturer (DAT037)

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

DAT043 - Föreläsning 7

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

Intro till standardbiblioteket. Eric Elfving

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

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

TDIU01 - Programmering i C++, grundkurs

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Tentamen *:85/2I4123 C

Tentamen ID1004 Objektorienterad programmering April 7, 2015

Tentamen EDAF30 Programmering i C++

Classes och Interfaces, Objects och References, Initialization

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

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

Länkade strukturer. (del 2)

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

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

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

Introduktion till arv

allokeras på stacken dynamiskt new delete

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

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

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Obligatorisk uppgift 5

Tentamen i Introduktion till programmering

1 Klasser och objektorientering Vad är objektorientering?

Transkript:

Lösningsförslag till tentamen TDP004 Objektorienterad Programmering 2008-03-26 Teoretisk del 1a). Vad är det som skiljer en virtuell funktion och en rent virtuell funktion? Du kan förutsätta att det är vanliga medlemsfunktioner som avses. (2p) 1a) En virtuell funktion deklarerar en funktion som kan överlagras. Den får implementeras i den klassen där den är deklarerad. En rent virtuell funktion deklarerar en funktion som måste överlagras. Den får inte implementeras i den klassen där den är deklarerad (gäller C++). 1b). Vad har dessa för effekt på klassen där funktionerna är definierade? (2p) 1b) En virtuell funktion har ingen direkt effekt. Det är logiskt att virtuella funktioner används i samband med arv, men inget krav. En rent virtuell funktion gör klassen abstrakt, dvs det går inte att skapa en instans av klassen där funktionen är deklarerad. 2. Vilka är skillnaderna mellan en const funktion och en static funktion? (2p) En const funktion får inte ändra på några medlemsvariabler. En static funktion delas mellan alla instanser av klassen. Den får inte använda, och därför heller inte ändra på, några klassvariabler. 3. Det finns flera centrala objekt inom objektorientering. Definiera klass och abstraktion. (4p) Klass datastruktur som representerar ett sammanhängande objekt med data och funktioner. Användaren kan själv definiera klasser. Klasser är den grundläggande byggstenen inom OO. Omöjligt att skapa instanser av abstrakta klasser. Inkapsling Separation av interface och implementation. Genom denna separation kapslar man in hur en funktion utför något och istället tillåts andra användare bara att se interfacet, som talar om vad funktionen behöver för indata och vad den returnerar. Enbart den som implementerar funktionen behöver veta exakt hur saker görs, vilket kan vara mycket komplext, de andra kan se det som en svart låda. 4. En av orsakerna till att objektorientering utvecklades var återanvändning (eng. reuse) av kod. Beskriv hur detta underlättas inom objektorientering jämfört med icke-objektorienterade språk. (2p) Det är lättare och mera intuitivt att paketera en eller flera sammanhängande klasser jämfört med fristående funktioner i andra programmeringsparadigmer. Genom arv kan man få tillgång till basklassernas existerande funktionalitet. 5. Vad medför nyckelordet friend och vad har detta med inkapsling att göra? (3p)

Med hjälp av friend går man förbi de vanliga åtkomstrestriktionerna, och därigenom inkapslingen, och den klassen som deklarerar en annan klass/funktion som friend ger den tillgång till alla icke-publika data och funktioner. (Överkurs: detta anses dock inte bryta mot inkapslingen generellt eftersom det är den deklarerande klassen som ger en annan klass/funktion tillgång.) 6. I kursen pratade vi om standardbiblioteket STL. I detta ingår containrar av olika slag, tex associativa och sekventiella. Förklara likheter och skillnader mellan dem och ge exempel på en associativ och sekventiell container. (6p) Sekventiell container: Elementen ligger i den ordning som man lade dit dem. I fallet med vector finns omedelbar (random) access genom []-operatorn, annars måste man använda en iterator för att accessa ett visst element. Inget problem att lägga in dubletter av element. Varje element består enbart av elementet självt, inget <key, value>-pair. Exempel: std::list/ std::vector. Associativ container: Elementen ligger inte i samma ordning som man lade in dem, utan i annan ordning (sorterade som ett träd, eller i nycklarnas storleksordning tex). I fallet med map är varje element ett <key, value>-pair där man söker efter ett objekt med find(key). Det går snabbare att söka efter ett element i en map, men långsammare att lägga in. I en map får det inte finnas flera element med samma nyckel (men det är tillåtet i en multimap). Exempel: std::map.

Praktisk del 1. Endast funktionerna redovisas här. #include <math.h> double CalculateStatistics::CalculateMean (const std::list<double>& numbers) const double sum = 0.0; double mean; std::list<double>::const_iterator i; for(i = numbers.begin(); i!= numbers.end(); ++i) sum +=(*i); /*Explicit conversion is not necessary but highly recommended, it is not performed, then an implicit conversion is performed. */ mean = sum / static_cast<double>(numbers.size()); return mean; double CalculateStatistics::CalculateStandardDeviation (const std::list<double>& numbers) const std::list<double>::const_iterator i; double firstterm = 0.0; double secondterm = 0.0; double numerator; double denominator; double deviation; /*Explicit conversion is not necessary but highly recommended, it is not performed, then an implicit conversion is performed. */ double noelements = static_cast<double>(numbers.size()); for(i = numbers.begin(); i!= numbers.end(); ++i) firstterm += (*i) * (*i); secondterm += (*i); secondterm *= secondterm; secondterm /= noelements;

numerator = firstterm - secondterm; denominator = noelements - 1; deviation = sqrt(numerator/denominator); return deviation; 2. bool Uppg2::WriteTestCaseResult( const unsigned int testcasenumber, const std::string testcasename, const bool testcaseresult) const std::stringstream ss; ss << testcasenumber <<"_"<<testcasename<<".txt"; std::string filename = ss.str(); /* Open file. As we use std::ofstream, we don't need to care about the file open modes. If we use for example iostream, we need to open with std::ios::out. */ std::ofstream savefile(filename.c_str()); if(null == savefile) return false; savefile << testcasenumber <<" " <<testcasename <<" " <<std::boolalpha<<testcaseresult << '\n'; savefile.close(); return true; 3. Samtliga subklassers.h-filer måste inkludera FilterBaseclass.h och alla subklassers.cpp-filer måste inkludera motsvarande.h-fil class FilterBaseclass FilterBaseclass (const int aconstant); virtual ~FilterBaseclass (void); virtual int Filter (const int value) = 0;

protected: const int constant; FilterBaseclass:: FilterBaseclass (const int aconstant) : constant(aconstant) FilterBaseclass::~FilterBaseclass (void) I filen Bitcrush.h class Bitcrush : public FilterBaseclass Bitcrush(const int aconstant); ~Bitcrush(void); int Filter(const int value); I filen Bitcrush.cpp Bitcrush::Bitcrush(const int aconstant): FilterBaseclass (aconstant) Bitcrush::~Bitcrush(void) int Bitcrush::Filter(const int value) //No conversion should be performed. return ( constant *(value / constant)); I filen Tremolo.h class Tremolo : public FilterBaseclass Tremolo(const int aconstant); ~Tremolo(void); int Filter(const int value);

private: int n; I filen Tremolo.cpp #include <math.h> Tremolo::Tremolo(const int aconstant): FilterBaseclass (aconstant) n = 0; Tremolo::~Tremolo(void) int Tremolo::Filter(const int value) n++; //Conversion to float or double is necessary. float change = sin(static_cast<float>(n * constant)); //Explicit conversion is not necessary but highly recommended, it is not performed, then an implicit conversion is performed. return value + static_cast<int>(change); I filen Amplitudescale.h class AmplitudeScale : public FilterBaseclass AmplitudeScale(const int aconstant); ~AmplitudeScale(void); ; int Filter (const int value); I filen Amplitudescale.cpp AmplitudeScale::AmplitudeScale(const int aconstant): FilterBaseclass(aConstant) AmplitudeScale::~AmplitudeScale(void)

int AmplitudeScale::Filter(const int value) return constant * value;