Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum: Lördag 23 oktober 2004, 8-13
Hjälpmedel: En eller två valfria läroböcker om C++
Tid: 5 timmar
Skriv tydligt och ge motiveringar till dina svar. För godkänt krävs högst 25 po- äng. Maximal poäng är 45.
1. Det kan ibland var svårt att förstå vad dagens företagsledare vill ha sagt.
Vad är det som sägs(skrivs ut) i följande program:
class Leader { public:
virtual void speak() { cout << "Nu måste vi fokusera på kärnverksamheten" << endl; };
};
class President : public Leader { public:
virtual void speak() { cout << "Sammanslagningen ger synergieffekter" << endl; };
};
class VicePresident : public President { public:
virtual void speak() { cout << "Det står på agendan" << endl; };
};
void make_a_statement_cop(Leader f) {f.speak();};
void make_a_statement_ref(Leader & f) {f.speak();};
int main() {
Leader * p_leader = new VicePresident();
President * p_president = new President();
VicePresident * p_vice_president = new VicePresident();
p_president -> speak();
p_leader -> speak();
make_a_statement_cop(* p_president );
make_a_statement_cop(* p_vice_president);
make_a_statement_ref(* p_president );
}
10p
1
2. Vid tillsättningen av direktörer brukar man anlita en headhunter som kan gallra ut ett antal kandidater bland de sökande. Antag att de sökandes kompe- tens representeras av någon slags siffra. Skriv en generell funktion som givet ett intervall i en generell siffervektor (man vet inte om det är heltal eller flyttal) och en kompetensnivå (en int), returnerar antal förekomster av tal större eller lika med kompetensnivån. Exempel på användning:
int v [] = {1, 2, 5, 12, 14, 23, 5};
int antal = gallra(v, v + 7, 10);
Det ovan angivna förfarandet kan uppfattas som alltför grovt. Man måste kun- na ta med andra aspekter som social kompetens. Skriv därför en ny generell funktion som givet ett intervall i någon slags vektor samt någon slags kompe- tensklass räknar förekomsten av vektorelement som uppfyller jämförelsekriteriet.
Deklarera den jämförelsemetod som krävs för att metoden ska fungera.
7p
3. Ett pensionsförsäkringsbolag har problem med sina rutiner. Ibland försvinner gamla kunder oförklarligt. Man misstänker sitt nya datasystem.
class Datasystem { private:
Customer * customers;
unsigned long nr_of_customers;
unsigned long customer_capacity;
public:
void add_customer(Customer a) { nr_of_customers++;
if (nr_of_customers >= customer_capacity) {
customers = new Customer [customer_capacity * 2];
}
customers[nr_of_customers] = a;
} // ...
a) Förklara kortfattat (högst ett par meningar) vad som är galet med add_customer.
b) En trögfattad kodansvarig förstår inte din förklaring. Illustrera med teck- ningar och förklara steg för steg vad som är galet med add_customer.
c) Skriv en förbättrad version av add_customer. Ta inte hand om fallet att minnesallokering kan misslyckas.
d) Om man nu skulle vilja fånga minnesallokeringsproblem och rapportera problemet hur skulle man bära sig åt då? Motivera ditt förslag.
e) Klassen Datasystem hanterar dynamiskt minne. Du bestämmer dig för att kodkontrollera resten av klassen. Vilka metoder bör du leta efter? Hur bör koden i dessa metoder se ut?
15p
2
4. När man ska välja styrelsemedlemmar dyker samma namn upp ständigt och jämt. För att spara pengar funderar man på att konstruera en ny strängklass med referensräkning och copy-on-write.
a) Förklara hur det skulle gå till och vad man kan tjäna på det.
b) Givet ett par instanser s1 och s2 av din strängklass. Beskriv de metoder som skulle behövas för att implementera raderna nedan.
s2 = s1; // OBS! s2 might have been initialized.
char c = s2[5];
s2[5] = ’L’;
c) Vad är det för skillnad på raderna nedan?
const char * p1 = &s1[5];
char * p2 = &s1[5];
d) I det ena fallet skulle man kunna få problem med våran referensräknar- klass. Vad för problem?
f ) Föreslå ett sätt att komma runt problemet.
e) Varför behöver det inte bli problem i andra fallet?
13p
3