KARLSTADS UNIVERSITET DATAVETENSKAP TENTAMEN I DAV C05 AVANCERAD PROGRAMMERING

KARLSTADS UNIVERSITET DATAVETENSKAP TENTAMEN I DAV C05 AVANCERAD PROGRAMMERING
KARLSTADS UNIVERSITET FAKULTETEN FÖR EKONOMI KOMMUNIKATION OCH IT DATAVETENSKAP





UPPGIFT 1 (10 poäng) - Yttre kvalitetsfaktorer

Karlstads universitet

Datavetenskap

TENTAMEN I DAV C05, Avancerad programmering i C++, Onsdag 15 augusti 2001 Sid 5 av 5

<!--#include virtual="header.html" -->TENTAMEN I DAV C05, Avancerad programmering i C++, 5poäng Sid 1 av 5
Onsdag 15 augusti 2001 kl 08.15-13.15


Kursansvarig: Eivind J. Nordby Totalt: 60 poäng

Tillåtna hjälpmedel: Betygsgränser: 3=30 poäng,

  • Ett dubbelsidigt A4-ark med valfritt innehåll 4=40 poäng, 5=50 poäng

  • ett förstoringsglas

Skriv läsbart.
Alla diagram ska följa UML-standard.
Var generös med illustrationer, men en figur utan förklaring är inget svar.

<

//. . .

private:

int integer;

};



<

virtual ~MBase() { cout << "destructor MBase\n"; }

virtual char* vf() const = 0;

};


class D1 : virtual public MBase

{

public:

D1() : MBase(1) {}

virtual ~D1() { cout << "destructor D1\n"; }

char* vf() const { return "D1\n"; }

};


class D2 : virtual public MBase

{

public:

D2() : MBase(2) {}

virtual ~D2() { cout << "destructor D2\n"; }

char* vf() const { return "D2\n"; }

};


class MI : public D1, public D2

{

public:

MI() {}

virtual ~MI() { cout << "destructor MI\n"; }

char* vf() const { return D1::vf();}

};


void main()

{

MBase* a, *b, *c;

a = new D1;

b = new D2;

c = new MI;

cout << a->vf();

cout << b->vf();

cout << c->vf();

delete a;

delete b;

delete c;

}


Undantag

UPPGIFT 8 (7 poäng) (2+2+1+2)

  1. När ska du använda catch(. . .) som undantagshanterare? Vad bör du tänka på när du använder denna hanterare?

  2. Hur ska en undantagshanterare se ut som kastar vidare det nyligen fångade undantaget? Ge ditt svar i kod. Vad är syftet med att kasta ett undantag vidare?

  3. Du kan fånga undantag på olika sätt varav två kan ses nedan:

  1. catch(T e)

  2. catch(T& e)

Vilka typer av undantag kan du fånga med respektive hanterare? Fullständigt svar krävs för poäng.

  1. Destruktorn bör inte kasta undantag. Förklara ingående varför?



UML, designmönster

UPPGIFT 9 (6 poäng) (1+3+2)

Du utvecklar en programvara som använder sig av en inköpt klass DB för databashantering. Varje gång du behöver utföra en databasoperation skapar du ett DB-objekt som du begär olika tjänster av, och raderar sedan objektet. I C++ gör du ungefär så här:

DB *db = new DB;

// använd DB för att utföra databasoperationer, t.ex.

db->insert("MyName");

// och andra operationer på db

delete db;

Det du inte var medveten om när du gjorde detta var att det tog lång tid och krävde mycket resurser för varje nytt db-objekt att etablera kontakt med databasen, bl.a. därför att den var distribuerad över Internet. För att effektivisera programmet önskar du därför att det bara ska finnas ett db-objekt som hela tiden återanvänds. Frågorna går ut på att göra om ditt program för att använda designmönstret singleton i detta syfte. Bara de delar som rör singleton-mekanismen ska anges i svar B och C. Förklara kortfattat din lösning där du anser det befogat.

  1. I vilka situationer lämpar sig singleton-mönstret?

  2. Implementera singleton-mönstret i klassen DB i C++, både header-fil och C++-fil.

  3. Skriv om kodexemplet ovan så det använder singleton i stället för att själv skapa en ny instans av klassen DB.



UPPGIFT 10 (9 poäng) (2+2+3+2)

En databasklass DB, t.ex. den från föregående uppgift, innehåller objekt av klassen DbElement. De bl.a. har ett namnattribut som kan hämtas genom operationen med signatur String getName(). Databasens element behöver kunna genomlöpas i olika ordningsföljd, t.ex. i alfabetisk namnordning och i kronologisk ordning. Du gör därför en iterator-klass DbIterator för databasen. Den ska åtminstone förses med en konstruktor och operationerna next() och current(). Du deklarerar också de två klasserna NameOrderDbIterator (som du kan förkorta Nodi) och ChronoOrderDbIterator (förkortat Codi) för att sköta genomlöpning i de två nämnda ordningsföljderna.

  1. Ange tre skäl till att göra en iterator i stället för att lägga operationer för genomlöpning direkt i klassen DB eller låta klientprogrammet sköta det själv.

  2. Rita ett klassdiagram som visar klasserna DbIterator, Nodi, Codi, DB och DbElement (obs: korrekt UML) och deras inbördes relationer. Diagrammet ska innehålla namn och korrekta multipliciteter på alla associationer men behöver inte innehålla några operationer eller attribut för klasserna.

  3. Deklar1era de tre givna funktionerna i klassen DbIterator samt ev. ytterligare funktioner som måste finnas, alla med resp. för- och eftervillkor.

  4. Skriv en funktion med deklarationen void printDb(DB *db, int order), inkl dess för- och eftervillkor. Den ska använda sig av nämnda klasser för att skriva ut namn på alla element i databasen db i alfabetisk eller kronologisk ordning beroende på om parametern order har värdet 1 eller 2.

Klassdiagram, sekvensdiagram och tillståndsdiagram

UPPGIFT 11 (8 poäng) (2+4+2)

Följande är givet: en person ska flyga utomlands. Tullen kräver att personen kan visa upp en identitetshandling i form av ett pass. Personen har till en början inget pass. Ett pass tillverkas av polisen som kräver av personen, som vill ha det utfärdat, att uppge sitt namn och personnummer. Detta utgör sedan information till den nya identitetshandlingen. Efter det att personen har fått ett pass från polisen, kan personen nu visa upp ett giltigt pass för tulltjänstemannen, för att senare stiga på planet.

  1. Modellera detta genom att identifiera klasser. Uttryck alla relationer mellan klasserna genom att rita klassdiagram.

  2. Beskriv två scenarier (händelseförlopp) med hjälp av sekvensdiagram. Du ska själv identifiera två relevanta scenarier.

  3. Rita även ett tillståndsdiagram över personen.

Du kommer troligen att alternera mellan klass-, sekvens- och tillståndsdiagram medan du arbetar med uppgiften, men det är det slutgiltiga resultatet du ska lämna in.

<!--#include virtual="/~eivind/footer.html" -->





Tags: avancerad programmering, c05, avancerad, tentamen, karlstads, universitet, datavetenskap, avancerad, programmering