TENTAMEN: Objektorienterad programutveckling. Läs detta! Skriv ditt namn och personnummer på varje blad (så att vi inte slarvar bort dem).

Relevanta dokument
TENTAMEN: Objektorienterad programutveckling. Läs detta! Skriv ditt namn och personnummer på varje blad (så att vi inte slarvar bort dem).

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

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

Föreläsning 5-6 Innehåll

PROGRAMMERING-Java Omtentamina

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

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: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Tentamen EDAF30 Programmering i C++

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

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

DAI2 (TIDAL) + I2 (TKIEK)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Tommy Färnqvist, IDA, Linköpings universitet

CHALMERS TENTAMEN. 2012/2013, lp 1 DAT042. Uno Holmer. Java API (utdelas av skrivningsvakten) Erland Holmström tel besöker tentamen

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

public boolean containskey(string key) { return search(key, head)!= null; }

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

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

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TENTAMEN. Objektorienterade applikationer CHALMERS. 2018/2019, lp 3 DAT055. Uno Holmer

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

Tentamen i Grundläggande Programvaruutveckling, TDA548

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

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

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

LyckaTill önskar Anna

TENTAMEN OOP

Generiska konstruktioner. Kursbokens kapitel 13

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

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TENTAMEN I DATAVETENSKAP

Tentamen Grundläggande programmering

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

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

Introduktion till arv

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

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

Tentamen i Objektorienterad modellering och design Helsingborg

SP:PROG3 HT12 Tenta

kl Tentaupplägg

2D1342 Programkonstruktion för F1, ht 2006

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 7 (7) Tentamen

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

Del A (obligatorisk för alla)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

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

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Tentamen i Objektorienterad modellering och design Helsingborg

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

Tentamen *:85/2I4123 C

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

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

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

LÖSNINGSFÖRSLAG TENTAMEN

Tentamen Datastrukturer (DAT036)

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

Tentamen EDAF30 Programmering i C++

Tentamen i. TDDC67 Funktionell programmering och Lisp

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

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Det finns många flaggor till g++,

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

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 i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

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

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

Tentamen Objektorienterad Programutveckling med C++

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

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

Extentamen i 2D1359 Objektorinterad modellering programmering och analys Tisdag den 13 oktober 1998 kl

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

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

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

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Transkript:

1 (10) TENTAMEN: Objektorienterad programutveckling Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad. Börja varje uppgift på ett nytt blad. Skriv ditt namn och personnummer på varje blad (så att vi inte slarvar bort dem). Skriv rent dina svar. Oläsliga svar r ä t t a s e j! Programkod som finns i tentamenstesen behöver ej upprepas. Programkod skall skrivas i C++ och vara indenterad och kommenterad. Onödigt komplicerade lösningar ger poängavdrag. Givna deklarationer, parameterlistor etc. får ej ändras. Läs igenom tentamenstesen och förbered ev. frågor. I en uppgift som består av flera delar får du använda dig av funktioner klasser etc. från tidigare deluppgifter, även om du inte löst dessa. Lycka till!

