Tentamen EDAF30 Programmering i C++

Relevanta dokument
Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 - Programmering i C++, grundkurs

Kapitel 6 - Undantag

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

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Tentamen C++-programmering

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

TDIU01 - Programmering i C++, grundkurs

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

Det finns många flaggor till g++,

Föreläsning 3-4 Innehåll

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

OOP Objekt-orienterad programmering

Innehåll. Pekare Exempel

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Lite om länkade strukturer

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

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

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

Innehåll. Pekare Exempel

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

TDIU01 - Programmering i C++, grundkurs

Tentamen *:58/ID100V Programmering i C Exempel 3

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

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

Tommy Färnqvist, IDA, Linköpings universitet

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

TDDC76 - Programmering och Datastrukturer

Tentamen Objektorienterad Programutveckling med C++

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

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

TDDC76 - Programmering och Datastrukturer

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

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Föreläsning REPETITION & EXTENTA

Tentamen i Programmering

C++ Slumptalsfunktioner + switch-satsen

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Tentamen. Grundläggande programmering i Java A 5p, DTAA

TDIU01 - Programmering i C++, grundkurs

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

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

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

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

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Tentamen i Grundläggande Programvaruutveckling, TDA548

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

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

C++-programmets beståndsdelar

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

TDDC76 - Programmering och Datastrukturer

Typkonvertering. Java versus C

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

Tentamen i DD2387 Programsystemkonstruktion med C++

TDIU01 (725G67) - Programmering i C++, grundkurs

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Kapitel 5. Strömmar. Utmatning

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

Övning från förra gången: readword

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Grundläggande programmering med C# 7,5 högskolepoäng

TDDC76 Programmering och datastrukturer

Algoritmer. Två gränssnitt

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

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

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

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

Föreläsning 11. Strängar

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

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

Programmeringsteknik med C och Matlab

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Instuderingsfrågor, del D

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenska Tentamen EDAF30 Programmering i C++ 2016 08 16, 8.00 13.00 Hjälmedel: En valfri C++-bok. OH-bilderna från föreläsningarna är inte tillåtna. Du ska i dina lösningar visa att du behärskar C++ och även att du kan använda C++ standardklasser och algoritmer. Rena C-lösningar å roblem som med fördel kan lösas enligt mera objektorienterade rincier, eller egen imlementering av sådant som finns i standardbiblioteket, kan därför ge oängavdrag, även om de är korrekta. I bedömningen av en lösning kan även minneshantering beaktas där det är relevant. Om du använder saker ur standardbiblioteket i din kod, var tydlig med att du gör det. Använd fullt kvalificerade namn eller using-direktiv för de namn du använder. Ugifterna ger reliminärt 14 + 12 + 7 + 11 + 6 = 50 oäng. För godkänt krävs reliminärt 25 oäng (betygsgränser 3/25, 4/33, 5/42). Observera att ordningsföljden eller oängantalet för ugifterna inte nödvändigtvis avseglar deras svårighet. 1. I kursboken (J. Skansholm: C++ direkt) hittar man följande funktion som använder sig av binärsökning för att leta u ositionen (returnerar en ekare till elementet) för ett heltal i en sorterad array ( fält ): int *bin_sok(int sokt, int *forsta, int *sista) { if (forsta>sista) return nulltr; int *mitten = forsta + (sista-forsta)/2; if (sokt<*mitten) return bin_sok(sokt,forsta,mitten-1); else if (sokt>*mitten) return bin_sok(sokt,mitten+1,sista); else return mitten; a) Skriv om funktionen till en funktionsmall så att man i stället för att bara kunna leta i en intarray kan söka efter ett element i en sorterad array av godtycklig ty (med element som kan jämföras). Ugiften fortsätter å nästa sida...

