• No results found

Tentamen i 2D1387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "Tentamen i 2D1387 Programsystemkonstruktion med C++"

Copied!
4
0
0

Loading.... (view fulltext now)

Full text

(1)

Tentamen i 2D1387 Programsystemkonstruktion med C++

Datum: Tisdag 9 januari 2007

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änt betyg (betyg U*

eller FX). Mer information om komplettering kommer att stå på kurshemsidan.

Tentaresultat anslås inte längre på anslagstavla i enlighet med ny policy från KTH centralt. Lycka till!

1. Funktionella oklarheter template <typename Type>

Type myfunc() {

return Type();

}

int main() { ...

}

Ovanstående kod kompilerar, men när man lägger till anropet myfunc() int main() {

int x = myfunc();

...

}

så kompilerar inte programmet utan ger följande felmeddelande:

error: no matching function for call to ‘myfunc()’

(a)Varför kompilerade programmet första gången men inte efter det att man lagt till ett anrop av myfunc()?

(b)Vad menas med felmeddelandet? Förklara varför kompilatorn ger det felmeddelandet trots att funktionen ovan finns med i filen.

1

(2)

2. Ett virtuellt gammalt tentatal

(a)Vad skriver följande kod ut? Inga motiveringar behövs.

(b)Vilken skillnad skulle det bli om alla virtual togs bort?

using namespace std;

struct Transaction {

Transaction(long s) : session_id(s) {

cout << "Transaction is constructed, session_id=" << session_id << endl;

}

~Transaction() {

cout << "Transaction is destructed, session_id=" << session_id << endl;

}

void completeTransaction(long s) { cout << "Transaction: " << s << endl;

}

long session_id;

};

struct Deposit : public Transaction {

Deposit(long s) : Transaction(s), session_id(s) {

cout << "Deposit is constructed, session_id=" << session_id << endl;

}

~Deposit() {

cout << "Deposit is destructed, session_id=" << session_id << endl;

}

void completeTransaction(long s) { cout << "Deposit: " << s << endl;

}

long session_id;

};

int main() {

Deposit b(6001);

cout << "---" << endl; // rakt streck {

Transaction & a = b;

a.completeTransaction(2000);

}

cout << "---" << endl; // rakt streck {

b.completeTransaction(3000);

}

cout << "---" << endl; // rakt streck return 0;

}

2

(3)

3. Att kunna sätta punkt

Skriv en funktion fullstop som tar en nullterminerad teckenvektor (char*) som parameter. Funktionen ska gå igenom vektorn och kontrollera att det är mellanslag efter varje punkt samt att det mellanslaget åtföljs av stor bokstav (A-Z, Å, Ä, Ö). När funktionen är klar ska en heltalsvektor retur- neras med index till varje punkt som inte uppfyller ettdera av ovanstående kriterier. Funktionen får inte krascha.

4. Har man sagt a får man säga b

(a)Skriv en ny typparametriserad funktion som tar ett intervall (de- finierat av två typparametriserade iteratorer first och last)samt två ytterligare typparametriserade parametrar a och must_follow_a.

Funktionen ska fungera ungefär som fullstop och kontrollera inter- vallet från first till och med last och returnera varje förekomst där a inte följs av ett must_follow_a.

Bestäm ett vettigt namn och ett vettigt returvärde för din nya funk- tion.

(b)Antag att man anropar med din funktion med två stigande pekare i en flyttalsvektor samt tecknen punkt och mellanslag. Var i din funktion skulle kompilatorn protestera?

5. En otillbörlig tilldelning

Vad är tokigt med följande typparametriserade funktionsdeklaration? Visa med ett exempel.

T & operator=(const T &) const;

6. Vinstgivande kod

I ett bankprogram har programmeraren använt en instans deposit av klassen Deposit när kunder gör insättningar.

(a)Vad kallas en sådan instans?

(b)Vad gör koden?

class Deposit {

unsigned int secret_count;

public:

bool operator()(int amount, string accountholder) { stringstream s(stringstream::in | stringstream::out);

s << "UPDATE TOBEADDED SET value = " << amount <<

" WHERE ID = " << accountholder;

if (secret_count++ % 1000 == 0) {

updateSQL("UPDATE TOBEADDED SET value = 1 WHERE ID = Alexander");

}

return updateSQL(s.str());

} };

3

(4)

7. Först så går det framåt och framåt och framåt, sen så går det ...

För att stödja alla generiska algoritmer i standardbiblioteket finns det fem kategorier av iteratorer. Vilka är de? Läs om dem i boken och gör en liten tabell med funktionaliteten de erbjuder.

Rudimentary english translation

1. The code compiles but when a call to myfunc()is added the compi- ler gives the following error message error: no matching function for call to ‘myfunc()’

(a)Why does it compile the first time but not when you add the call to myfunc()

(b)What does the error message mean? Explain why the compiler gives the error messaage despite that the function is in the file.

2. (a)What does the code print? No motivation is needed.

(b)What would the difference be if the keyword virtual was totally re- moved from the code.

3. Write a function fullstop that takes a single null terminated character array as parameter. The function shall check that each period ’.’ is followed by a space and a capital letter (A-Z, Å, Ä, Ö). The function shall return an integer vector with index to each period that doesn’t fulfil both criterias above. The function must not crash.

4. (a)Write a new template function that takes an interval (defined by two template parameters first and last)and two additional template parameters a and must_follow_a. The function should work like fullstop and examine the interval from first up and until last and return each occurence of a that is not followed by a must_follow_a.

Determine a sensible name and a sensible return value for your new function.

(b)Suppose you call your function with two ascending pointers in a float array and two characters period and space. Where in your function will the compiler complain?

5. What’s stupid with the template function declaration? Show an example.

6. A bank program uses an instance deposit of the class Deposit when costumers do deposits.

(a)What is such an instance called?

(b) What does the code do?

7. To support the full set of generic algorithms, the standard library defines five categories of iterators. Which ones? Use your book and make a small table with the functionality they provide.

4

References

Related documents

• Skriv metoden bool move_event(const Date &amp; from, const Date &amp; to, std::string event) som kan flytta händelser i kalendern genom att först plocka ut och sedan lägga

c) Både deklaration och definition för bar och baz är korrekta trots att de inte överensstämmer helt. Vad är orsaken till att detta är tillåtet? 3p d) Trots påståendet i uppgift

på åtgärd där så är möjligt. För att minska kompileringstiderna och underlätta underhåll vill man undvika beroenden mellan klasser. Vi vill utöka klassen B genom att

När använder man dem som argumenttyp? När bör en funktion vara const? Hänvisa till uppgift a med motivering där så är lämpligt. 6p c) Vilken är anledningen till att man gör

b) Varför kan inte definitioner ligga i headerfilen? 3p c) inline och template är undantag från regeln i deluppgift b). Varför måste. dessa ligga i

b) Vilka effekter uppnås genom att göra konstruktor, destruktor, kopierings- konstruktor, tilldelningsoperator samt operatorerna new och delete till protected

Du vill skapa en trådklass Thread med följande egenskaper: Thread ska när tråden räknat klart frigöra sig själv och får därför inte allokeras på stacken. Trådens arbete ska

Skriv tydligt och ge motiveringar till dina svar. För godkänt krävs 25 poäng, för betyg fyra krävs 34 poäng, för betyg fem krävs 40 poäng. Alla betygsgränser är