Tentamen i DD2387 Programsystemkonstruktion med C++ Resultat:
Datum: Tisdag 19 oktober 2010, 14-18 (rättning 18-19) sal: id:
Hjälpmedel: En eller två valfria läroböcker om C++
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 och prickas av. Tentan rättas i en första omgång två och två av er själva en timme 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. 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. Häxjakten
Byråkratiska Studiestödsbyrån BSB vill veta hur mycket studenter avser studera per termin. Byråkraterna anser det fullt rimligt att kräva tillbaka 25%från den som klarat 99%av terminen men endast avsåg att läsa 99%medan den som enbart klarat 62%fast avsåg läsa 100%kan få full (100%) ersättning. 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 och som man omregistreras på år efter år.
(a) Skriv en typparametriserad funktion fix som tar en mängd studenter, definerade av två iteratorer, och lägger till en typparametriserad kurs k till deras valbara kurser. Du får själv bestämma vad funktionen ska returnera. Funktionen ska kunna anropas så här:
// ...
fix(v.begin(), v.end(), k); // v en mängd av något slag, k en kurs av något slag
2. Verkligheten
Byråkratiska studiestödsbyrån har problem med examensarbeten som tar längre tid än därtill avsedda 20 veckor. Frågan är om dessa extra veckor finns på riktigt och om de verkligen kan användas till att söka studiemedel. I den overkliga overkligheten på BSB är detta ett reellt problem även om det för oss andra ter sig virtuellt. Vad som är virtuellt är väsentligt i C++ studera följande program.
#include <string>
#include <iostream>
struct A {
A() : a(this) {}
virtual void foo() { std::cout << "a "; } A * a;
};
struct B : public A { B() : b(this) {}
virtual void foo() { std::cout << "b "; } B * b;
};
struct C : public B {
virtual void foo() { std::cout << "c "; } };
int main() { C c;
B b = c; // copy
B & b1 = c;
B & b2 = b;
A & a1 = b1;
A & a2 = b2;
a1.foo();
a2.foo();
std::cout << std::endl;
a1.a->foo();
a2.a->foo();
std::cout << std::endl;
b1.b->foo();
b2.b->foo();
std::cout << std::endl;
}
(a) Vad skriver programmet ut när man kör det?
(b) Illustrera med en minnesbild hur minnet ser ut efter kopieringen (se // copy).
(c) När man kompilerar koden kommer det att skapas en icke-virtuell destruktor som kommer att gene- rera en varning. Varför bör destruktorn vara virtuell i klasser med virtuella metoder?
(d) Vilka två andra metoder kommer att (rule of three) automatiskt skapas åt dig vid behov?
(e) Polymorfi är inte detsamma som arv. Förklara kort vad polymorfi är, exemplifiera med koden i (a).
3. Generaldirektör sökes
Ny generaldirektör för Byråkratiska Studiestödsbyrån har utlysts. Explicit goda referenser krävs för att söka. Det är ett svårt jobb att leda en organisation med sådan konstig struktur. Ringa in och förklara vilka rader som inte kompilerar på structerna nedan, var noga med const och referenser.
01 struct Act {
02 float calc(int a) {
03 return 1.1 * a;
04 }
05 };
06 struct Bureau {
07 // Members variables
08 int x;
09 int & y; // reference 10
11 // Constructors
12 Bureau() {
13 x = 1;
14 y = x;
15 }
16 17
18 Bureau(int & a) : x(1), y(a) {
19 }
20 21
22 Bureau(int a, const int & b) : x(a), y(b) {
23 }
24 25
26 // Member methods
27 float foo(Bureau b, const Act & a) const {
28 return a.calc(*this + b);
29 }
30 31 32
33 float bar(Act & a) {
34 return a.calc(*this + x); // implicit constructor call
35 }
36 37 38
39 int operator+(Bureau b) const {
40 return x + b.x;
41 }
42 43
44 };
4. Vänner
Egentligen är det ganska fånigt när två myndigheter bråkar med varandra och läser varandras webbsidor för att hitta motåtgärder mot andra myndighetens motåtgärder. Kan vi inte alla vara vänner med varandra?
(a) Hur deklarerar man en vän? Skriv två minimala klasser varav den ena är vän med den andra.
(b) Syntaxen för att deklarera vänner till typparametriserade klasser är inte helt intuitiv. Gör ett försök att deklarera en sådan vän (rättas snällt).
(c) Varför bör man vara restriktiv att deklarera vänklasser?
Fyll i felkoder i tabellen nedan för varje fel på varje uppgift. Felkoden är fyra siffror Xx-YY där X är frågenummer, x delfråga och YY ett löpnummer (01, 02 ...). 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 (använd annan färg t.ex. blå eller rött bläck som finns att låna). Underlåtelse att rätta små som allvarliga fel kan påverka resultatet på rättarens egen tenta. Om du är osäker på om felet är allvarligt, ringa in felkoden. Om det saknas plats, använd kringliggande rutor som är utan anmärkningar.