• No results found

Tentamen i 2D1387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "Tentamen i 2D1387 Programsystemkonstruktion med C++"

Copied!
4
0
0

Loading.... (view fulltext now)

Full text

(1)

Tentamen i 2D1387 Programsystemkonstruktion med C++

Datum: Lördag 22 oktober, 9-13

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

Tid: 4 timmar

Skriv tydligt! För godkänt krävs 23 poäng. Maximal poäng är 39. There is an english translation on the last page.

1. (a) Vad skriver följande kod ut? 6p

(b) Multipelt arv kan medföra problem. Vad för problem? Förklara och exemplifiera genom att ändra i koden nedan. 2p (c) Att både Mummy och Daddy ärver från Granny kan medföra pro- blem. Vad för problem? Förklara och exemplifiera genom att ändra i

koden nedan. 2p

#include <iostream>

using namespace std;

struct Granny {

virtual void hello() { cout << "Granny says hi" << endl; } };

struct Mummy : Granny {

virtual void hello() { cout << "Mummy says hi" << endl; } };

struct Daddy : Granny {

virtual void hello() { cout << "Daddy says hi" << endl; } };

struct Baby : Mummy, Daddy {

virtual void hello() { cout << "Gagoh" << endl; } };

void hello(Mummy m) { m.hello();

}

int main() { Baby b;

Mummy & m = b;

m.hello();

b.Daddy::hello();

hello(b);

return 0;

}

1

(2)

2. (a) Skriv en typparametriserad funktion, check_duplicates, som givet ett intervall returnerar sant om intervallet innehåller duplicerade ele-

ment. 4p

(b) En programmerare klagar på att implementationen av check_duplicates inte klarar att kolla kommandoradsargumenten.

int main(int argc, char * argv []) {

if (check_duplicates(argv, argv + argc)) cerr << "Duplicated arguments";

...

Vad är problemet med check_duplicates? 2p

(c) Lös a och b genom att skriva två typparametriserade funktioner varav

den ena funktionen är specialiserad. 3p

(d) Med typeinfo kan man avgöra vilken typ en parameter har. Det är ändå svårt att lösa både a och b med enbart en funktion med samma

signatur som i a-uppgiften. Varför? 3p

3. (a) Koden nedan kompilerar inte. Vilka rader kompilererar inte? Beskriv varför. Du behöver bara titta på raderna 21-28 8p 01 struct Mother {

02 Mother(const char * f, const char * c = "Mother") : 03 family_name(f), christian_name(c) {};

04 const char * family_name;

05 const char * christian_name; // const char * 06 };

07

08 struct Son : Mother {

09 Son(char * c, const char * f) :

10 Mother(f), christian_name(c), family_name(f) {};

11 char * const christian_name; // char * const 12 const char * family_name;

13 };

14

15 int main() {

16 void * void_pointer;

17 Mother * Hillary_Heap = new Mother("Hillary", "Heap");

18 Son Sid_Stack("Sid", "Stack");

19 char * s = "hej";

20

21 Son * Harry_Heap = Hillary_Heap;

22 void_pointer = Hillary_Heap;

23 Mother & Sara_Stack = Sid_Stack;

24 char * jills_name = Hillary_Heap -> christian_name;

25 const char * sids_name = Sid_Stack.christian_name;

26 Hillary_Heap = void_pointer;

27 Sara_Stack.christian_name = "Sara";

28 Sid_Stack.christian_name = "Lara";

29 };

(b) I C kan man bara explicit typkonvertera på ett sätt. I C++ finns det fler sätt. Vilka? Förklara dem med exempelkod. 4p

2

(3)

4. I koden för textspelet monsterspel finns en spelarklass och en monsterklass som ärver av Actor. Det finns flera subklasser till monsterklassen; troll, vargar m.m. som läses in i en monstervektor via funktionen.

vector<Monster *> LoadMonsters(string filename) { /* ... */ } Spelet fungerar att spela men spelaren dör alldeles för lätt vid monster- strider. Man har därför nyligen lagt till en metod som ska testa strider med de olika monstren.

void test_fighting(vector<Monster *> monsterlist) { vector<Monster *>::iterator i;

for (i = monsterlist.begin(); i != monsterlist.end(); i++) { Spelare spelare("Testspelare", 120, 18, 18);

fight(&spelare, *i);

} }

Spelet kraschar med den nya koden. Du får i uppgift att titta på fightkoden och utröna vad som är galet.

void fight(Actor * hitting, Actor * receiving) { bool dead = false;

while (! dead) {

dead = hitting->hit(receiving);

if (dead) {

cout << receiving->name() << " was killed by the mighty "

<< hitting->name() << endl;

delete receiving;

}

swap(hitting, receiving);

} }

(a) Beskriv utförligt varför programmet kraschar? 2p (b) Beskriv med en mening varför programmet kraschar? 1p (c) Även om koden påstås fungera felfritt om test_fighting inte är med så kan man misstänka att det kvarstår problem. Vad för problem? 2p

3

(4)

Rudimentary english translation

1. (a) What is the output of the following code

(b) There may be problems with multiple inheritance. What kind of pro- blems? Explain and exemplify by altering the given code example.

(c) There may be problems when both Daddy and Mummy are derived from Granny. What kind of problems? Explain and exemplify by altering the given code example.

2. (a) Write a template function, check_duplicates, that given a range re- turns true if the range contains duplicated arguments.

(b) A programmer complains that the implementation of check_duplicates does not work correctly when checking the command line arguments.

What is the problem?

(c) Solve a) and b) by writing two template functions of which one is specialized.

(d) Using typeinfo one is able to determine the type of a parameter. But it is still difficult to solve both a) and b) using solely one function with the same signature as in a). Why is that?

3. (a) The following code does not compile. What lines does not compile?

Describe why. You need only look at lines 21-28.

(b) Explicit type conversion in C can only be done in one way. Describe and exemplify the different kinds of type conversion in C++.

4. 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 etc that are loaded by LoadMonsters.

...

The game works but the player dies all too easily when battling monsters.

A test method has recently been added to test monster fights.

...

The game crashes with the new code. You have been assigned to look at the fight code and find out what is faulty.

(a) Describe in detail why the game crashes.

(b) Describe with one sentence why the game crashes.

(c) Even though the game is said to work correctly without test_fighting, one might suspect that there are problems. What problems?

4

References

Related documents

(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

a) Vad är en funktor? Vad är det för skillnad på en funktor och en funktion- spekare? Hitta på ett exempel där en funktor skulle vara mer användbar. än en

Skriv en generell funktion som givet ett intervall i en generell siffervektor (man vet inte om det är heltal eller flyttal) och en kompetensnivå (en int), returnerar antal förekomster

a) Skriv en generell implementation av apply. 8p b) Ge två exempel på hur du anropar apply. Låt sekvenserna vara en in- byggd array och en STL-behållare. Låt f vara en vanlig

c) Både deklaration och definition för bar och baz är korrekta trots att de inte överensstämmer helt. Vad är orsaken till att detta är tillåtet? 3p d) Trots påståendet i uppgift

på åtgärd där så är möjligt. För att minska kompileringstiderna och underlätta underhåll vill man undvika beroenden mellan klasser. Vi vill utöka klassen B genom att

När använder man dem som argumenttyp? När bör en funktion vara const? Hänvisa till uppgift a med motivering där så är lämpligt. 6p c) Vilken är anledningen till att man gör

b) Varför kan inte definitioner ligga i headerfilen? 3p c) inline och template är undantag från regeln i deluppgift b). Varför måste. dessa ligga i