Tentamen C++-programmering

Relevanta dokument
Tentamen, Programmeringsteknik för BME, F och N

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

Styrteknik: Binära tal, talsystem och koder D3:1

Tentamen, EDA501 Programmering M L TM W K V

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

Tentamen EDAF30 Programmering i C++

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen EDAF30 Programmering i C++

Att skriva till och läsa från terminalfönstret

Recitation 4. 2-D arrays. Exceptions

Tentamen C++-programmering

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

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

SP:PROG3 HT12 Tenta

Repetition C-programmering

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 Programmering i C++

Tommy Färnqvist, IDA, Linköpings universitet

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

LULEÅ TEKNISKA UNIVERSITET

Del6 Strömmar Ämnesområden denna föreläsning:

Tentamen EDAF30 Programmering i C++

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Exempelsamling Assemblerprogrammering

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

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Support Manual HoistLocatel Electronic Locks

Objektsamlingar i Java

Föreläsning 4 IS1300 Inbyggda system

Calculate check digits according to the modulus-11 method

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

Repetition av OOP- och Javabegrepp

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

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

Repetition av OOP- och Javabegrepp

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

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Kapitel 5. Strömmar. Utmatning

Övning 1 - Abstrakta datatyper

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

12.6 Heat equation, Wave equation

Introduktion C-programmering

TDIU01 - Programmering i C++, grundkurs

Övning 3 - Tillämpad datalogi 2012

Objektorienterad Programmering (TDDC77)

Tentamen i Programmering

Tentamen Grundläggande programmering

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

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Grafisk teknik IMCDP IMCDP IMCDP. IMCDP(filter) Sasan Gooran (HT 2006) Assumptions:

TENTAMEN OOP

Föreläsning 3. Stack

Föreläsning 3. Stack

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

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

Tentamen FYTA11 Javaprogrammering

Programmeringsteknik med C och Matlab

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Tentamen FYTA11 Javaprogrammering

VHDL Basics. Component model Code model Entity Architecture Identifiers and objects Operations for relations. Bengt Oelmann -- copyright

Försättsblad till skriftlig tentamen vid Linköpings Universitet

OBS!! Detta är DEL 2 av tentan. För att få ut denna måste du ha lämnat in del 1. Om du inte fått ut del 1 bör du meddela skrivningsvakten. OBS!!

PROGRAMMERING-Java Omtentamina

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

Föreläsning 11: Rekursion

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tentamen PC-teknik 5 p

c = s[2]; /* move chars around */ p = &s[2]; *p = *(p-1); --p; *p = *(p-1); s[0] = c; printf("%s\n",s); /* print the string */ English version

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Tentamen i Grundläggande Programvaruutveckling, TDA548

Lösningar till tentamen i EIT070 Datorteknik

Materialplanering och styrning på grundnivå. 7,5 högskolepoäng

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

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

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

LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik

PROGRAMMERING-JAVA TENTAMINA

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen Datastrukturer D DAT 036/DIT960

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Tentamen i DD2387 Programsystemkonstruktion med C++

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Strömmar och strängar

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

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

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Grafisk teknik IMCDP. Sasan Gooran (HT 2006) Assumptions:

Föreläsning 9 Innehåll

Transkript:

