DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Relevanta dokument
DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

DD2387 Programsystemkonstruktion med C++ Tentamen 2

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

Tentamen i DD2387 Programsystemkonstruktion med C++

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Tentamen i DD2387 Programsystemkonstruktion med C++

Tillämpad programmering

Tentamen i DD2387 Programsystemkonstruktion med C++

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen EDAF30 Programmering i C++

Innehåll. Pekare Exempel

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Innehåll. Pekare Exempel

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Tentamen EDAF30 Programmering i C++

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

TDIU01 Programmering i C++

Programsystemkonstruktion med C++

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Tentamen EDAF30 Programmering i C++

Tentamen C++-programmering

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Det finns många flaggor till g++,

C++ Objektorientering - Klasser. Eric Elfving

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Tommy Färnqvist, IDA, Linköpings universitet

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

DAT043 Objektorienterad Programmering

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Kapitel 6 - Undantag

Tentamen *:85/2I4123 C

SP:PROG3 HT12 Tenta

TDDC76 - Programmering och Datastrukturer

Föreläsning 3-4 Innehåll

Programmering B med Visual C

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Övningar Dag 2 En första klass

Föreläsning 6: Introduktion av listor

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

grundläggande C++, funktioner m.m.

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

C++-programmets beståndsdelar

Att använda pekare i. C-kod

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

TDDC76 - Programmering och Datastrukturer

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Synlighet. Namespace Scope-operatorn Klasser Vänner

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

TDDC76 Programmering och datastrukturer

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Funktionens deklaration

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 2 september 2006

F4. programmeringsteknik och Matlab

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 8: Exempel och problemlösning

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Introduktion till arv

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Den som bara har en hammare tror att alla problem är spikar

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

2D1387, Programsystemkonstruktion med C++ 01/02 1

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Föreläsning REPETITION & EXTENTA

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Tentamen i Grundläggande programmering STS, åk 1 lördag

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

729G04 Programmering och diskret matematik

TENTAMEN OOP

Tentamen OOP

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Transkript:

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00 Introduktion Skriv dina svar på separata papper, dessa scannas in efter inlämning. Du kan skriva på båda sidor. Skriv namn och uppgiftsnummer på varje sida Grova fel ger underkänt, men gör ett försök på alla uppgifter Det är ingen självrättning efter tentan Hjälpmedel En, eller två, valfria läroböcker om C++. 1

1 Sådana där grejer som åker under vatten Det jagas en ubåt. Eller snarare, det efterfrågas information om ett oidentifierat dykande föremål, som det finns en bild på, fast den bilden var på en annan ubåt som man kan hyra för fester. Det finns dock en annan bild, fast den var tagen på en annan plats, eller det beror på, jag kommer inte ihåg. Det är inte lätt att ha koll på den virtuella verkligheten som beskrivs i media men virtual och minneshantering måste man ha koll på i C++. // - - - - - - - - - - - - - - - - - - - - - - - - - - - // Unidentified Diving Object struct UDO { UDO() : origin(this) { virtual void dive() { std::cout << "blubb, blubb" << std::endl; UDO * origin; ; struct MiniUboat : UDO { virtual void dive() { std::cout << "swoosh, swoosh" << std::endl; ; // - - - - - - - - - - - - - - - - - - - - - - - - - - - int main() { MiniUboat boat; UDO & udo1 = boat; UDO udo2 = udo1; udo1.dive(); udo2.dive(); udo1.origin -> dive(); udo2.origin -> dive(); a) Vad skriver ovanstående program ut? swoosh, swoosh blubb, blubb swoosh, swoosh swoosh, swoosh 2

