• No results found

DD2387 Programsystemkonstruktion med C++ Tentamen 1

N/A
N/A
Protected

Academic year: 2021

Share "DD2387 Programsystemkonstruktion med C++ Tentamen 1"

Copied!
5
0
0

Loading.... (view fulltext now)

Full text

(1)

DD2387 Programsystemkonstruktion med C++

Tentamen 1

Tisdagen den 28 oktober 2014, 08:00 - 12:00

Introduktion

• Skriv dina svar på separata papper, dessa scannas in efter inlämning. Du kan skriva på båda sidor.

• Skriv namn och uppgiftsnummer på varje sida

• Grova fel ger underkänt, men gör ett försök på alla uppgifter

• Det är ingen självrättning efter tentan

Hjälpmedel

• En, eller två, valfria läroböcker om C++.

(2)

1 Sådana där grejer som åker under vatten

Det jagas en ubåt. Eller snarare, det efterfrågas information om ett oidentifierat dykande föremål, som det finns en bild på, fast den bilden var på en annan ubåt som man kan hyra för fester. Det finns dock en annan bild, fast den var tagen på en annan plats, eller det beror på, jag kommer inte ihåg.

Det är inte lätt att ha koll på den virtuella verkligheten som beskrivs i media men virtual och minneshantering måste man ha koll på i C++.

// - - - - // Unidentified Diving Object

struct UDO {

UDO() : origin(this) { } virtual void dive() {

std::cout << "blubb, blubb" << std::endl;

}

UDO * origin;

};

struct MiniUboat : UDO { virtual void dive() {

std::cout << "swoosh, swoosh" << std::endl;

} };

// - - - - int main() {

MiniUboat boat;

UDO & udo1 = boat;

UDO udo2 = udo1;

udo1.dive();

udo2.dive();

udo1.origin -> dive();

(3)

2 Generisk signalspaning

Det är inte lätt att jaga ubåtar. Man lyssnar efter sonarsignaler och avgör på något fiffigt sätt om det är minkar, ubåtar, eller något helt annat som låter.

Frågor

a) Skriv en generisk funktion som givet en mängd signaler (definerat av två iteratorer till en godtycklig signaltyp) returnerar första förekomsten av en signal som är minst dubbelt så stor som både den föregående och efterföljande signalen.

Gör inget off-by-one fel och kolla så att programmet inte kraschar om man skickar in en för liten (t.ex. tom) mängd.

Vad som ska hända om inget element som tillfredställer tidigare beskrivning påträffas är upp till dig, men implementationen är inte godkänd om den krashar vid sådant tillfälle.

b) Vad ställer din kod för krav på iteratorerna (parametrarna)?

c) Vad ställer din kod för krav på signaltypen?

3 Konsten att använda const

a) Varför bör man sträva efter att använda const där så är möjligt i C++?

4 Att bilda sin egen uppfattning

Vad fyller alla de här skriverierna för funktion, objektivt sett? Kan man inte skapa sig en egen bild av situationen igenom att lägga ihop ett och två?

Bild f; // a function object

double x = f (1, 2);

Frågor

a) Skriv klassen Bild så att ovanstående kod kompilerar. Koden behöver inte göra något vettigt.

(4)

5 Kampen mellan journalister

Det råder visst en febril verksamhet i media. Mängder med infallsvinklar produceras.

En kreativ journalist ger sig ut på spaning med helikopter för att spana på de sven- ska båtarna som spanar efter det oidentifierade dykande föremålet. En annan skribent spekulerar om den förmodade ubåten kan vara en gigantisk rysk Typhoon som är i sjönöd. Ett rykte som nästan är fakta pekar ut en rysk oljetanker som möjligt moder- fartyg efter observationen att fartyget vänt på sig (vilket fartyg som ligger löst för ankar brukar göra). Men kanske ligger tankern därute på internationellt vatten enbart för att slippa hamnavgift. Ja det är många konstiga historier och referenser som cirklar runt.

Även om det är svårt att hålla koll på medial fakta, så måste man ha koll på const och referenser när man skriver C++.

struct Journalist { Journalist() {}

Journalist(const Journalist &) = delete;

bool investigate (const Journalist & j, Rumor fact);

// ...

};

bool Journalist::investigate(const Journalist & j, Rumor fact) { if (fact.as_told_by(j) != 0 ) {

Rumor more_facts = this->drink_beverage_with(j);

this->write(story, more_facts, j.get_story());

}

return true;

}

// TODO:

//

// as_told_by // get_story

// drink_beverage_with // write

Frågor

(5)

6 En destruktiv jakt

En del tycker att den pågående jakten efter oidentifierade undervattensfarkoster är rent destruktiv. En cprog-student observerar att destruktorn är helt åt fanders.

struct Hunt {

std::vector<UDO *> * v;

Hunt() {

v = new std::vector<UDO *>();

}

void seek(Water w) {

while (w.suspicous()) { Sound s = w.listen();

if (s != w.normal())

v -> push_back(new UDO(s));

} }

~Hunt() {

delete [] v;

} };

Frågor

a) Vad är problemet/problemen med destruktorn i Hunt?

b) Hur borde destruktorn skrivas?

c) Vilka automatiskt genererade medlemsfunktioner brukar ingå i det som tidigare (c++98) kallades för "Rule Of Three"?

References

Related documents

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

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

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