DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18: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, 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 Rule of three Tre kompisgäng försöker komma överens om vilken budgetfilm de ska titta på. Det är svårt. Ett gäng vägrar se importerade budgetfilmer vilket de andra tycker är fånigt. Efter ett omständigt röstningsförfarande och hot om extraval när fel film vann så kommer man nästan överens om att det behövs regler eller i alla fall en praxis för budgetfilmomröstningen. Regler i C++ är också viktiga. a) Vilka automatiskt genererade medlemsfunktioner brukar ingå i det som tidigare (C++98) kallades för "Rule Of Three"? b) I labb1 konstruerade du en vektorklass där du antagligen var tvungen att implementera ovanstående metoder. Antag att du hade missat att göra detta, vad hade kunnat hända då? Skriv kort exempelkod som visar hur och vad som kunnat bli fel. Gör det för var och en av de tre rule-of-three metoderna. 1 of 6
2 Val av film En del kan sina filmer både framlänges och baklänges och ibland gör det ingen större skillnad om man ser slutet först. Palindrom är ord eller tal som blir lika vare sig man läser det från början eller slutet. a) Skriv en generisk funktion non_palindrom_indeces som tar två typparametriserade iteratorer som parametrar och returnerar en vektor (std::vector) av par (std::pair) med de platser (iteratorer) som avviker från ett palindrom. Om mängden utgör ett palindrom returneras en tom vektor. Både tomma mängden och ett ensamt element utgör palindrom. Var noga med gränserna. b) Skriv ett litet main-program som illustrerar hur din funktion fungerar genom att anropa din funktion minst tre gånger med olika parametrar. Ange eller rita vad som returneras. Exempel: int main() { string s = "11111011111"; // år 2015 i binär form auto v = non_palindrom_indeces(s.begin(), s.end());... c) Vad ställer din kod för krav på parametrarna? 2 of 6
3 Något om const En duva satt på en gren och funderade på alla konstiga filmer som får filmpriser nuförtiden. Att ha koll på const är viktigt i C++. 01 #include <iostream> 02 #include <string> 03 04 struct Film { 05 Film (std::string t) : m_title (t) { 06 07 std::string title () { 08 return m_title; 09 10 11 std::string m_title; 12 ; 13 14 void press_release (const Film & target) { 15 std::cout << "Best movie of the year: " << target.m_title << std::endl; 16 17 18 int main () { 19 Film x ("Transformers"); 20 const Film y ("Constantine"); 21 22 press_release (x); 23 press_release (y); 24 25 std::string x_title = x.title (); 26 std::string y_title = y.title (); 27 a) Koden ovan genererar kompileringsfel. Vad är det som är fel? b) Kompilerar nedanstående kod: 1 Om inte, varför? 2 Om ja, vad har a, aref och x för värden vid programslut? int main() { int a = 2014; const int & aref = a; ++a; int x = aref; 3 of 6
4 Kontroversiell film En dum diktator anser sig kränkt av att han mördas i en påhittad storbudgetfilm och hotar med represalier mot de biografer som dristar sig visa filmen. Flera filmpalatskedjor drar sig ur premiärvisningen. Det blir debatt om film och dess funktion i samhället. Allt pekar dock på att filmen visas trots allt. Att ha koll på pekare och funktionspekare är viktigt i C++. a) Nedan står tre funktioner som tar en Film som parameter (och visar den). Din uppgift är att skriva en ny funktion visa_film som tar två parametrar, en Film och en funktionspekare. Din funktion ska anropa funktionen som funktionspekaren pekar på och skicka med filmen som parameter. void filmpalats(const Film &) { /*... */ ; void kvartersbiograf(const Film &) { /*... */ ; void internet(const Film &) { /*... */ ; // TODO: implementera visa_film void main () { Film intervjun = Film(); visa_film (&filmpalats, intervjun); // sammma som filmpalats(intervjun) visa_film (&kvartersbiograf, intervjun); //... b) Antag följande klass finns deklarerad sedan tidigare struct Filmpalats { void operator() (const Film &) { /*... */ ; ; Går det att anropa din funktion visa_film på följande sätt. Motivera kort. // forts av main Filmpalats f; visa_film(f, intervjun); 4 of 6
5 Virtual reality En storbudgetfilm baserad på de sista tio sidorna i en barnbok gör stor succé på biograferna. Iförda 3D-glasögon upplevs värsta virtual reality projicerad på bioduken. Att ha koll på virtual är en viktig realitet av var C++-programmerares vardag. Vad skriver nedanstående prgram ut? #include <iostream> struct Film { virtual void show() { std::cout << "actors acting" << std::endl; ; void story() { std::cout << "some script" << std::endl; struct BlockBuster : Film { virtual void show() override { std::cout << "awesome effects" << std::endl; ; struct MockBuster : BlockBuster { virtual void show() override { std::cout << "cheap settings" << std::endl; void story() { std::cout << "cheap copy" << std::endl; ; int main() { MockBuster age_of_the_hobbits; BlockBuster the_hobbit; Film & film = age_of_the_hobbits; age_of_the_hobbits.show(); the_hobbit.show(); film.show(); std::cout << "-----------------" << std::endl; age_of_the_hobbits.story(); the_hobbit.story(); film.story(); 5 of 6
6 Läckande listor En populär filmsajt har problem med sin databas som består av länkade listor. Ibland läggs inte filmer eller filmkommentarer in trots att man bett om det. Man har lokaliserat ett par funktioner som man misstänker kan vara trasiga. template <class T> struct Node { Node() : data(t()), next(nullptr) { Node(T d, Node * p) : data(d), next(p) { // klassen Node är inget fel på ; T data; Node<T> * next; template <class T> void insertlast (Node<T> * p, T data) { if (p == nullptr) { p = new Node<T>(data, nullptr); else { while (p -> next!= nullptr) { p = p -> next; p -> next = new Node<T>(data, nullptr); // OBS call by value template <class T> void insertfirst (Node<T> * & p, const T & data) { Node<T> * tmp = new Node<T>(data, p); p = tmp; // OBS call by reference a) Vad är det som är problem med koden? Exemplifiera med ett main program. Rita hur minnet ser ut i ditt program och förklara. b) Sammanfatta med högst två meningar vad som är problem med koden? 6 of 6