Tentamen i DD2387 Programsystemkonstruktion med C++ Resultat:
Datum: Tisdag 20 oktober 2009, 8-12 (rättning 13-14)
Rätta mycket nogrannt. Allt som är fel ska markeras. Avgör därefter om det är ett allvarligt fel eller inte. Enstaka allvarliga fel behöver inte ge underkänt. Kommentera både i tentan och på baksideformuläret. 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
template <class T, class S>
void fix(T iter, T end, S course) { while (iter != end) {
iter->add(course); // or +=, add\_course ...
iter += 1; // or iter++, ++iter, iter=iter+1 }
}
(b) Vad ställer din funktion fix för krav på typparametrarna? Var noga med detaljerna.
The iterator T must have +=. The class which the iterator T points to must have a method add that can take course as parameter. The course could be an object hierarchy or just a a simple int. See below:
struct ss {
void add(int t) {}
template <class T>
void add(T t) { }
};
#include <vector>
int main() {
std::vector<ss> v;
ss k;
fix(v.begin(), v.end(), k);
fix(v.begin(), v.end(), 5);
}
Saxat ur numero: KTHs studenter har under en längre tid trakasserats av CSN med återbetalningskrav för att våra höstterminer endast har varit 17 veckor i st f 20. Detta gäller även studenter på Chalmers LTU och Linköping. Dessa universitet ska träffa CSN i juni för att hitta en vettig lösning, men eftersom ingen tror att CSN kommer att förstå att verkligheten endast modelleras i Ladok kommer HT kommer att förlängas i Ladok (helst retroaktivt ...) skolorna justerar LoT till 30hp per termin. Förhoppningsvis kommer det att få CSN att återgå till sin huvudverksamhet: att inte svara i telefon.
1
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?
c b
c c
c c
(b) Illustrera med en minnesbild hur minnet ser ut efter kopieringen (se // copy).
See blackboard.
(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?
To ensure that the right destructor is called. Example A * a = new C();
delete a;
2
(d) Vilka två andra metoder kommer att (rule of three) automatiskt skapas åt dig vid behov?
assignement operator (operator=) and copy constructor
(e) Polymorfi är inte detsamma som arv. Förklara kort vad polymorfi är, exemplifiera med koden i (a).
Polymorphism is the is the ability of a bas class A, to appear as and be used like the subclass B. It works only with pointers and reference. Example:
a1.foo(); a1 is a pointer to a C object and C::foo() will be called since it is a virtual function.
When grading: Works only for pointers and references, not serious if one is omitted. Might be serious to omit if the answer otherwise is not clear. Serious fault to exemplify with a non-polymorphic call like b.foo()
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
3
compile message
tal1.cpp:12: error: uninitialized reference member ’Bureau::y’
tal1.cpp:22: error: invalid initialization of reference of type ’int&’ from expression of type ’con tal1.cpp:28: error: no matching function for call to ’Act::calc(int) const’
Note when grading that it is not an error to mark the member function and explain what is missing instead of markin the call of the function.
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.
struct A {
friend struct ss; // friend with struct ss in tal 1 };
(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).
template <class S> friend class Calendar;
(c) Varför bör man vara restriktiv att deklarera vänklasser?
Because it exposes all private data and data as a general principal in object oriented programming should be encapsulated.
Saxat ur Numero: CSN:s häxjakt på våra studenter fortsätter. Vi lade förra veckan upp en sida med information om hur våra D- och Mediastudenter kan minska risken att fastna i någon av CSN:s kontroller och blev via e- brevskorrespondens medvetna om att CSN nu går in och läser KTH:s webbsidor i syfte att hitta motåtgärder mot våra motåtgärder. I tisdags berättades det på GA-mötet om en student som fått återbetalningskrav med motivet att det inte pågick någon undervisning i tentaveckan (som studenten hade och klarade en tenta i!). På samma GA-möte erbjöd jag mig att söka den utannonserade tjänsten som generaldirektör för CSN i syfte att lägga ner verksamheten, men sista ansökningsdag var 25:e augusti. (http://osqledaren.se/2010/06/regeringskansliet-soker- nygeneraldirektor- for-csn/).
4