• No results found

Tentamen i DD2387 Programsystemkonstruktion med C++ Resultat:

N/A
N/A
Protected

Academic year: 2021

Share "Tentamen i DD2387 Programsystemkonstruktion med C++ Resultat:"

Copied!
4
0
0

Loading.... (view fulltext now)

Full text

(1)

Tentamen i DD2387 Programsystemkonstruktion med C++ Resultat:

Datum: Tisdag 17 oktober 2011, 8-12 (rättning ca 12:40-14) 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. const

Några riksdagsledamoter har svårt att förstå riksdagens regler för hyresbidrag. Ja inte bara politiker utan eliten av krönikörer och ledarskribenter verkar ha svårt att förstå vad som gäller. Särskilt svårt blir det när informationen om sagda regler plötsligt ändrad vilket inte ger intryck av varaktiga och konstanta regler.

Det är mycket viktigt att förstå vad som är konstant och varaktigt och vad som inte är det i C++.

Koden nedan kommer inte att kompilera. Programmeraren har inte förstått const. Gå igenom koden och förklara de två kompileringsfelen. Ange berörda rader!

01 struct A {

02 void hyra(A & a) const { // Fel 1

03 };

04 };

05

06 struct B : public A {

07 void blankett(const B & b, A a) {

08 a.hyra(b); // Fel 1

09 }

10 };

11

12 struct C : public B {

13 A blankett(const A & a) { // Fel 2

14 return a;

15 }

16 };

17 18

19 void fyll_i_blankett(const A & a, B b, const C & c) { 20 b.blankett(b, c.blankett(a)); // Fel 2

21 }

g++ -ansi -pedantic -Wall -o tal2 tal2.cpp

tal2.cpp: In member function ’void B::blankett(const B&, A)’:

tal2.cpp:8: error: no matching function for call to ’A::hyra(const B&)’

tal2.cpp:2: note: candidates are: void A::hyra(A&) const

tal2.cpp: In function ’void fyll_i_blankett(const A&, B, const C&)’:

tal2.cpp:20: error: no matching function for call to ’C::blankett(const A&) const’

tal2.cpp:13: note: candidates are: A C::blankett(const A&) <near match>

const ger skrivskydd för variabler. Det kan vara att metoden är const och skyddar medlemsvariabler eller att en variabel i sig är skrivskyddad.

Det finns två fel i koden. Var varse att felet kan observeras både i anropet eller i deklarationen.

Fel1, i B::foo är b const-deklarerad men man skickar som/till icke-const deklarerad referensparameter (rad 02)

Fel2, i foo är c const-deklarerad men c.blankett inte const-deklarerad metod (rad 13)

Övriga fel, eventuelle semikolon o.s.v. kan bortses från. Bedöm om förklaringarna är rimliga.

Man ombeds peka ut berörda rader alltså även den signatur som nästan matchar bör man nämna.

Att missa båda felen är allvarligt.

1

(2)

2. Virtual

Vad är det som hänt, händer eller borde hända? Frågan är om vi någonsin får någon klarhet i riksdagens arbetsmetoder. För att programmera C++ är det viktigt att kunna förstå vad som händer i metodanrop.

Speciellt om några är virtuella.

(a) Vad skriver följande kod ut?

(b) Vad skulle skrivas ut om alla virtual togs bort?

(c) Vilka av de fem print-anropen använder inte dynamisk bindning för att i runtime binda funktions- anropen? Motivera!

#include <iostream>

using namespace std;

struct A {

A(string s) : name(s) {};

string name;

virtual void print() { cout << name << " betalar hyran" << endl; };

};

struct B : A {

B(string s) : A("Riksdagen"), name(s) {};

string name;

virtual void print() { cout << name << " betalar hyran " << endl; };

};

void f1(A & p) { p.print();

}

void f2(A p) {

p.print(); // ingen dynamisk bindning }

int main() { B b1("Håkan");

A & aref(b1);

A acopy = b1;

b1.print(); // ingen dynamisk bindning aref.print()

acopy.print(); // ingen dynamisk bindning f1(b1);

f2(b1);

a) b)

Håkan betalar hyran Håkan betalar hyran

Håkan betalar hyran Riksdagen betalar halva hyran

Riksdagen betalar halva hyran Riksdagen betalar halva hyran

Håkan betalar hyran Riksdagen betalar halva hyran

Riksdagen betalar halva hyran Riksdagen betalar halva hyran }

Rättningskommentarer: Försök se om det görs samma typ av. T.ex f2(b1) och acopy.print har båda slicing. Gör man fel på båda kan man ha missat vad slicing är.