LUNDS TEKNISKA HÖGSKOLA (8) Institutionen för datavetenskap Tentamen C++-programmering 205 08 28, 8.00 3.00 Hjälpmedel: 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 att du kan använda C++ standardklasser. C-lösningar ger inga poäng, även om de är korrekta. Uppgifterna ger preliminärt 6 + 6 + 6 + 2 = 50 poäng. För godkänt krävs 25 poäng (3/25, 4/33, 5/42).. I C++ kan man lagra callable objects (funktioner, lambdafunktioner, funktionsobjekt) i objekt av klassen function (definieras i header-filen <functional>). Man anger returtyp och parametertyper för funktionen som ska lagras. Exempel: int incr(int a) { int b = ; return a + b; int main() { function<int(int)> f = incr; // auto also works cout << f(0) << endl; // prints Om man vill ha en funktion som ökar argumentet med ett annat tal än måste man skriva en ny funktion. Alternativt kan man skapa funktionen under exekvering: function<int(int)> create_function(int b) { return [???](int a) { return a + b; ; // see below for what??? should be int main() { auto f2 = create_function(2); // adds 2 to the argument cout << f2(0) << endl; // prints 2 auto f3 = create_function(5); // adds 5 to the argument cout << f3(0) << endl; // prints 5 Förklara vad som inträffar om [???] i definitionen av lambdafunktionen byts mot: a) [] b) [=] c) [&]

2(8) 2. I ett schemaläggningsprogram ska ett antal aktiviteter schemaläggas så att de inte kolliderar i tiden. Med den metod som beskrivs här får man oftast en hyfsad lösning men inte säkert en lösning med minsta totala tid för aktiviteterna. Problemet beskrivs enligt följande: ett antal rader innehåller ettor och nollor etta betyder upptagen, nolla betyder ledig. Raderna ska skiftas åt höger så att det blir högst en etta i varje kolonn. Exempel med fem rader där ettor visas med, nollor med blank: Alla rader har från början en etta längst till vänster. Man börjar med att sortera raderna så att raden med flest ettor hamnar först, sedan den rad som innehåller näst flest ettor, osv. Detta ger: Efter sorteringen har den första raden fått sin rätta plats. Sedan skiftar man den andra raden åt höger tills ingen etta i den kolliderar med någon etta i den första raden. På samma sätt skiftar man den tredje raden tills ingen etta kolliderar med någon etta i någon av de tidigare raderna, osv. Slutresultatet blir: Implementera en klass Scheduler som genomför schemaläggningen. Programmet ska användas enligt följande exempel: int main() { ifstream in("activities.txt"); // input file (lines with s and spaces) if (!in) { cerr << "Cannot open activity file" << endl; exit(); Scheduler sc(in); // read input from in sc.schedule(); // create schedule sc.print(cout); // print results on cout (lines with s and spaces) Tips: bitset är en bra klass (på sidan 5 och framåt finns dokumentation av klassen). Du kan förutsätta att positionen för den etta som hamnar längst till höger blir högst 80. (Bitarna ryms alltså inte i ett unsigned long long-tal.)

3(8) 3. En digital gråskalebild består av ett rutnät av pixlar där varje pixel har ett värde mellan 0 (helt svart) och 255 (helt vitt). Följande färdigskrivna klass beskriver sådana bilder: class Image { public: int width() const; // number of columns int height() const; // number of rows int get(int r, int c) const; // get pixel value at row r, column c void set(int r, int c, int v); // set pixel value to v... // constructors and other member functions ; Figur (a) visar exempel på en gråskalebild (av röda blodkroppar). I figur (b) har bruset reducerats, i figur (c) har föremålen skilts ut från bakgrunden genom att alla pixlar med värde över ett visst tröskelvärde har satts till 255, övriga pixlar till 0. För att man ska kunna analysera föremålen som finns i en bild vill man känna igen och numrera föremålen, 2, 3,... Denna numrering kallas märkning (görs i uppgift 4) och innebär att pixlar som tillhör samma föremål ges samma värde. Märkningen utgår från en trösklad bild. Figur (d) visar hur blodkropparna märkts. För att hålla reda på att olika pixlar tillhör samma föremål används ekvivalensklasser (ordet har inget med klasser i objektorienterad programmering att göra). Om talen och 3 hör ihop, liksom 7 och 8, och 5 och 9, finns det tre ekvivalensklasser: 3 7 8 5 9 Om också 2 och 7 hör ihop utökas en av klasserna: 3 2 7 8 5 9 Om också och 5 hör ihop slås två klasser samman: 3 5 9 2 7 8 Ett tal kan tillhöra högst en ekvivalensklass. Klassen EquivalenceClasses beskriver ett antal ekvivalensklasser: class EquivalenceClasses { public: void join(int a, int b); // a and b shall belong to the same equivalence class // (three cases, see below) int least(int n) const; // the smallest number in n s equivalence class // (or n itself, if n doesn t belong to a class) ; I join: ) om båda talen ingår i olika klasser så slås klasserna samman, 2) om ett av talen inte ingår i en klass läggs det in i det andra talets klass, 3) annars skapas en ny klass. Implementera klassen EquivalenceClasses. Varje ekvivalensklass är en mängd av heltal i intervallet [, 255]. Det är praktiskt att representera en sådan mängd med ett bitset (dokumentation finns på sidan 5 och framåt). (a) Ursprunglig bild (b) Efter brusreducering (c) Trösklad (d) Märkt Figur : Bilder av röda blodkroppar

4(8) 4. Vi återvänder till märkningen av gråskalebilderna. Märkningen bygger på följande idé: gå igenom bildens pixlar. För varje pixel som tillhör ett föremål undersöks två andra pixlar: den ovanför och den till vänster. Om någon av dessa pixlar (ovanför/vänster) är märkt, så låter man den färga av sig till den aktuella pixeln. Annars anses pixeln tillhöra ett nytt föremål och märks med ett eget värde. Ett specialfall inträffar då pixlarna (ovanför/vänster) båda är märkta men med olika värden. Ett exempel visas i figur 2(b), då pixeln med frågetecknet ska märkas. Man väljer då ett av de två värdena till den aktuella pixeln och gör en notering om att de två värdena ( och 2 i figuren) är ekvivalenta. De tillhör ju samma föremål. Efteråt gås bilden igenom en andra gång. Då får alla pixlar i varje föremål samma värde, utifrån de ekvivalenser som upptäckts. Föremålet i figur 2 kan då märkas med värdet för alla pixlar. (a) Omärkt föremål (b) Specialfall Figur 2: Märkning Noggrannare beskrivning av algoritmen:. Låt n vara ett heltal, inledningsvis. 2. Gå igenom bildens alla pixlar, rad för rad från vänster till höger. Om den aktuella pixeln tillhör ett föremål (dess värde är mindre än 255) beräknas dess nya värde a som följer: Låt p vara pixelvärdet närmast till vänster om pixeln. Låt p 2 vara pixelvärdet närmast ovanför pixeln. Om p tillhör ett föremål, men inte p 2, låt a = p. Om p 2 tillhör ett föremål, men inte p, låt a = p 2. Om både p och p 2 tillhör föremål, låt a = p. Om p och p 2 är olika (och båda tillhör föremål), notera att p och p 2 är ekvivalenta. Om varken p eller p 2 tillhör föremål, låt a = n och öka n med. 3. Gå därefter igenom bildens alla pixlar en andra gång. Varje pixel som tillhör ett föremål får sitt värde a ersatt med det minsta pixelvärde som är ekvivalent med a. Skriv en global funktion med rubriken void label(image& im) som utför märkningen.

5(8) std::bitset Defined in header <bitset> template< std::size_t N > class bitset; The class template bitset represents a fixed-size sequence of N bits. Bitsets can be manipulated by standard logic operators and converted to and from strings and integers. bitset meets the requirements of CopyConstructible and CopyAssignable. Template parameters N - the number of bits to allocate storage for Member types reference proxy class representing a reference to a bit (class) Member functions (constructor) operator== operator!= constructs the bitset compares the contents Element access operator[] test all (C++) any none count accesses specific bit accesses specific bit checks if all, any or none bits are set to true returns the number of bits set to true Capacity size returns the size number of bits that the bitset can hold Modifiers operator&= operator = operator^= operator~ operator<<= operator>>= operator<< operator>> set reset flip performs binary AND, OR, XOR and NOT performs binary shift left and shift right sets bits to true or given value sets bits to false toggles the values of bits Conversions

6(8) to_string to_ulong to_ullong (C++) returns a string representation of the data returns an unsigned long integer representation of the data returns an unsigned long long integer representation of the data Non-member functions operator& operator operator^ operator<< operator>> performs binary logic operations on bitsets (function template) performs stream input and output of bitsets (function template) Helper classes std::hash<std::bitset> (C++) hash support for std::bitset (class template specialization) Notes If the size of the bitset is not known at compile time, std::vector<bool> or boost::dynamic_bitset (http://www.boost.org/doc/libs/release/libs/dynamic_bitset/dynamic_bitset.html) may be used. Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/utility/bitset&oldid=5950"

7(8) std::bitset::bitset constexpr bitset(); () constexpr bitset( unsigned long val ); constexpr bitset( unsigned long long val ); template< class CharT, class Traits, class Alloc > explicit bitset( const std::basic_string<chart,traits,alloc>& str, typename std::basic_string<chart,traits,alloc>::size_type pos = 0, typename std::basic_string<chart,traits,alloc>::size_type n = std::basic_string<chart,traits,alloc>::npos); template< class CharT, class Traits, class Alloc > explicit bitset( const std::basic_string<chart,traits,alloc>& str, typename std::basic_string<chart,traits,alloc>::size_type pos = 0, typename std::basic_string<chart,traits,alloc>::size_type n = std::basic_string<chart,traits,alloc>::npos, CharT zero = CharT( 0 ), CharT one = CharT( )); template< class CharT > explicit bitset( const CharT* str, typename std::basic_string<chart>::size_type n = std::basic_string<chart>::npos, CharT zero = CharT( 0 ), CharT one = CharT( )); (2) (3) (until C++) (since C++) (until C++) (since C++) (4) (since C++) Constructs a new bitset from one of several optional data sources: ) Default constructor. Constructs a bitset with all bits set to zero. 2) Constructs a bitset, initializing the first (rightmost, least significant) M bit positions to the corresponding bit values of val, where M is the smaller of the number of bits in an unsigned long long and the number of bits N in the bitset being constructed. If M is less than N (the bitset is longer than 32 (until C++) 64 (since C++) bits, for typical implementations of unsigned long (since C++)long), the remaining bit positions are initialized to zeroes. 3) Constructs a bitset using the characters in the std::basic_string str. An optional starting position pos and length n can be provided, as well as characters denoting alternate values for set (one) and unset (zero) bits. Traits::eq() is used to compare the character values. The effective length of the initializing string is min(n, str.size() - pos). If pos > str.size(), this constructor throws std::out_of_range. If any characters examined in str are not zero or one, it throws std::invalid_argument. 4) Similar to (3), but uses a CharT* instead of a std::basic_string. Equivalent to bitset(n == basic_string<chart>::npos? basic_string<chart>(str) : basic_string<chart>(str, n), 0, n, zero, one) Parameters val - number used to initialize the bitset str - string used to initialize the bitset pos - a starting offset into str n - number of characters to use from str one - alternate character for set bits in str zero - alternate character for unset bits in str Exceptions ) none 2) none ) noexcept specification: noexcept 2) noexcept specification: noexcept (until C++) (since C++) 3) std::out_of_range if pos > str.size(), std::invalid_argument if any character is not one or zero 4) std::invalid_argument if any character is not one or zero Example Run this code #include <bitset> #include <string> #include <iostream> #include <climits> int main()

