Tentamen i DD2387 Programsystemkonstruktion med C++
Datum: Tisdag 15 januari 2008, 14-18
Hjälpmedel: En eller två valfria läroböcker om C++
Tid: 4 timmar
Alla rätt ger 6 bonuspoäng. Grova fel ger underkänt (betyg U). Om inte alltför många grova fel görs ges möjlighet att komplettera till godkännt betyg(betyg U*
eller FX) mer information om komplettering kommer att stå på kurshemsidan.
Gör ett försök på alla fem uppgifter. Tentaresultat anslås inte enligt längre på anslagstavla i enlighet med ny policy från KTH centralt. Lycka till!
1. Polisens interna metoder
I denna uppgift ska du vara mycket noga med const, public, private och protected. Den kod du skriver ska kompilera och uppfylla dessa kriterier.
• Klassen Polis har ingen kopieringskonstruktor.
• Klassen Polis har inga relationer till andra klasser.
• Klassen Polis har utöver metoden internt fem medlemsfunktioner
• men enbart ett heltal som medlemsvariabel.
• Metoden internt returnerar alltid true.
// indata polis, utdata true
bool Polis::internt(const Polis & polis) { Polis p;
p[ this->think(polis) ] = polis.maybe(this->appeal(polis));
return *this + p;
}
(a) Deklarera och implementera klassen Polis och dess metoder (skriv implementationen direkt i headerfilen). Du behöver enbart deklarera metoden internt.
(b) Vilka av metoderna kan deklareras protected?
(c) Vilka av metoderna kan deklareras private?
(d) Du behöver inte deklarera/implementera någon konstruktor, varför?
1
2. Virtuellt struct A {
A() : a(*this) {}
virtual void foo() { std::cout << "1 "; } A & a;
};
struct B : public A {
virtual void foo() { std::cout << "2 "; } };
struct C : public B {
virtual void foo() { std::cout << "3.1 "; } };
struct D : public B {
virtual void foo() { std::cout << "3.2 "; } };
struct E : public C {
virtual void foo() { std::cout << "4.1 "; } };
struct F : public D {
virtual void foo() { std::cout << "4.2 "; } };
int main() { C c;
D d;
E e;
F f;
B & b1 = e; // referens B b2 = f;
A & a1 = b1; // referens A & a2 = b2; // referens a1.foo();
a2.foo();
std::cout << std::endl;
a1.a.foo();
a2.a.foo();
std::cout << std::endl;
c.a.foo();
d.a.foo();
}
(a) Vad skriver programmet ut när man kör det?
(b) Finns det några polymorfa anrop i koden och i så fall var?
2
3. Binärt
Ett binärt sökträd är en datastruktur som används i grundläggande algo- ritmkurser. Binärträdet innehåller två pekare left och right samt sökbart data. Binärträdet har tre metoder; insert som stoppar in data sorterat i trädet, exists som returnerar sant om datat finns i trädet och false annars, samt is_empty som returnerar true/false om trädet är tomt eller inte.
(a) Deklarera ett typparametriserad binärträd med ovannämnda meto- der och medlemmar.
(b) Implementera insert rekursivt m.hj.a en hjälpfunktion som tar data som ska sorteras in samt en referens till en pekare. Den rekursiva algoritmen är ungefär, om noden är tom skapa en ny nod med datat annars om datat är större än nodens data stoppa in i högerträdet annars stoppa in i vänsterträdet.
(c) Vad kräver din funktion av det typparametriserade datat? Vad hän- der om kravet inte är uppfyllt?
4. Kasta loss
(a) I C++ kan man typkonvertera på fler sätt än i C. Varför?
(b) Utred huruvida typkonvertering sker i compile-time eller inte.
(c) Berätta om dynamic_cast. Vad använder man det till? Vad är in- och utdata?
(d) Vad finns det för andra sätt att typkonvertera i C++?
5. Arv
Arv är en central del av C++ det finns inte i C.
(a) Vad har man arv till?
(b) Hur kan man avgöra om en pekare pekar på en subklass? Visa med en if-sats.
(c) Kan man emulera arv i C m.hj.a preprocessordirektiv?
3