• No results found

Tentamen i DD2387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "Tentamen i DD2387 Programsystemkonstruktion med C++"

Copied!
9
0
0

Loading.... (view fulltext now)

Full text

(1)

Tentamen i DD2387 Programsystemkonstruktion med C++

Datum: Fredag 24 oktober 2008, 14-18

Hjälpmedel: En eller två valfria läroböcker om C++ id:

Tid: 4 timmar

Skriv inte ditt namn på tentan. Under tentan kommer ett id-nummer att delas ut och skrivas på tentan. Anteckna ditt id-nummer på separat papper. När du lämnar in tentan ska du säga vad du heter till tentavakten så att denne kan göra en extrakontroll av idnummret.

Tentan rättas i en första omgång två och två av er själva tio minuter efter tentans slut. Du måste komma tillbaka för att rätta! Skriv svaren direkt på tentan. Om du inte avser få tentan rättad kan du lämna in blankt.

Grova fel ger underkänt (betyg F). Om inte alltför många grova fel görs ges möjlighet att komplettera till godkänt betyg (betyg U* eller FX) mer information om komplettering kommer att stå på kurshemsidan. Gör ett försök på alla uppgifter. Tentaresultat anslås inte längre på anslagstavla i enlighet med ny policy från KTH centralt. Lycka till!

1. Länkade banklån

Banken Funny May har problem med dåliga lån. Till sin stora bestörtning har man insett att dessa dessutom är intimt sammanlänkade med andra bankers dåliga lån och man kan inte bli av med dem.

Hjälp banken att implementera en rekursiv funktion remove som tar bort lånen från en länkad lista av banklån.

Funktionen remove ska ta två parametrar. Dels en referens till en pekare till en länkad lista (Linked- List<T> * &) och dels data av typen T. Funktionen ska ta bort alla förekomster av datat i listan template <class T>