8(8) { // empty constructor std::bitset<8> b; // [0,0,0,0,0,0,0,0] // unsigned long long constructor std::bitset<8> b2(42); // [0,0,,0,,0,,0] std::bitset<70> bl(ullong_max); // [0,0,0,0,0,0,,,,...,,,] in C++ std::bitset<8> bs(0xfff0); // [,,,,0,0,0,0] // string constructor std::string bit_string = "000"; std::bitset<8> b3(bit_string); // [0,0,,,0,0,,0] std::bitset<8> b4(bit_string, 2); // [0,0,0,0,0,0,,0] std::bitset<8> b5(bit_string, 2, 3); // [0,0,0,0,0,0,0,] // string constructor using custom zero/one digits std::string alpha_bit_string = "abaabbab"; std::bitset<8> b6(alpha_bit_string, 0, alpha_bit_string.size(), 'a', 'B'); // [0,,0,0,,,0,] // char* constructor using custom digits std::bitset<8> b7("xxxxyyyy", 8, 'X', 'Y'); // [0,0,0,0,,,,] std::cout << b << '\n' << b2 << '\n' << bl << '\n' << bs << '\n' << b3 << '\n' << b4 << '\n' << b5 << '\n' << b6 << '\n' << b7 << '\n'; Output: 00000000 00000 000000 0000 00000 0000000 0000000 0000 0000 See also set reset sets bits to true or given value sets bits to false Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/utility/bitset/bitset&oldid=74090"