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 C++-programmering

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

Tentamen i DD2387 Programsystemkonstruktion med C++

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Innehåll. Pekare Exempel

Inlämningsuppgift, EDAF30, 2018

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

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

Inlämningsuppgift, EDAF30, 2016

Innehåll. Pekare Exempel

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

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

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

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

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

C++ Objektorientering - Klasser. Eric Elfving

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

Kapitel 6 - Undantag

TDDI14 Objektorienterad programmering

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

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

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

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

SP:PROG3 HT12 Tenta

Tentamen, Algoritmer och datastrukturer

TDIU01 Programmering i C++

Tentamen, EDA501 Programmering M L TM W K V

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

Tentamen TEN1 HI

Tentamen i Grundläggande Programvaruutveckling, TDA548

Inlämningsuppgift, EDAF30, 2018

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

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

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

Strömmar och strängar

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

Laboration A Objektsamlingar

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

DAT043 Objektorienterad Programmering

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

TDIU01 - Programmering i C++, grundkurs

Övningar Dag 2 En första klass

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.

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

Det finns många flaggor till g++,

Tentamen i DD2387 Programsystemkonstruktion med C++

Introduktion till arv

Tentamen i Grundläggande programmering STS, åk

TDIU01 - Programmering i C++, grundkurs

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

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

TENTAMEN OOP

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

Kapitel 5. Strömmar. Utmatning

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

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

1 Klasser och objektorientering Vad är objektorientering?

Kapitel 4 - Mallar. Kapitel 4. Introduktion till mallar STL. 2D1387 Programsystemkonstruktion med C++ 1

Tentamen, EDAA10 Programmering i Java

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Funktionens deklaration

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

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

TDIU01 - Programmering i C++, grundkurs

HI1024 Programmering, grundkurs TEN

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

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

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

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

Tentamen i Grundläggande programmering STS, åk 1 fredag

Tentamen *:85/2I4123 C

Tommy Färnqvist, IDA, Linköpings universitet

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

TDDI22 (exempel) TDDI22 Tentaregler

Tentamen i Introduktion till programmering

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen EDAF30 Programmering i C++ 2017 04 20, 14:00 19:00 Hjälpmedel: En valfri C++-bok. Andra papper med anteckningar eller utskrifter ä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 på problem som med fördel kan lösas enligt mera objektorienterade principer, eller egen implementering av sådant som finns i standardbiblioteket, kan därför ge poä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. Uppgifterna ger preliminärt 5 + 18 + 8 + 13 + 6 = 50 poäng. För godkänt krävs preliminärt 25 poäng (betygsgränser 3/25, 4/33, 5/42). Observera att ordningsföljden eller poängantalet för uppgifterna inte nödvändigtvis avspeglar deras svårighet. 1. Vad skrivs ut när följande program exekveras? Motivera ditt svar med en beskrivning av varför programmet tolkas som det gör. #include<iostream> using std::cout; class B int f(int i) return i+1; ; class D : public B double f(double d) return d+1.3; ; D* pd = new D; cout << pd->f(2) << \n ; cout << pd->f(2.3) << \n ; delete pd; Om du inte vet, kan du på denna uppgift i stället välja att svara Jag vet inte.. Detta svar (d v s ett svar med endast meningen Jag vet inte. ) ger två poäng.

2(5) 2. I den nya C++-standarden, C++11, finns en klassmall std::array som är en wrapper runt en inbygggd array. Klassen fungerar nästan som en riktig standard-container, med iteratorer, överlagrad indexeringsoperator och size-funktion. Men det är fortfarande inte någon dynamisk struktur: den har fix storlek, så det finns inte push_back, resize eller liknande funktioner. En sådan klassmall kan (delvis) implementeras enligt följande exempel: template <typename T, size_t N> class array using size_type = size_t; T& operator[](size_type i) return arr[i]; size_type size() const return N; private: T arr[n]; ; och användas som i detta huvudprogram for (array<int, 3>::size_type i = 0; i!= a.size(); ++i) cout << a[i] << endl; vilket ger utskriften 4 9 a) Man vill i stället för att skriva ut arrayen direkt i for-satsen ovan använda en funktionsmall template <typename Cont> void print1(const Cont& c) for (typename Cont::size_type i = 0; i!= c.size(); ++i) cout << c[i] << endl; så att huvudprogrammet kan bli print1(a); När man försöker kompilera detta program får man kompileringsfelet In instantiation of void print1(const Cont&) [with Cont = array<int, 3ul>] : error: passing const array<int, 3ul> as this argument discards qualifiers [-fpermissive] note: in call to T& array<t, N>::operator[](array<T, N>::size_type) [with T = int; long unsigned int N = 3ul; array<t, N>::size_type = long unsigned int] Vad beror felet på? Korrigera klassmallen array så att huvudprogrammet med print1 fungerar. Svara med en förklaring av problemet och kod som visar hur array ska ändras.