2 (10) Uppgift 1 Välj ett alternativ för varje fråga! Garderingar ger noll poäng. Inga motiveringar krävs. Varje korrekt svar ger två poäng. 1. Vilket påstående stämmer om MVC-modellen? a. den utvecklades av Ivar Jacobson b. den är ett ramverk för konstruktion av användargränssnitt c. MVC betyder Multiple Vision Control d. modellen har ingenting med OOP att göra e. inget av ovanstående 2. Vilken diagramtyp används för att beskriva beteendet hos ett objekt a. sekvensdiagram b. användningsfallsdiagram c. samarbetsdiagram d. tillståndsdiagram e. klassdiagram f. inget av ovanstående 3. Ett affärsobjekt modellerar troligen a. ett begrepp i problemdomänen b. en styrfunktion i ett börsmäklarsystem c. en gränssnittskomponent i ett kundordersystem d. inget av ovanstående 4. Vilken aktivitet utvärderar användarnyttan hos ett system a. testning b. verifiering c. validering d. inget av ovanstående 5. I vilken/vilka versioner av funktionen test används AutoPointer på ett korrekt sätt? void f( AutoPointer<int> x ) {... void g( AutoPointer<int> x ) {... AutoPointer<int> h( AutoPointer<int> x ) { (*x)++; return x; void test() { // 1 q = p; f( h( p ) ); g( p ); void test() { // 2 f( p ); g( p ); forts.

3 (10) void test() { // 3 q = p; f( q ); g( p ); void test() { // 4 q = p; f( h( p ) ); g( q ); void test() { // 5 q = p; f( h( q ) ); g( q ); void test() { // 6 f( p ); q = p; g( q ); a. 3 och 5 b. 2 och 6 c. 1 och 4 d. ingen av 1-6 e. en av 1-6 f. fler än två av 1-6 g. inget av ovanstående (10 p)

4 (10) Uppgift 2 I lösningen skall en generisk vektorklass användas, se bilagan. Ofta finns behov av att beräkna ett värde av alla elementen i en vektor, t.ex. summera eller beräkna produkten av elementen i en heltalsvektor. Beräkningen kan göras genom att successivt ackumulera resultatet element för element, i fallet summering genom addition och för produkt multiplikation. Detta beräkningsmönster kan generaliseras och man brukar då prata om en ackumulatorfunktion. En sådan funktion beräknar givet en funktion f, en vektor v och ett s.k. enhetselement u uttrycket u ( n = 0) accumulate( v, f, u) = f ( v0, f ( v1,..., f ( vn 1, u))) ( n > 0) Observera i vilken ordning vektorelementen behandlas, den saknar betydelse för summa och produkt men kan vara väsentlig för andra operationer. Enhetselementet definierar resultatet om vektorn är tom. Det väljs så att det blir neutralt för operationen, d.v.s. så att f(x,u) = x. Om t.ex. f är addition är enhetselementet 0 och vid multiplikation 1 eftersom x+0=x och x*1=x. Ex: Om add(x,y) = x+y och v heltalsvektorn [1,2,3,4,5] så beräknar accumulate( v, add, 0 ) värdet av add(1,add(2,,add(5,0))) = 1+2+ +5+0 = 15. Analogt: Om mul(x,y) = x*y beräknar accumulate( v, mul, 1 ) värdet av mul(1,mul(2,,mul(5,1))) = 1*2* *5*1 = 120. a) Definiera accumulate som en generisk funktion i C++. Funktionen skall vara generisk med avseende på vektorelementens typ, parameterfunktionen f, samt typen för enhetselementet u som skall kunna skilja sig från vektorelementtypen. (6 p) b) Definiera m.h.a. accumulate funktionen all som tar en vektor av booleska värden och returnerar true om alla vektorelementen är sanna och false annars. Till din hjälp finns funktionen 1 bool and( bool x, bool y ) { return x && y; (1 p) c) Definiera m.h.a. accumulate funktionen someodd som tar en heltalsvektor och returnerar true om minst ett av vektorelementen är udda och false annars. Tips: definiera en lämplig parameterfunktion liknande and ovan. (3 p) 1 Denna kan även definieras som en funktionsobjektklass men det saknar betydelse för uppgiften eftersom även vanliga funktioner kan skickas som argument till generiska funktioner med funktionstypparametrar.

5 (10) Uppgift 3 I lösningen skall en generisk vektorklass samt klassen Pair användas, se bilagan. En associationslista är en struktur som håller reda på en samling nyckel-värdepar, t.ex. kan ett personnamn vara associerat med ett telefonnummer där namnet representeras som en sträng och telefonnumret som ett heltal. Nycklarna är unika i samlingen, d.v.s. inget namn förekommer mer än en gång, men flera personer kan ha samma telefonnummer. Om man har måttliga krav på effektivitet kan en associationslista enkelt implementeras som en vektor av nyckel/värdepar. Uppgiften går ut på att definiera klassen AssociationList genom implementeringsarv från klassen Vector. Klassen skall vara generisk med avseende på såväl nyckel- som värdetyp så att den blir så generell som möjligt. Följande operationer skall finnas: // AssociationList class interface: support association lists // // Key: must have zero-parameter constructor, // operator= and operator== // Value: must have zero-parameter constructor and operator= // CONSTRUCTION: with (a) an integer size only // // ******************PUBLIC OPERATIONS********************* // [ ] --> Indexing with key // void insert( key, value ) --> Associate value with key // bool empty( ) --> Return true if // AssociationList is empty, false ow // int size( ) --> Return # elements in AssociationList Indexoperatorn skall kasta ett lämpligt undantag om nyckeln (index) ej finns i listan. Operationen insert skall kontrollera om nyckeln redan finns i listan och i så fall uppdatera värdet, annars sätts nyckel/värdeparet in, t.ex. sist. Övriga vektoroperationer som ej finns med i listan ovan skall ej vara synliga. Exempel på användning: AssociationList<String,unsigned long> al; al.insert( "Lisa", 819234 ); al.insert( "Sven", 142365 ); al.insert( "Allan", 978362 ); al[ "Lisa" ] = 776655; cout << al[ Sven ]; // 142365 cout << al[ Lisa ]; // 776655 cout << al.empty(); // 0 // nytt nummer cout << al.size(); // 3 cout << al[ Eva ]; // undantag kastas Tips: I definitionen av klassen kan följande användas för att förenkla koden: typedef Vector< Pair<Key,Value> > PairVector; där Key och Value är klassens generiska typparametrar. Du kan då använda namnet PairVector istället för det krångliga typnamnet Vector< Pair<Key,Value> >. (12 p)

6 (10) Uppgift 4 a) Vad skriver följande program ut? Motivera! class Base { public: Base( int N ) : X(N) { void F() { cout << "Base::F " << X << endl; virtual void G() { cout << "Base::G " << X << endl; virtual void H() { cout << "Base::H " << X << endl; void I() { G(); private: int X; ; class Sub : public Base { public: Sub( int N ) : Base(N), Y(2*N) { void F() { cout << "Sub::F " << Y << endl; void G() { cout << "Sub::G " << Y << endl; private: int Y; ; void main() { Base B(5), *p; Sub S(20); p = &S; p->f(); // a p->g(); // b p->h(); // c p->i(); // d p = &B; p->g(); // e B = S; p->g(); // f (6 p) forts.

7 (10) 4 b) Vilket av klassdiagrammen nedan beskriver modelltekniskt mest korrekt situationen vid polymorfism där ett objekt hanterar andra objekt av olika typ på ett enhetligt sätt? Motivera svaret! En möjlig implementering följer: class B { public: virtual void f() = 0; ; class C : public B { public: void f(); ; class D : public B { public: void f(); ; class A { public: A() : cur(0) { bp = new B*[2]; bp[0] = new C; bp[1] = new D; ~A() { delete bp[0]; delete bp[1]; delete [] bp; void toggle() { cur =! cur; void g() const { bp[cur]->f(); private: B **bp; int cur; ; klassdiagram 1 klassdiagram 2 klassdiagram 3 klassdiagram 4 (6 p)

8 (10) Uppgift 5 Sköldpaddsgrafik (turtle graphics) är en i många sammanhang mycket användbar och lättanvänd form av grafikgränssnitt. 2 Namnet har metoden fått från liknelsen med en sköldpadda som rör sig på en sandstrand. Sköldpaddan kan vrida sig i olika riktningar, samt hoppa(!) eller kräla en rak sträcka i sin aktuella riktning. Om sköldpaddan hoppar lämnar den inga spår i sanden, men om den krälar lämnar den ett spår. 3m 5m 2m Om vi antar att den spänstiga paddan ovan från början var riktad åt höger så har den först vridit sig 45 o medsols, krälat 3m, vridit sig 45 o motsols, hoppat 2m, vridit sig 30 o motsols, krälat 5m, och slutligen vridit sig 30 o medsols. I datorgrafiksammanhang motsvaras sköldpaddan av en tänkt ritmarkör, hoppen av förflyttningar, och krälandet av räta linjer. Följande basklass utgör en minimal stomme för sköldpaddsgrafik: 3 class Turtle { public: Turtle() : myx(0), myy(0), mydirection(0) { void Turn( double Degrees ) { mydirection += Degrees; virtual void Jump( double Length ); virtual void Crawl( double Length ) = 0; double GetX() const { return myx; double GetY() const { return myy; double GetDir() const { return mydirection; private: double myx, myy; // position double mydirection; // degrees ; void Turtle::Jump( double Length ) { double Angle = M_PI/180.0*myDirection, // to radians dx = Length*cos( Angle ), dy = Length*sin( Angle ); myx += dx; myy += dy; Sekvensen ovan motsvaras av operationerna (medsols = positiv vinkel): T.Turn(45); T.Crawl(3); T.Turn(-45); T.Jump(2); T.Turn(-30); T.Crawl(5); T.Turn(30); 2 Ibland är det enklare att rita på detta sätt än att ange koordinaterna för linjernas start- och slutpunkter. Sköldpaddsgrafik lämpar sig bl.a. för att rita vissa typer av fraktaler, t.ex. Mandelbrot-kurvor och Koch-flingor. 3 Det är väsentligt att koordinater och vinklar hanteras internt i sköldpaddsobjekten med god noggrannhet (double) för att undvika ackumulering av avrundningsfel vid långa promenader. Vid själva ritningen på skärmen anges dock alltid koordinaterna som heltal.

9 (10) Av klassdefinitionen framgår inte hur själva ritningen går till. Anledningen är här att man vill separera sköldpaddsobjektets inre tillstånd, d.v.s. position, och riktning, från dess presentation på skärmen. Tanken är att detta senare definieras i subklasser till Turtle, beroende på vilken grafikmiljö programmet skall användas i. Man kan t.ex. tänka sig de två subklasserna DOSTurtle och WindowsTurtle. Uppgiften är att definiera DOSTurtle. Subklassen skall definiera om vissa operationer i basklasen på lämpligt sätt, samt innehålla två extra: SetColor, och SetPenSize för att välja färg och linjebredd. Ritning skall ske med vald färg och linjebredd tills de ändras. För färger kan antas att det finns en typ Color med värdena WHITE, BLACK, RED, BLUE, GREEN, YELLOW. Linjebredd anges med ett heltal mellan 1 och 10. Ett nyskapat objekt skall som standard ha ritfärgen vit och penntjocklek 1. Följande grafikfunktioner i DOS är användbara för att lösa uppgiften: moveto( int x, int y); flyttar ritpositionen i grafikfönstret till punkten (x,y). lineto( int x, int y); ritar en rät linje från aktuell ritposition till punkten (x,y), som blir ny aktuell ritposition. setcolor( Color c); ändrar ritfärgen till c. setlinestyle( int style, int pattern, int thickness); Ändrar typ (heldragen streckad, ), mönster och tjocklek för linjer. Använd för enkelhets skull värdena SOLID_LINE resp. SOLID_FILL för de två första parametrarna. I DOS koordinatsystem är y-axeln riktad nedåt i fönstret. Basklassen Turtle får ej ändras. (16 p)

10 (10) Bilaga // Vector class interface: support bounds-checked arrays // // Object: must have zero-parameter constructor and operator= // CONSTRUCTION: with (a) an integer size only // // ******************PUBLIC OPERATIONS********************* // = --> Copying assignment // [ ] --> Indexing with bounds check // bool empty( ) --> Return true if Vector empty, false ow // int size( ) --> Return # elements in Vector // int capacity( ) --> Return capacity of vector // void resize( int newsize ) --> Change bounds of Vector // void reserve( int newcapacity ) --> Change Vector capacity // void push_back( Object x ) --> Add x at end of Vector template <class Object> class Vector { public: explicit Vector( int initsize = 0 ); Vector( const Vector & rhs ); ~Vector( ); bool empty( ) const; int size( ) const; int capacity( ) const; Object & operator[]( int index ); const Vector & operator= ( const Vector & rhs ); void resize( int newsize ); void reserve( int newcapacity ); void push_back( const Object & x ); ; template <class A, class B> struct Pair { Pair() { Pair( const A & f, const B & s ) : first(f), second(s) { A first; B second; ;