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++.
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();
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.
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
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"?