Svar c) För att det ska ske en dynamisk bindning i runtime så måste det vara en pekare eller referens till ett objekt. I de tre markerade raderna ovan så sker print-anropet på ett objekt ... direkt ... således behövs det inte göras någon dynamisk binding i runtime.

Fotnot, en del undrar över A & aref(b1); Det är en variabeldeklaration där aref initieras till b1. Jämför användningen av T() i labb1.

2

(3)

3. Fibonacci

Många politiker, ja inte bara politiker, är upprörda över mediedrev, i alla fall när man själv är utsatt för ett. En del verkar definiera mediedrev som upprepandet av lögner. Andra menar att lögnerna spär på varandra ungefär som en fibbonacciserie, att nästa lögn är summan av de två föregående. I vilket fall verkar mångas åsikt vara att mediedreven inte fyller någon vettig funktion i samhället objektivt sett.

(a) Nedanstående kod använder sig av en snillrik operator. Denna operator() eller snarare klasser/objekt som använder en sådan operator har ett speciellt namn, vilket?

Svar: Funktionsobjekt eller funktor

// generate fibbonacci sequence beginning with 0 and 1 and each subsequent // number is the sum of the previous two: 0 1 1 2 3 5 8 11 19 ...

struct generate_fibonacci {

generate_fibonacci() : m_nFirst( 0), m_nSecond( 1) { }

int operator() () { // snillrik operator

int nNew = m_nFirst + m_nSecond;

m_nFirst = m_nSecond;

m_nSecond = nNew;

return nNew;

} private:

int m_nFirst;

int m_nSecond;

};

(b) Sätt dig in i koden. Skriv ett kort main program som skriver ut de sju första fibonacci-talen.

#include <iostream>

using namespace std;

int main() { // SVAR

generate_fibonacci logn;

cout << logn << " " << logn << " " << logn << " " << logn << " "

<< logn << " " << logn << " " << logn << endl;

Funktionen verkar inte skriva ut den inledande 0:an och 1:an. Om man vill kan man göra det

cout « 0 « ’ ’ « 1 « ’ ’ « logn « ...

3

(4)

4. Quicksort

I dagens mediasamhälle är det viktigt att snabbt kunna sålla och sortera bland all information som flyger omkring. Quicksort använder sig av partitionering som givet ett pivot-element sorterar alla viktigare element till höger och oviktigare till vänster om pivotelementet. användbar.

(a) Skriv en typparametriserad partition-kod så att godtycklig klass som implementerat operator< sor- teras. Utgå från nedanstående variant som väljer första elementet i vektorn som pivotelement.

template<typename IT>

IT partitionT(IT begin, IT end) {

IT pivot = begin;

typename std::iterator_traits<IT>::value_type pivot_value(*pivot);

std::swap(*pivot, *(end-1));

IT left=begin;

for(IT it=begin; it!=end-1; ++it) { if(*it<=pivot_value) {

std::swap(*left, *it);

++left;

} }

std::swap(*(end-1), *left);

return left;

}

Man behöver inte använda iterator_traits<IT>::value_type men jag tog med det eftersom någon frågade om det på tentagenomgången. Det går lika bra att jämföra med *pivot.

Rätta algoritmen noga och påpeka misstänkta fel. Det brukar vara svårt att skifta in pivotelementet rätt på slutet. Det räknas dock inte som allvarligt fel att misslyckas med algoritmen. Var noga med när det ska vara begin och *begin.

(b) Förutom operator< vad ställer din kod för krav på parametrarna?

Det som iteratorn pekar på måste i min kod ha operator<= (oops). Själva iteratorn behöver man kunna plussa på med prefix ++ och subtrahera med 1. Man måste även kunna titta på värden med * samt jämföra med !=

4

References

Related documents

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

Implementera A och B så att följande kod kompilerar. Det är mycket allvarligt att göra fel på const. Observera att parametern till operator+= antingen är en kopia eller

The problem appears restricted to 30GB first generation Zune players. Later 80GB and 120GB models appear to

Givet ett kontor, NewDeal, som ärvt sina metoder från OldWay, så får man två olika börsindex från en och samma kontorsinstans beroende på hur man refererar till det.. struct NewDeal

4. a)What is the program output? b)Does it make any difference if all methods were virtual? c)Write an explicit call inside B assignment method that call its base class

(a) Skriv en funktion som givet två strängar returnerar index till första eventuella förekomsten av en sådan omkastning. Om ingen sådan påträffas

The code for “monsterspel” - the text game has a player class and a monster class both derived from Actor. There are several subclasses to the Monster class such as Troll, Wolves

(a) Skriv en typparametriserad partitioneringsfunktion som givet ett in- tervall och ett pivotelement sorterar alla element så att de som är större än pivotelementet hamnar till höger