b) Rita minnesbild över hur variablerna boat, udo1, och udo2, ser ut. udo1,boat -> -------- ----------- UDO MiniUboat ---- origin -------- ---------------------- -------- UDO : udo2 ---- origin ---------- 2 Generisk signalspaning Det är inte lätt att jaga ubåtar. Man lyssnar efter sonarsignaler och avgör på något fiffigt sätt om det är minkar, ubåtar, eller något helt annat som låter. a) Skriv en generisk funktion som givet en mängd signaler (definerat av två iteratorer till en godtycklig signaltyp) returnerar första förekomsten av en signal som är minst dubbelt så stor som både den föregående och efterföljande signalen. Gör inget off-by-one fel och kolla så att programmet inte kraschar om man skickar in en för liten (t.ex. tom) mängd. Vad som ska hända om inget element som tillfredställer tidigare beskrivning påträffas är upp till dig, men implementationen är inte godkänd om den krashar vid sådant tillfälle. template <class T> T find(t first, T end) { if ((end - first) < 2) return end; // måste returnera något av typen T, något som kan t for (T i = first + 1; i!= end - 1; ++i) if ((*i >= *(i - 1)*2) && (*i >= *(i + 1)*2)) return i; return end; b) Vad ställer din kod för krav på iteratorerna (parametrarna)? Att man kan subtrahera dem, operator-, addera/subrahera med 1, xoperator++, tilldela, jämföra med!= c) Vad ställer din kod för krav på signaltypen? 3

operator*, operator>= 3 Konsten att använda const a) Varför bör man sträva efter att använda const där så är möjligt i C++? Kompilatorn kan avgöra i compile-time om man försöker skriva till read-only varabler. 4 Att bilda sin egen uppfattning Vad fyller alla de här skriverierna för funktion, objektivt sett? Kan man inte skapa sig en egen bild av situationen igenom att lägga ihop ett och två? Bild f; // a function object double x = f (1, 2); a) Skriv klassen Bild så att ovanstående kod kompilerar. Koden behöver inte göra något vettigt. struct Bild { double operator() (double u, double boat) return u-boat; ; ; 4

5 Kampen mellan journalister Det råder visst en febril verksamhet i media. Mängder med infallsvinklar produceras. En kreativ journalist ger sig ut på spaning med helikopter för att spana på de svenska båtarna som spanar efter det oidentifierade dykande föremålet. En annan skribent spekulerar om den förmodade ubåten kan vara en gigantisk rysk Typhoon som är i sjönöd. Ett rykte som nästan är fakta pekar ut en rysk oljetanker som möjligt moderfartyg efter observationen att fartyget vänt på sig (vilket fartyg som ligger löst för ankar brukar göra). Men kanske ligger tankern därute på internationellt vatten enbart för att slippa hamnavgift. Ja det är många konstiga historier och referenser som cirklar runt. http://www.svt.se/kultur/ubatstrott-eller-ubatspepp Även om det är svårt att hålla koll på medial fakta, så måste man ha koll på const och referenser när man skriver C++. struct Journalist; struct Rumor { bool as_told_by(const Journalist & j); ; struct Journalist { Journalist() { Journalist(const Journalist &) = delete; bool investigate (const Journalist & j, Rumor fact); int story; // Saknades i tentaydelsen int get_story() const { return 1; Rumor drink_beverage_with(const Journalist & j) { Rumor k; return k; void write(int, Rumor, const Journalist &) { ; bool Rumor::as_told_by(const Journalist & j) { return true; bool Journalist::investigate(const Journalist & j, Rumor fact) { if (fact.as_told_by(j)!= 0 ) { this->story = j.get_story(); Rumor more_facts = this -> drink_beverage_with(j); this->write(story, more_facts, j); return true; int main() { Journalist j, k; Rumor r; j.investigate(k, r); a) Skriv den implementation som saknas (så att ovanstående kod kompilerar). 5

Observera att man inte kan kopiera journalister. Koden behöver inte göra något vettigt. 6

6 En destruktiv jakt En del tycker att den pågående jakten efter oidentifierade undervattensfarkoster är rent destruktiv. En cprog-student observerar att destruktorn är helt åt fanders. struct Hunt { std::vector<udo *> * v; Hunt() { v = new std::vector<udo *>(); void seek(water w) { while (w.suspicous()) { Sound s = w.listen(); if (s!= w.normal()) v -> push_back(new UDO(s)); ; ~Hunt() { delete [] v; a) Vad är problemet/problemen med destruktorn i Hunt? Det är två problem. 1) Det är fel delete, det ska inte vara [] 2) Eftersom klassen allokerar minne för pekare som läggs till vektorn bör destruktorn loopa igenom och ta bort dessa b) Hur borde destruktorn skrivas? for (auto i : *v) delete i; Man kan tänka sig att det görs i en clear-funktion men loopen måste nämnas c) Vilka automatiskt genererade medlemsfunktioner brukar ingå i det som tidigare (c++98) kallades för "Rule Of Three"? operator=, copy-constructor, destructor 7