struct LinkedList { LinkedList<T> * next;

T data;

// ...

Var noga med syntaxen! Algoritmen är grovt förenklad: om noden inte är tom kontrollera om nodens data är samma som datat och i så fall ta bort noden. Gör därefter ett rekursivt anrop och skicka övriga otestade(!) element i listan.

(2)

2. Ju fler kockar desto sämre soppa

Sveddbank har det svettigt med sina kundrelationer. Man har därför infört ett nytt ärendehanteringssy- stem. Detta är implementerat som en intern stack för att garantera att man alltid hanterar det “hetaste”

ärendet. Dessutom så finns det en maxgräns av ärenden så att inte finansrådgivarna spenderar tid på gamla surdegar.

template <class T>

class Stack {

static const int max = 8;

T mp[max];

int nrItems;

T * current;

public:

Stack() : nrItems(0), current(mp) {}

T pop() {

if (nrItems > 0) { nrItems -= 1;

if (current == mp)

current = mp + max - 1;

else

current -= 1;

return *current; // return copy } else {

throw out_of_range("Do not handle exceptions in this exercise");

} }

void put(T t) {

if (nrItems < max) nrItems += 1;

*current = t; // overwrite existing current += 1;

if (current == mp + max) current = mp;

}

template <class S> friend ostream & operator<< (ostream & os, Stack<S> & s);

}; // End of class Stack

Rådgivare x har problem att hinna med alla sina ärenden och chefen anvisar y samt nyanställde s att hjälpa till. Chefen skriver följande rader kod i main:

y = x; // Mr Y will help Mr X

Stack <int> s = x; // Mr S is hired to help Mr X där x och y är deklarerade sedan tidigare

int main() {

Stack<int> x; // Mr X Stack<int> y; // Mr Y // ...

2

(3)

(a) Till stackprogrammerarens stora förvåning kompilerar chefens rader utan anmärkningar. En erfaren DD2387:are förklarar att vissa metoder skapas även om man inte skrivit dem. Vilka metoder har skapats?

(b) Resultatet av chefens rader längre ner i programmet är ganska soppigt, kunderna får dubbla budskap eller inga budskap alls. Vad är tokigt?

(c) DD2387:aren får i uppdrag att implementera metoderna i fråga (a) så att chefens kod gör något vettigt. Man kommer överens om att “help Mr X” (se kodkommentar) betyder att man tar över (flyttar från en stack till en annan) de två översta ärendena hos X. Implementera metoderna. Var noga med const och referenser.

(4)

3. Omorganisationer

Sammanslagningar, uppköp och ideliga omorganisationer har gjort det oklart hur gamla nedärvda metoder och nya metoder egentligen utförs.

Givet ett kontor, NewDeal, som ärvt sina metoder från OldWay, så får man två olika börsindex från en och samma kontorsinstans beroende på hur man refererar till det.

struct NewDeal : OldWay { /*...*/ }; // NewDeal inherits from OldWay //...

NewDeal office1;

NewDeal & nd = office1;

OldWay & ow = office1;

if (nd.index() - ow.index() > 0.01) // greater than!

cout << "WHY?";

Deklarera klasserna NewDeal och OldWay och implementera metoden index (returnerar ett hårdkodat flyttal) så att koden ovan alltid skriver ut “WHY?”.

4

(5)

4. Konstant kris utan logik

Banken Le Män & Bröder börjar förhandla med Bankaku- ten om omedelbar hjälp. Deklarera och implementera klas- serna State och Bank så att nedanstående kod kompilerar utan anmärkningar. Inget vettigt behöver utföras. Skriv gärna implementationen i klassdeklarationen för enklare rättning. Var noga med const.

void negotiate(State state, const Bank & bank) { if (bank.nogood())

state[state.next++] = bank.in_depth();

}

(6)

5. Typ störst ba

På en presskonferens tycker sig Funny May vara den största banken någonsin i historien och därför omöjligt kan snubbla omkull. Hjälp journalisterna dubbelkolla detta påstående genom att implementera en jämförelsefunktion.

(a) Skriv en typparametriserad funktion max som returnerar det största av två argument.

(b) Vad kräver din typparametriserade funktion av argumenten?

(c) Vad returnerar din funktion max, motivera kortfattat?

(d) Varför går det inte att skriva en maxfunktion som returnerar det största av två olika typer av argument?

6

(7)

6. Virtuella subprimelån

En av orsakerna till bankkrisen i USA är svårgenomträngliga finansieringsinstrument där man paketerat reella värden med virtuella värden. Att ha koll på det virtuella är väldigt viktigt i C++.

Vad skriver programmet nedan ut när man kör det? Alla rätt krävs.

struct A {

A() : a(this) {}

virtual void foo() { std::cout << "a "; } A * a;

};

struct B : public A {

virtual void foo() { std::cout << "b "; } };

struct C : public B {

virtual void foo() { std::cout << "c "; } };

struct D : public C {

virtual void foo() { std::cout << "d "; } };

struct E : public D {

virtual void foo() { std::cout << "e "; } };

int main() { D d;

E e;

B & b = e;

C c = d;

A & a1 = c;

A a2 = b;

a1.foo();

a2.foo();

std::cout << std::endl;

a1.a->foo();

a2.a->foo();

std::cout << std::endl;

d.a->foo();

std::cout << std::endl;

}

(8)

Fyll i felkoder enligt rättningsmallen på varje uppgift. Markera felet på tentan i marginalen. Underlåtelse att rätta allvarliga fel kan påverka resultatet på rättarens egen tenta. Felkoden är fyra siffror X-Y-ZZ där X är frågenummer, Y är allvarlighetsgrad och Z ett fel-id. Allvarlighetsgraden är 1 - litet fel, 9 - allvarligt, 5 - okänd allvarlighetsgrad för oförutsedda fel (dessa får fel-id 99). Om det saknas plats, använd kringliggande frågor som är utan anmärkningar, ersätt frågenummer med aktuell fråga.

8

(9)

Fråga allvarlig felkod övriga fel kommentar 1

2a

2b

2c

3

4

5a

5b

5c

5d

6

Rättat av id Rättat av id

References

Related documents

För att parera bristerna i denna inte helt glasklara logik så tänker skolan tvångsinskriva studenter på en obligatorisk kurs i BSB-byråkrati, en kurs som man inte kan examineras i

Markera felet på tentan i marginalen (samma fel kan härledas till två ställen ibland) och skriv utförlig kommentar i tabellen nedan samt, om lämpligt, kort kommentar på tentan

Implementera A och B så att följande kod kompilerar. Det är mycket allvarligt att göra fel på const. Observera att parametern till operator+= antingen är en kopia eller

The problem appears restricted to 30GB first generation Zune players. Later 80GB and 120GB models appear to

4. a)What is the program output? b)Does it make any difference if all methods were virtual? c)Write an explicit call inside B assignment method that call its base class

(a) Skriv en funktion som givet två strängar returnerar index till första eventuella förekomsten av en sådan omkastning. Om ingen sådan påträffas

The code for “monsterspel” - the text game has a player class and a monster class both derived from Actor. There are several subclasses to the Monster class such as Troll, Wolves

(a) Skriv en typparametriserad partitioneringsfunktion som givet ett in- tervall och ett pivotelement sorterar alla element så att de som är större än pivotelementet hamnar till höger