2(6) b) Antag att vi vill använda din funktionsmall ovan för att söka efter element av klassen Bil enligt nedan. OBS! Sökningen ska ske baserat å registreringsnumret för bilen class Bil { Bil() : reg_nr(nulltr), owner(nulltr) { void set(const string& r, const string& o) { delete reg_nr; // delete nulltr is OK in C++. delete owner; // Null checks not required. reg_nr = new string(r); owner = new string(o); string get_reg_nr() const { return *reg_nr; string get_owner() const { return *owner; rivate: string *reg_nr; string *owner; ; Nedan finns ett litet exemel som visar hur det ska kunna fungera: Bil bil[4]; bil[0].set("abc123","pelle"); bil[1].set("bcd234","lena"); bil[2].set("cde345","oskar"); bil[3].set("def456","sofia"); Bil s; s.set("bcd234",""); Bil *b = bin_sok(s,bil,bil+3); if (b!=0) { cout << b->get_reg_nr() << endl << b->get_owner() << endl; else { cout << "Fanns ej!" << endl; Komlettera koden för klassen Bil (dvs ändra ej existerande kod - lägg bara till ny kod) så att koden i exemlet ovan fungerar! c) Ett generellt roblem med klassen Bil, som den definieras i den föregående ugiften, är att man riskerar att råka ut för en minnesläcka när man använder den. Vad innebär en minnesläcka? d) Komlettera koden (ändra ej existerande kod) för klassen Bil ovan så att användning av den inte medför en minnesläcka. Var observant så att du inte i och med ändringen introducerar fel som beror å för tidig avallokering av minne. e) Om du hade fått lov att ändra i den ursrungliga koden för klassen Bil skulle det gå att åtgärda roblemen med minnesläckor å ett mycket enklare sätt (utan att ändra klassens beteende utåt det ublika gränssnittet). Hur?

3(6) 2. Betrakta följande vektorklassmall: temlate <tyename T> class Vector { Vector(size_t s) : v(new T[s]), sz(s) { for (size_t i = 0; i!= sz; ++i) { v[i] = T(); ~Vector() { delete[] v; size_t size() const { return sz; T get(size_t i) const { return v[i]; void ut(size_t i, T val) { v[i] = val; rivate: T* v; size_t sz; ; a) När Vector används i följande rogram får man ett oväntat resultat: 1 void rint(vector<int> v) { for (size_t i = 0; i!= v.size(); ++i) { cout << v.get(i) << " "; cout << endl; int main() { Vector<int> v1(10); for (size_t i = 0; i!= v1.size(); i++) { v1.ut(i, i + 1); rint(v1); // utskrift 1 2 3 4 5 6 7 8 9 10 Vector<int> v2(5); rint(v2); // utskrift 0 0 0 0 0 rint(v1); // utskrift 0 805306368 0 805306368 3 6 7 8 9 10 Den sista rint(v1)-satsen borde ha gett samma utskrift som den första! Förklara varför det har blivit fel (du behöver inte förklara vad de stora värdena står för) och korrigera klassmallen så att rogrammet fungerar som förväntat. Ledning: Felet är relaterat till hur man hanterar minne i C++. b) Det är inte elegant att behöva utnyttja funktionerna get och ut för att komma åt vektorelementen. Lägg till konstruktioner i Vector så att man kan komma åt dess element med indexering, till exemel v1[i] = i + 1. Lägg också till en funktion så att man kan skriva ut vektorer, till exemel cout << v2 << endl << v1 << endl. 1 Programmet är kört å en Mac med Xcode version 6.1.1.

4(6) 3. En rogrammerare har skrivit ett litet testrogram för att lära sig använda iostream, men vid testkörning fås ett oväntat resultat. #include<iostream> using std::cin; using std::cout; using std::endl; int main() { const int refix_len = 8; int nbr; char refix[refix_len]; cout << "Enter number of times to loo:" << endl; cin >> nbr; cout << "Enter a refix (max length: " << refix_len << " chars):" << endl; cin >> refix; cout << "Looing " << nbr << " times." << endl; while(nbr--) { char txt[100]; cout << "Enter a text:" << endl; cin >> txt; cout << refix << " : " << txt << endl; cout << "Program finished" << endl; return 0; Testkörning som fungerar: Enter number of times to loo: 3 Enter a refix (max length: 8 chars): test Looing 3 times. Enter a text: aaaa test : aaaa Enter a text: bb test : bb Enter a text: ccccc test : ccccc Program finished Testkörning med oväntat resultat: Enter number of times to loo: 5 Enter a refix (max length: 8 chars): abcdefgh Looing 0 times. Program finished Programmeraren förväntade sig att rogrammet skulle fråga efter en sträng fem gånger, men det avslutas direkt. Förklara vad som händer i körningen med oväntat resultat. Ledning: Tänk å hur en C-sträng reresenteras i minnet.

5(6) 4. I ett rogram läser man kommandon och heltal och summerar talen. Exemel å konversation med rogrammet (kommentarerna ingår inte;, a, u, c och r är kommandon): // rint the sum, 0 to begin with Sum is now 0 a 4 // add 4 a 3 // add 3 a 2 // add 2 Sum is now 9 u // undo last add u // multile undo's are allowed Sum is now 4 c // commit changes (make them ermanent so they cannot be undone) u // nothing haens a 3 a 2 Sum is now 9 r // rollback, undo all changes since last commit Sum is now 4 Programmet ser ut så här: #include <iostream> #include "accumulator.h" using std::cout; using std::cin; using std::endl; int main() { Accumulator accum; char cmd; while (cin >> cmd) { switch (cmd) { case '': cout << "Sum is now " << accum << endl; case 'a': { int nbr; cin >> nbr; accum += nbr; case `u': accum.undo(); case `c': accum.commit(); case `r': accum.rollback(); Imlementera klassen Accumulator.

6(6) 5. I ett rogram som hanterar djur finns klasserna class Pet { Pet() =default; virtual ~Pet() =default; virtual string seak() const =0; ; class Dog : ublic Pet { virtual string seak() const override {return "Woof"; ; class Cat : ublic Pet { virtual string seak() const override {return "Meow"; ; class Bird : ublic Pet { virtual string seak() const override {return "Tweet"; ; För att testa djurens läten har ett minimalt testrogram skrivits: #include <iostream> #include <vector> #include "et.h" void test_ets() { Bird b; Cat c; Dog d; std::vector<pet> ets; ets.ush_back(b); ets.ush_back(c); ets.ush_back(d); for(pet& : ets) { std::cout <<.seak() << std::endl; Tyvärr går det inte att komilera rogrammet: komilatorn klagar å raden std::vector<pet> ets; a) Varför får man inte lov att skaa en std::vector<pet>? b) Ändra funktionen test_ets så att den fungerar. Funktionen ska skaa djur-objekten, skaa en vector och sen iterera över vektorn och anroa seak() för varje osition så att utskriften blir Tweet Meow Woof