3(5) b) Lägg till funktioner så att också följande utskriftsmetod fungerar (d v s att man kan byta ut anropet av print1 mot ett anrop av nedanstående print2 i ovanstående huvudprogram): template <typename Cont> void print2(const Cont& c) for (typename Cont::const_iterator it = c.begin(); it!= c.end(); ++it) cout << *it << endl; c) Kan man, med din klassmall array (d v s inklusive dina svar till uppgift a och b), ersätta anropen av print1 respektive print2 med en range for-loop? D v s fungerar följande program? for(auto x : a) cout << x << endl; Om ja, förklara varför (d v s ange vilka funktioner som anropas, motivera att typerna stämmer överens, etc.). Om nej, lägg till det som krävs för att programmet ska fungera. d) Att först konstruera en array och därefter kopiera in elementen är onödigt klumpigt. Komplettera klassmallen så att man kan ge en array värden när man skapar den. Initieringen behöver även kontrollera att antalet element stämmer. Om inte ska konstruktorn kasta std::length_error 1. Följande program är ett exempel på hur det ska fungera: void test_array_init_and_print() array<int,5> a1,3,5,7,9; for(auto x : a) cout << x << " "; cout << endl; array<int,3> b1,2,3,4,5; for(auto x : b) cout << x << " "; cout << endl; Utmatningen ska vara 1 3 5 7 9 terminate called after throwing an instance of std::length_error what(): size mismatch in initialization Efter ändringen ska alla ovanstående exempelprogram fungera (d v s ändringarna får inte göra att något av main-funktionerna från tidigare i uppgiften slutar fungera). 1 Notera att std::array är implementerad så att man får ett kompileringsfel om längden inte stämmer, men i denna uppgiften ska exception användas.

4(5) 3. När man försöker kompilera följande program 1 #include <iostream> 2 using std::cout; 3 using std::cin; 4 using std::endl; 5 6 struct A 7 A(int x) val = x; 8 void print() cout << "A("<<val<<")\n"; 9 int val; 10 ; 11 12 13 struct B 14 B(int x) a=a(x); 15 void print() cout << "B("; a.print(); cout << ")\n"; 16 A a; 17 ; 18 19 20 21 B b(10); 22 b.print(); 23 får man kompileringsfelet testprogram.cpp 14 col 14 error no matching function for call to A::A() B(int x) a=a(x); testprogram.cpp 7 col 5 info candidate: A::A(int) A(int x) val = x; testprogram.cpp 7 col 5 info candidate expects 1 argument, 0 provided testprogram.cpp 6 col 8 info candidate: constexpr A::A(const A&) struct A testprogram.cpp 6 col 8 info candidate expects 1 argument, 0 provided testprogram.cpp 6 col 8 info candidate: constexpr A::A(A&&) testprogram.cpp 6 col 8 info candidate expects 1 argument, 0 provided a) Förklara varför kompileringsfelet uppstår b) Visa hur man kan ändra klassen A för att åtgärda felet. c) Visa hur man kan ändra klassen B för att åtgärda felet.

5(5) 4. Standard-algoritmen partition har följande beskrivning: template <typename Iterator, typename UnaryPredicate> // Move all elements in [first, last) to the front for which // op(elem) yields true. Return the first position for which // op yields false. The time complexity is linear. Iterator partition(iterator first, Iterator last, UnaryPredicate op); Exempel: partitionering av sekvensen 1,2,3,4,5,6 med villkoret jämnt tal ska ge resultatet 2,4,6,1,5,3 (den inbördes ordningen mellan de tre första talen är godtycklig, liksom mellan de tre sista). a) Skriv ett fullständigt program som läser in ett antal heltal (avslutade med end-of-file), lagrar talen i en std::vector, partitionerar vektorn så att alla jämna tal hamnar först och till slut skriver ut vektorn. Använd standard-algoritmer så mycket du kan (du måste använda partition). Du behöver inte formatera utskriften som 1,2,3,..., det är tillräckligt att göra en enkel utskrift, t ex att skriva varje element på en egen rad. b) Utöka ditt program så att båda delarna av vektorn sorteras i fallande ordning. Exemplet ovan ska alltså ge resultatet 6,4,2,5,3,1 c) Implementera funktionsmallen partition. 5. Texteditorer som är avsedda för editering av programtext brukar hjälpa till med parentesmatchning : när man skriver en högerparentes, ), ] eller, så markerar editorn motsvarande vänsterparentes. Exempel (... står för en godtycklig följd av tecken som inte innehåller några parenteser): Givet en klass Editor,...(...(...[...]...)...)... 01234567890123456789012345678901234 1 2 3 class Editor Editor(const std::string&); std::string::size_type find_left_par(std::string::size_type pos) const; // functions to edit the text (insert and delete characters) private: std::string text; ; implementera funktionen Editor::find_left_par: givet en poisition i texten ska positionen för en matchande parentes returneras, om sådan finns, eller string::npos om ingen match finns. Du behöver inte kontrollera att parenteser av annan typ innanför matchningen är korrekt balanserade.