Szablony wyrażeń i Boost Spirit
|
|
- Marian Stachowiak
- 8 lat temu
- Przeglądów:
Transkrypt
1 Szablony wyrażeń i Boost Spirit Romuald Juchnowicz-Bierbasz Warsaw C++ Users, 2015
2 Plan prezentacji Szablony wyrażeń Wprowadzenie Implementacja Właściwości i zastosowania Boost spirit Wprowadzenie Struktura biblioteki Teoria Podstawy Atrybuty parsera Akcje semantyczne Pozostałe funkcjonalności Zalety Źródła
3 Problem - Biblioteka do algebry liniowej Przykładowa implementacja klasy vector: 1 # include <vector > 2 3 class vector { 4 public : 5 vector ( size_t size ) : _data (size ) {} 6 double & operator []( size_t i) { return _data [i ];} 7 const double & operator []( size_t i) const { return _data [i ];} 8 size_t size (void ) const { return _data.size () ;} 9 private : 10 std :: vector < double > _data ; 11 }; Chcielibyśmy umożliwić zapis następujących wyrażeń: 1 vector v1 (3) ; 2 v1 [0] = 0; v1 [1] = 1; v1 [2] = 2; 3 vector v2 (3) ; 4 v2 [0] = 0; v2 [1] = 1; v2 [2] = 2; 5 vector v3 = v1 + v2 * 2;
4 Pierwsze podejście - przeciążenie operatorów +, *: 1 class vector { 2 public : 3 vector ( size_t size ) : _data (size ) {} 4 double & operator []( size_t i) { return _data [i ];} 5 double operator []( size_t i) const { return _data [i ];} 6 size_t size (void ) const { return _data.size () ;} 7 vector operator +( const vector & rhv ); 8 vector operator *( double rhv ); 9 private : 10 std :: vector < double > _data ; 11 }; // jesli chcemy pozwolic na wyrazenia 2 * v to rowniez : 14 vector operator *( double rhv, const vector & lhv );
5 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2;
6 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2; Przynajmniej 2 razy (przy założeniu RVO): tmp = v2 * 2 v3 = v1 + tmp
7 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2; Przynajmniej 2 razy (przy założeniu RVO): tmp = v2 * 2 v3 = v1 + tmp W przypadku bardziej złożonych wyrażeń odpowiednio więcej (5): 1 vector v = v1 + v2 * 2 + v3 * 3;
8 A wystarczyłoby jedno wywołanie: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2;
9 A wystarczyłoby jedno wywołanie: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2; Chcielibyśmy, aby poniższe wyrażenie generowało kod równoważny powyższemu: 1 vector v3 = v1 + v2 * 2
10 Pierwsza implementacja 1 template < typename E1, typename E2 > 2 class vector_addition { 3 public : 4 vector_addition ( const E1& u, const E2& v) 5 : _u(u), _v(v) 6 { 7 assert (u. size () == v. size ()); 8 } 9 double operator []( size_t i) const { 10 return _u[i] + _v[i]; 11 } 12 size_t size ( void ) const { return _u.size () ;} 13 private : 14 const E1& _u; 15 const E2& _v; 16 }; template < typename E> 19 class vector_scaled { 20 public : 21 vector_scaled ( const E& v, double scalar ) 22 : _v(v), _scalar ( scalar ) {} 23 double operator []( size_t i) const { 24 return _v[i] * _scalar ; 25 } 26 size_t size ( void ) const { return _v.size () ;} 27 private : 28 const E& _v; 29 double _scalar ; 30 };
11 Dodajmy odpowiedni konstruktror do klasy vector: 1 class vector { template < typename E> 4 vector (E const & exp ) { 5 _data. resize (exp.size ()); 6 for ( size_type i = 0; i!= exp.size (); ++i) { 7 _data [i] = exp [i]; 8 } 9 } };
12 Dodajmy jeszcze operatory, które jednocześnie będę pełniły rolę funkcji tworzących (Creator Functions - analogicznie do, np. std::make pair): 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Możemy teraz zapisać: 1 v1 + v2 * 2;
13 Dodajmy jeszcze operatory, które jednocześnie będę pełniły rolę funkcji tworzących (Creator Functions - analogicznie do, np. std::make pair): 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Możemy teraz zapisać: 1 v1 + v2 * 2; Jaki typ będzie miało to wyrażenie?
14 Do wykrywania typu użyjemy sztuczki zaprezentowanej przez Scotta Mayersa w Effective Modern C++ : 1 template <typename T> 2 class TD; // deklaracja bez definicji 3 4 TD < decltype (v1 + v2 * 2) > etype ; Błąd kompilatora: 1>c:\ users \ romek \ documents \ visual studio 2010\ projects \ spirit \ spirit \main.cpp (69) : error C2079 : etype uses undefined class TD<T> 1> with 1> [ 1> T=vector_addition <vector, vector_scaled <vector >> 1> ] 1>
15 Drzewo składniowe Nasz typ to: vector addition 1 vector_addition < 2 vector, 3 vector_scaled < 4 vector 5 > 6 > vector vector scaled vector double Czy widać tu podobieństwo do znanego wzorca projektowego?
16 Diagram klas Tak klasa nie jest zadekarowana vector policy +operator[](index: size_t): double +size(return_value: size_t) vector -_data: std::vector<double> +opertor[](index: size_t): double +size(return_value: size_t) vector_addition +size(return_value: size_t) +opertor[](index: size_t): double E1 E2
17 Diagram klas - wzorzec kompozyt Component +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) Leaf +Operation() Composite +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) +children
18 Diagram klas - wzorzec kompozyt Component +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) Leaf +Operation() Composite +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) +children Dlaczego więc po prostu nie stosować wzorca kompozyt?
19 Pytanie Are inline virtual member functions ever actually inlined? C++ Super-FAQ
20 Pytanie Are inline virtual member functions ever actually inlined? Odpowiedź Occasionally... C++ Super-FAQ When the object is referenced via a pointer or a reference, a call to a virtual function cannot be inlined, since the call must be resolved dynamically. Reason: the compiler can t know which actual code to call until run-time (i.e., dynamically), since the code may be from a derived class that was created after the caller was compiled. Therefore the only time an inline virtual call can be inlined is when the compiler knows the exact class of the object which is the target of the virtual function call. This can happen only when the compiler has an actual object rather than a pointer or reference to an object. I.e., either with a local object, a global/static object, or a fully contained object inside a composite.
21 Szablony wyrażeń pozwalają kompilatorowi na optymalizację kodu poprzez inline owanie metod klas składających się na wyrażenie. Możliwe jest więc aby polecenie: 1 vector v = v1 + v2 * 2; Wygenerowało kod analogiczny do: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2;
22 Problem - przeciążanie operatorów W naszym przykładzie przeciążyliśmy operatory +, *: 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Czy taki kod może powodować problemy?
23 Przeciążyliśmy operatory dla dowolnych typów.
24 Przeciążyliśmy operatory dla dowolnych typów. Możemy sobie z tym poradzić dzięki: opakowaniu wszystkiego w przetrzeń nazw, zastosowaniu statycznego polimorfizmu - Curiously recurring template pattern - CRTP
25 Curiously recurring template pattern Przypomnijmy: 1 // CRTP 2 template <class T> 3 class Base 4 { 5 // metody klasy Base moga miec dostep do metod / atrybutow klasy Derived 6 }; 7 class Derived : public Base <Derived > 8 { 9 // };
26 Tworzymy szablonową klasę bazową: 1 template < typename E> 2 class expression { 3 public : 4 size_t size () const { return static_cast <E const & >(* this ).size () ;} 5 double operator []( size_t i) const { 6 return static_cast <E const & >(* this )[i]; 7 } 8 9 operator E &() { return static_cast <E& >(* this ); 10 operator const E &() const { return static_cast <const E& >(* this );} 11 };
27 Tworzymy szablonową klasę bazową: 1 template < typename E> 2 class expression { 3 public : 4 size_t size () const { return static_cast <E const & >(* this ).size () ;} 5 double operator []( size_t i) const { 6 return static_cast <E const & >(* this )[i]; 7 } 8 9 operator E &() { return static_cast <E& >(* this ); 10 operator const E &() const { return static_cast <const E& >(* this );} 11 }; Klasy vector, vector addition oraz vector scaled dziedziczą z expression: 1 class vector : public expression <vector > { 2 public : 3 vector ( size_t size ) : _data (size ) {} 4 template <typename E> vector ( expression <E> const & exp ); 5 double & operator []( size_t i) { return _data [i ];} 6 double operator []( size_t i) const { return _data [i ];} 7 size_t size (void ) const { return _data.size () ;} 8 private : 9 std :: vector <double > _data ; 10 };
28 1 template < typename E1, typename E2 > 2 class vector_addition : public expression < vector_addition <E1, E2 > > { 3 public : 4 vector_addition ( const E1& u, const E2& v) : _u(u), _v(v) { 5 assert (u. size () == v. size ()); 6 } 7 double operator []( size_t i) const { return _u[i] + _v[i ];} 8 size_t size (void ) const { return _u.size () ;} 9 private : 10 const E1& _u; 11 const E2& _v; 12 }; template < typename E> 15 class vector_scaled : public expression <vector_scaled <E> > { 16 public : 17 vector_scaled ( const E& v, double scalar ) : _v(v), _scalar ( scalar ) {} 18 double operator []( size_t i) const { return _v[i] * _scalar ;} 19 size_t size (void ) const { return _v.size () ;} 20 private : 21 const E& _v; 22 double _scalar ; 23 };
29 Teraz można operatory zapisać jako: 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( 3 const expression <E1 >& u, const expression <E2 >& v 4 ) 5 { 6 return vector_addition <E1, E2 >(u, v); 7 } 8 9 template < typename E> 10 vector_scaled <E> operator *( const expression <E>& v, double scalar ) 11 { 12 return vector_scaled <E >(v, scalar ); 13 }
30 Diagram klas Uzyskany digram klas jeszcze bardziej przypomina wzorzec kompozyt: expression E +opertor[](index: size_t): double +size(return_value: size_t) vector -_data: std::vector<double> +opertor[](index: size_t): double +size(return_value: size_t) vector_addition +opertor[](index: size_t): double +size(return_value: size_t) E1 E2
31 Właściwości i zastosowania szablonów wyrażeń Właściwości: pozwalają wygenerować szybki kod wynikowy przy pomocy intuicyjnej składni, wydłużają kompilację.
32 Właściwości i zastosowania szablonów wyrażeń Właściwości: pozwalają wygenerować szybki kod wynikowy przy pomocy intuicyjnej składni, wydłużają kompilację. Zastosowania: do tworzenia wbudowanych języków dziedzinowych (domain-specific embedded language - DSEL), np.: nasza przykładowa biblioteka do algebry liniowej, Blitz++ - obliczenia naukowe, Boost Spirit - gramatyki EBNF, implementacja wartościowania leniwego (lazy evaluation), do łatwej generacji funktorów.
33 Przykładowe rozwiązanie pozwalające na generację funkcji jednoargumentowych: 1 struct variable { 2 double operator () ( double v) { return v;} 3 }; 4 5 struct constant { 6 double c; 7 constant ( double d) : c (d) {} 8 double operator () ( double ) { return c;} 9 }; template <class L, class H, class OP> 12 struct binary_expression { 13 L l_; 14 H h_; 15 binary_expression (L l, H h) : l_ (l), h_ (h) {} 16 double operator () ( double d) { return OP :: apply (l_ (d), h_(d));} 17 }; struct add { 20 static double apply ( double l, double h) { return l + h;} 21 }; template <class E> 24 struct expression { 25 E expr_ ; 26 expression (E e) : expr_ (e) {} 27 double operator () ( double d) { return expr_ (d);} 28 };
34 Dodajmy jeszcze operatory i definicje typów: 1 template <class A, class B> 2 expression <binary_expression <expression <A>, expression <B>, add > > 3 operator+( expression <A> a, expression <B> b) 4 { 5 typedef binary_expression <expression <A>, expression <B>, add > ExprT ; 6 return expression <ExprT >( ExprT (a,b)); 7 } 8 9 typedef expression <variable > var ; 10 typedef expression <constant > lit ; Możemy teraz napisać: 1 var x(( variable ())); // dlaczego nawiasy? 2 lit l( constant (5.0) ); 3 double result = (x + l + x) (2) ; // 9
35 Boost spirit Wprowadzenie Problem Parsowanie listy liczb całkowitych: 1, 2, 3, 5, 12,... std::vector<int> Jakie pomysły?
36 Boost spirit Wprowadzenie Problem Parsowanie listy liczb całkowitych: 1, 2, 3, 5, 12,... std::vector<int> Jakie pomysły? pętla ze scanf lub std::istream::operator>>? boost::regex? readline i boost::split?
37 Problem A co gdy wejście się trochę komplikuje? 1 + 3, 2 2, 44 33,... std::vector<int>
38 Problem A co gdy wejście się trochę komplikuje? 1 + 3, 2 2, 44 33,... std::vector<int> W przypadku prostego wejścia wcześniejsze pomysły wystarczają... Ale gdy złożoność rośnie należy użyć rozwiązania: ładniejszego, bardziej skalowalnego, bardziej odpornego na błędy, etc.
39 Znane narzędzia do generacji parserów: ANTLR Bison Yacc
40 Znane narzędzia do generacji parserów: ANTLR Bison Yacc Wady: kody pośrednie należy nauczyć się ich stosowania linkowanie bibliotek
41 Znane narzędzia do generacji parserów: ANTLR Bison Yacc Wady: kody pośrednie należy nauczyć się ich stosowania linkowanie bibliotek Może Boost.Spirit?
42 Struktura biblioteki Biblioteka Boost Spirit składa się z 3 części: lex - do tworzenia lekserów qi - do tworzenia parserów karma - do formatowania danych ( odwrotność qi) W ramach seminarium dokładniej omówiona zostanie część qi. Boost spirit zbudowany jest dzięki wykorzystaniu szablonów wyrażeń (przy użyciu Boost Proto). Aby w pełni wykorzystać potencjał biblioteki dobrze jest znać inne biblioteki Boost: Fusion, Phoenix.
43 Struktura biblioteki
44 qi i karma - ying i yang qi zamienia wejście na struktry danych: : string [1, 2, 3] : vector karma określa formatowanie struktur danych na wyjściu: [1, 2, 3] : vector : string
45 Przepływ danych qi - karma
46 Gramatyki Boost Spirit operuje na gramatykach bezkontekstowych przy użyciu rozszerzona notacja Backusa-Naura (Extended Backus Naur Form - EBNF): typ 0 - gramatyka kombinatoryczne, typ 1 - gramatyki kontekstowe, typ 2 - gramatyki bezkontekstowe, typ 3 - gramatyki regularne.
47 Rozszerzona notacja Backusa-Naura Notacja Backusa-Naura cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera, { cyfra } liczba_calkowita ::= "0" [ "-" ], liczba_naturalna Rozszerzona notacja Backusa-Naura cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera cyfra* liczba_calkowita ::= "0" "-"? liczba_naturalna
48 Qi - podstawy Boost Spirit Qi pozwala na zdefiniowanie parsera przy pomocy notacji EBNF w kodzie C++: cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera cyfra* liczba_całkowita ::= "0" "-"? liczba_naturalna 1 cyfra_bez_zera = char_ ( 1 ) char_ ( 2 ) char_ ( 3 ) 2 char_ ( 4 ) char_ ( 5 ) 3 char_ ( 6 ) char_ ( 7 ) 4 char_ ( 8 ) char_ ( 9 ); 5 cyfra = char_ ( 0 ) cyfra_bez_zera ; 6 liczba_naturalna = cyfra_bez_zera >> * cyfra ; 7 liczba_calkowita = char_ ( 0 ) -char_ ( - ) >> liczba_naturalna ;
49 Prosty parser - krok 1 Parser liczby całkowitej: int_
50 Prosty parser - krok 1 Parser liczby całkowitej: int_ Qi posiada wiele innych wbudowanych parserów: double char str
51 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser.
52 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser. Parser serii liczb całkowitych: *int_
53 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser. Parser serii liczb całkowitych: *int_ Parser serii liczb całkowitych oddzielonych przecinkiem: int_ >> *(char_(, ) >> int_)
54 Prosty parser - cały kod 1 bool parse_numbers ( const std :: string & s) 2 { 3 using qi :: int_ ; 4 using qi :: phrase_parse ; 5 using ascii :: space ; 6 7 std :: string :: iterator first = s. begin (); 8 std :: string :: iterator last = s.end (); 9 10 bool r = phrase_parse ( 11 first, 12 last, 13 int_ >> *(, >> int_ ), 14 space // parser bialych znakow 15 ); 16 if ( first!= last ) // nie udalo sie sparsowac calego wejscia 17 return false ; 18 return r; 19 }
55 Prosty parser - cały kod 1 bool parse_numbers ( const std :: string & s) 2 { 3 using qi :: int_ ; 4 using qi :: phrase_parse ; 5 using ascii :: space ; 6 7 std :: string :: iterator first = s. begin (); 8 std :: string :: iterator last = s.end (); 9 10 bool r = phrase_parse ( 11 first, 12 last, 13 int_ >> *(, >> int_ ), 14 space // parser bialych znakow 15 ); 16 if ( first!= last ) // nie udalo sie sparsowac calego wejscia 17 return false ; 18 return r; 19 } Pytanie Dlaczego w definicji parsera nie używaliśmy char?
56 Qi - atrybuty parsera Każdy parser udostępnia atrybut syntezowany - typ zwracany po poprawnym parsowaniu, który reprezentuję sparsowane wejście. Na przykład: int - int double - double char - char str - std::string
57 Atrybuty złożone A co ze złożeniem parserów? Przykłady: Wyrażenie Typy argumentów Typ rezultatu (a >> b) a: A, b: B tuple<a, B> (a b) a: A, b: B variant<a, B> (a b) a: A, b: A A *a a: A vector<a> -a: a: A optional<a>
58 Atrybuty złożone - przykłady Atrybutem syntezowanym int >> *(char (, ) >> int ) jest tuple< int, vector< tuple <char, int> > > Ale już wyrażenie: int >> *(lit(, ) >> int ) ma atrybyt syntezowany: vector<int>
59 Akcje semantyczne Poprzedni parser dawał nam odpowiedź jedynie na pytanie Czy wejście jest poprawnym wyrażeniem w zadanej gramatyce?. To dość mało... Chcemy więcej! Chcemy akcji semantycznych!
60 Akcje semantyczne Poprzedni parser dawał nam odpowiedź jedynie na pytanie Czy wejście jest poprawnym wyrażeniem w zadanej gramatyce?. To dość mało... Chcemy więcej! Chcemy akcji semantycznych! Niech: P - paser A - akcja Korzystając z operatora indeksu możemy przypisać akcję do parsera. P[A] Akcja A jest wywoływana po poprawnym sparsowaniu wejścia przez parser P.
61 Akcje semantyczne Akcję możemy zdefiniować używając: wskaźnika do funkcji obiektu funkcyjnego Boost.Bind i wskaźnika do funkcji Boost.Bind i wskaźnika do metody Boost.Lambda Boost.Phoenix
62 Akcje semantyczne - przykłady 1 namespace qi = boost :: spirit :: qi; 2 // funkcja 3 void print ( int const & i) { 4 std :: cout << i << std :: endl ; 5 } 6 7 // metoda 8 struct writer 9 { 10 void print ( int const & i) const { 11 std :: cout << i << std :: endl ; 12 } 13 }; // funktor 16 struct print_action 17 { 18 void operator ()(int const & i, qi :: unused_type, qi :: unused_type ) const { 19 std :: cout << i << std :: endl ; 20 } 21 };
63 Akcje semantyczne - przykłady Mamy zadane wejście: "{integer}" Chcemy wypisać liczbę znajdującą się w nawiasach: 1 // wskaznik do funkcji 2 parse ( first, last, { >> int_ [& print ] >> } ); 3 4 // funktor 5 parse ( first, last, { >> int_ [ print_action ()] >> } ); 6 7 // Boost. Bind ze wskaznikiem do funkcji 8 parse ( first, last, { >> int_ [ boost :: bind (& print, _1)] >> } ); 9 10 // Boost. Bind ze wskaznikiem do metody 11 writer w; 12 parse ( first, last, { >> int_ [ boost :: bind (& writer :: print, &w, _1)] >> } ); // Boost. Lambda 15 parse ( first, last, { >> int_ [ std :: cout << _1 << \n ] >> } );
64 Przykład - parser liczb zespolonych Parser liczb zespolonych: ( >> double_ >> -(, >> double_) >> ) double_ 1 template <typename Iterator > 2 bool parse_complex ( Iterator first, Iterator last, std :: complex <double >& c) 3 { 4 /* using boost ::... */ 5 6 double rn = 0.0; 7 double in = 0.0; 8 bool r = phrase_parse ( first, last, 9 // Begin grammar 10 ( 11 ( >> double_ [ref (rn) = _1] 12 >> -(, >> double_ [ ref (in) = _1 ]) >> ) 13 double_ [ref (rn) = _1] 14 ), 15 // End grammar 16 space ); if (!r first!= last ) // fail if we did not get a full match 19 return false ; 20 c = std :: complex <double >(rn, in); 21 return r; 22 }
65 Magia Boost Phoenix Zamiast ref z Boost Phoenix: double_[ref(rn) = _1] mogliśmy napisać: 1 struct set_double { 2 double & _d; 3 void operator ()( double const & d, qi :: unused_type, qi :: unused_type ) const 4 { 5 _d = d; 6 } 7 set_double ( double & d) : _d(d) {} 8 }; double_ [ set_double (nr)] 12...
66 Przykład - lista liczb zmiennoprzecinkowych Zamiast: double_ >> *(, >> double_) możemy napisać: double_ %, 1 template <typename Iterator > 2 bool parse_numbers ( Iterator first, Iterator last, std :: vector <double >& v) 3 { 4 /* using... */ 5 6 bool r = phrase_parse ( first, last, 7 8 // Begin grammar 9 ( 10 double_ [ push_back ( ref (v), _1)] %, 11 ) 12, 13 // End grammar space ); if ( first!= last ) // fail if we did not get a full match 18 return false ; 19 return r; 20 }
67 Przykład - lista liczb zmiennoprzecinkowych Możemy od razy otrzymać atrybut syntezowany z parsera: 1 template <typename Iterator > 2 bool parse_numbers ( Iterator first, Iterator last, std :: vector <double >& v) 3 { 4 using qi :: double_ ; 5 using qi :: phrase_parse ; 6 using qi :: _1; 7 using ascii :: space ; 8 9 bool r = phrase_parse ( first, last, // Begin grammar 12 ( 13 double_ %, 14 ) 15, 16 // End grammar space, v); if ( first!= last ) // fail if we did not get a full match 21 return false ; 22 return r; 23 }
68 Pozostałe funkcjonalności definiowanie reguł gramatycznych definiowanie gramatyk struktury jako atrybut syntezowany (Boost.Fusion) atrybuty dziedziczone obsługa błędów
69 Zalety Boost Spirit korzysta ze składni C++ wyłącznie pliki nagłówkowe bardzo szybka
70 Źródła I Expression templates More C++ Idioms/Expression-template Expression-template C++ Expression Templates ExpressionTemplates/ExpressionTemplates.htm Boost Spirit homepage C++ Super-FAQ
71 Źródła II E. Gamma, R. Helm, R. Johnson, J. Vlissides Design Patterns S. Meyers Effective Modern C++ A. Alexandrescu Modern C++ Design
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 6 - szablony. dr inż. Robert Nowak - p. 1/15 Kolekcje i algorytmy» Deklaracja szablonu y Pojęcia niezależne od typu: kolekcje (np. listy) algorytmy (np. znajdowania
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Curiously recurring template pattern
class Derived : public Base Adam Mizerski adam@mizerski.pl Warsaw C++ Users Group 13 stycznia 2015 Wstęp The Matasano Crypto Challenges The Matasano Crypto Challenges http://cryptopals.com/ Wstęp
Szablony funkcji i szablony klas
Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument
Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce
Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Język C++ wykład VIII
Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,
Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.
M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);
Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {
Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki int getmax (int a, int b) { return (a > b? a : b); float getmax (float a, float b) { return (a > b? a : b); long getmax (long a, long b)
Signals + Threads: Qt vs. Boost
Signals + Threads: Qt vs. Boost Adam Bujalski 2014-04-01 Adam Bujalski Signals + Threads: Qt vs. Boost 2014-04-01 1 / 22 Spis Treści 1 2 Wątki 3 Qt::QueuedConnection w boost Adam Bujalski Signals + Threads:
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )
Jzyk C++ cz 3 Jarosław Gramacki Instytut Informatyki i Elektroniki # $$%%& ' ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )!" 2 # $$%%& ' ( $%%/,))3 ( %* 2 / 4 ( ( *' *''*,
Szablony. Szablony funkcji
Szablony Szablony sa mechanizmem ponownego wykorzystania kodu (reuse) W przypadku funkcji ponownie wykorzystany jest algorytm W przypadku klas ponownie wykorzystane sa wszystkie skladowe Deklaracja szablonu
Wprowadzenie do szablonów szablony funkcji
Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego.
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {
Przeciążanie a dziedziczenie class Integer2: public Integer Operatory, z wyjątkiem operatora przypisania są automatycznie dziedziczone w klasach pochodnych. Integer2(int i): Integer(i) Automatyczne tworzenie
Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016
Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa
Składnia C++ Programowanie Obiektowe Mateusz Cicheński
Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Konstruktory i destruktory
Wprowadzenie do szablonów szablony funkcji
Wprowadzenie do szablonów szablony funkcji Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do
Wzorce funkcji (szablony)
Wzorce funkcji (szablony) Wzorce funkcji (ang. function template) dają możliwość wielokrotnego wykorzystywania tego samego kodu funkcji dla różnych typów danych. Załóżmy, że chcemy zdefiniować funkcję
Identyfikacje typu na etapie. wykonania (RTTI)
Identyfikacje typu na etapie (Run Time Type Identification) wykonania (RTTI) Może powstać taka sytuacje, gdy w trakcie kompilacji typ obiektu nie jest znany. C++ implementuje polimorfizm poprzez hierarchie
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
C++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Programowanie i struktury danych
Programowanie i struktury danych 1 / 30 STL Standard Template Library, STL (ang. = Standardowa Biblioteka Wzorców) biblioteka C++ zawierająca szablony (wzorce), które umożliwiają wielokrotne użycie. Główne
Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest
Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw
Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej
Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie Obiektowe (język C++) Wykład 1. Definiowanie prostych klas. Przykłady. Przypomnienie: typy referencyjne, domyślne wartości argumentów, przeciąŝanie funkcji. Konstruktory,
Zaawansowane programowanie w C++ (PCP)
Wykład 9 - powtórzenie. 11 maja 2007 Powtórzenie materiału obiekty automatyczne, statyczne, tymczasowe, dynamiczne dziedziczenie, agregacja polimorfizm, funkcje wirtualne wzorce projektowe (strukturalne,
Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton
Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu
obiekty funkcyjne - funktory
#include #include #include #include #include #include #include #include #include #include using namespace
Programowanie w języku C++
Programowanie w języku C++ Część dziewiąta Autor Roman Simiński Kontakt siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++
IMIĘ i NAZWISKO: przykładowe odpowiedzi NR: 0 EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++ 1. Napisz precyzyjnie co to jest ptr jeśli: const * const Foo ptr; ptr to stały wskaźnik do stałego obiektu typu Foo
Operatory na rzecz typu TString
Operatory na rzecz typu TString Dopiszmy w definicji klasy operator[], dzięki któremu potraktujemy obiekt jak tablicę class TString { public: char& operator[]( size_t n ); const char& operator[]( size_t
Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017
Wykład 13 14 czerwiec 2017 Java vs cpp - podobieństwa Podobny sposób definiowania klas. Występowanie typów podstawowych: boolean, char, byte, short, int, long, float, double. Podobna zasada definiowania
Obsługa wyjątków. Język C++ WW12
Obsługa wyjątków Pozwala zarządzać błędami wykonania w uporządkowany sposób. Umożliwia automatyczne wywołanie części kodu, funkcji, metod klas, który trzeba wykonać przy powstaniu błędów. try //blok try
Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie (język C++) Wykład 1. Język C a C++. Definiowanie prostych klas. Typy referencyjne. Domyślne wartości argumentów. PrzeciąŜanie funkcji. Konstruktory, destruktory. Definiowanie
Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16
M. Trzebiński C++ 1/16 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IFJ PAN 6lipca2015 Uruchomienie maszyny w CC1 M. Trzebiński C++ 2/16
Szablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this
Wstęp do programowania obiektowego WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this 1 Nazwa typu Rozmiar Zakres Uwagi bool 1 bit wartości true albo false stdbool.h TYPY ZNAKOWE
C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue
C++ 11 wybrane elementy C++11 Lista rozszerzeń C++11 obecnych w VC2013: 1. Referencje do rvalue, 2. Jednolite inicjowanie i delegowanie konstruktorów, 3. Konstruktory delegujące 4. Jednolita inicjalizacja
public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje
Zbudujemy klasę Definicję klasy zapiszmy w pliku tstring.h #ifndef TSTRING_H #define TSTRING_H #include // w pliku nagłówkowym NIE // otwieramy przestrzeni std // interfejs private: // implementacja
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska
C++ język nie dla ludzi o słabych nerwach Małgorzata Bieńkowska malgorzata.bienkowska@gmail.com 9LivesData HYDRAStor Dla NEC Japan od ponad 10 lat 1,5 miliona linii kodu większość rozwijana w Warszawie
Kurs programowania. Wykład 9. Wojciech Macyna
Wykład 9 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista czy
Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.
Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,
Abstrakcyjny typ danych
Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są
Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.
Technologie programowania Wykład 4 Przemek Błaśkiewicz 9 maja 2017 1 / 54 Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się
Składnia C++ Programowanie Obiektowe Mateusz Cicheński
Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Przeciążanie operatorów Słowo
Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)
Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Część 1. Teoria Wyjaśnij pojęcia, podaj przykład: klasa obiekt konstruktor destruktor kapsułkowanie (hermetyzacja) wskaźnik this
1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.
1. Pierwszy program // mój pierwszy program w C++ #include using namespace std; cout
Wprowadzenie do szablonów klas
Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2008-2010 Bogdan Kreczmer Niniejszy
Programowanie obiektowe w C++ Wykład 12
Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)
Wstęp do Programowania 2
Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 4 Funkcje przeciażone - Idea Przeciażanie funkcji (polimorfizm funkcji), to kolejna nowość w języku
Wykład. Materiały bazują częściowo na slajdach Marata Dukhana
Wykład Materiały bazują częściowo na slajdach Marata Dukhana Języki programowania Kompilowane np. C, C++, Pascal Interpretowane np. JavaScript, PHP, Python, VBA Pośrednie np. Java, C# Znane kompilatory
Programowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Paradygmaty programowania
Paradygmaty programowania Programowanie generyczne w C++ Dr inż. Andrzej Grosser Cz estochowa, 2016 2 Spis treści 1. Zadanie 3 5 1.1. Wprowadzenie.................................. 5 1.2. Obiekty funkcyjne................................
Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019
Wykład 3 22 marca 2019 Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B. Klasy wewnętrzne Właściwości
Programowanie Komputerów
Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 28 1. Tablice w C# Indeksowane od zera
Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue
C++ 11 wybrane elementy C++11 Lista rozszerzeń C++11 obecnych w VC2013: 1. Referencje do rvalue, 2. Jednolite inicjowanie i delegowanie konstruktorów, 3. Konstruktory delegujące 4. Jednolita inicjalizacja
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 12 Katarzyna Grzelak 28 maja 2018 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Klasy cd K.Grzelak (Wykład 12) Programowanie w C++ 2 / 27 Klasy - powtórzenie Klasy typy definiowane
Technologie cyfrowe semestr letni 2018/2019
Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 8 (15.04.2019) Kompilacja Kompilacja programu (kodu): proces tłumaczenia kodu napisanego w wybranym języku na kod maszynowy, zrozumiały
Wykład I. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład I - semestr III Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest
Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.
Funkcje wirtualne W C++ polimorfizm jest zrealizowany w dwa sposoby: na etapie kompilacji i na etapie wykonania. Na etapie kompilacji polimorfizm jest zrealizowany poprzez przeciążenie funkcji i operatorów.
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 1 - sprawy organizacyjne i wprowadzenie. dr inż. Robert Nowak - p. 1/27 Cel i zakres przedmiotu Umiejętność programowania to umiejętność rozwiazania problemów
Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp
Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Historia C++ został zaprojektowany w 1979 przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i
Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu.
Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu. Flex Flex wywodzi się jak cała rodzina tego typu narzędzi od jednego przodka:
Zaawansowane programowanie w języku C++ Programowanie obiektowe
Zaawansowane programowanie w języku C++ Programowanie obiektowe Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi
EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi 1. Napisz wskaźnik do funkcji fun tak zdeklarowanej: T* fun( int, double const& ) const; definicja wskaźnika musi być precyzyjna, inaczej
Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30
Programowanie w C++ Wykład 11 Katarzyna Grzelak 13 maja 2019 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30 Klasy - powtórzenie Klasy typy definiowane
Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).
Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,
Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.
- - uzupełnienie notatek: dr Jerzy Białkowski - - 1-2 - - - 1 #include 2 #include 3 # include 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double
Metody Kompilacji Wykład 3
Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy
Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji
Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Instrukcja do pracowni specjalistycznej z przedmiotu Obiektowe programowanie aplikacji Kod przedmiotu: TS1C410201
Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 6 Katarzyna Grzelak kwiecień 2019 K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:
Instrukcja laboratoryjna cz.3
Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą
Zaawansowane programowanie w języku C++ Biblioteka standardowa
Zaawansowane programowanie w języku C++ Biblioteka standardowa Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31
Programowanie w C++ Wykład 8 Katarzyna Grzelak 7 maja 2018 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:
Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 14 Katarzyna Grzelak 3 czerwca 2019 K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Na ostatnim wykładzie: Konstruktor standardowy (domyślny) to taki, który nie ma żadnych argumentów
Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3
Modelowanie numeryczne w fizyce atmosfery Sylwester Arabas (ćwiczenia do wykładu dr. hab. inż. Lecha Łobockiego) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 3. listopada 2011 r. Schemat
2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne
Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie
Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ
programowanie w C++ dla OWK Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ 1 Streszczenie W tym rozdziale podamy kilka najprostszych przykładów programów
Paradygmaty programowania. Paradygmaty programowania
Paradygmaty programowania Paradygmaty programowania Dr inż. Andrzej Grosser Cz estochowa, 2013 2 Spis treści 1. Zadanie 2 5 1.1. Wprowadzenie.................................. 5 1.2. Wskazówki do zadania..............................
Wstęp do programowania
wykład 10 Agata Półrola Wydział Matematyki i Informatyki UŁ semestr zimowy 2018/2019 Przesyłanie argumentów - cd Przesyłanie argumentów do funkcji - tablice wielowymiarowe Przekazywanie tablic wielowymiarowych
Wydajność użycia funktorów z biblioteką STL języka C++
Wydajność użycia funktorów z biblioteką STL języka C++ Irek Szcześniak, Maciek Sobczak 1 października 2005 roku Streszczenie Artykuł dotyczy wydajności użycia funktorów z biblioteką STL (Standard Template
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 10 I 2012 1 Zabronienie kopiowania Czasami nie ma sensu, żeby obiekty pewnego typu były kopiowane z innych obiektów.
Projektowanie klas c.d. Projektowanie klas przykład
Projektowanie klas c.d. ogólne wskazówki dotyczące projektowania klas: o wyodrębnienie klasy odpowiedź na potrzeby życia (obsługa rozwiązania konkretnego problemu) o zwykle nie uda się utworzyć idealnej
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }
#include using namespace std; Prototypy funkcji Funkcja 1 void ela(int); double info (double); int main( ); return 0; Funkcja 2 void ela(int); Funkcja 3 double info(double); return 4*t; jeszcze
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
Technologie cyfrowe semestr letni 2018/2019
Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 7 (08.04.2019) Wikipedia Programowanie komputerów proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów
Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów
Algorytm przeszukiwania w głąb Przeszukiwanie grafu odwiedzenie wszystkich jego wierzchołków w kolejności jak na rysunku obok: C++: STL Implementowanie własnych algorytmów Reprezentacja grafu w programie
referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.
Programowanie (język C++) referencje Wykład 2. Referencje (1) Referencja (odnośnik) jest zmienną identyfikującą inną zmienną. Wykonanie operacji na referencji ma taki sam skutek, jak wykonanie tejŝe operacji