Paradygmaty programowania

Podobne dokumenty
Paradygmaty programowania

Paradygmaty programowania. Paradygmaty programowania

Paradygmaty programowania. Paradygmaty programowania

Programowanie i struktury danych

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Szablon klasy std::vector

STL: Lekcja 1&2. Filozofia STL

Wstęp do Programowania 2

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Kurs programowania. Wykład 9. Wojciech Macyna

Algorytmy i Struktury Danych.

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

obiekty funkcyjne - funktory

Szablony funkcji i szablony klas

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wydajność użycia funktorów z biblioteką STL języka C++

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

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Technologie cyfrowe semestr letni 2018/2019

Programowanie obiektowe w C++ Wykład 11

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Techniki Programowania wskaźniki

Wstęp do programowania

Rzutowanie i konwersje

Język C++ zajęcia nr 2

Szablon klasy std::list

Operatory na rzecz typu TString

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

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.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

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

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Technologie cyfrowe semestr letni 2018/2019

Obsługa wyjątków. Język C++ WW12

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Szablony. Szablony funkcji

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Do czego służą klasy?

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Projektowanie klas c.d. Projektowanie klas przykład

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Podstawy algorytmiki i programowania - wykład 4 C-struktury

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Język C++ wykład VIII

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

STL Standardt Template Library (wprowadzenie)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Szablony funkcji i klas (templates)

C-struktury wykład. Dorota Pylak

W dowolnym momencie można zmienić typ wskaźnika.

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Podstawy programowania skrót z wykładów:

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

TEMAT : KLASY POLIMORFIZM

Wstęp do programowania

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Referencje do zmiennych i obiektów

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

C-struktury wykład. Dorota Pylak

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.

Operacje wejścia/wyjścia odsłona pierwsza

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Programowanie 2. Język C++. Wykład 2.

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie Obiektowew języku C++ Zadania L4

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Wstęp do programowania obiektowego, wykład 7

Programowanie obiektowe i C++ dla matematyków

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie obiektowe w C++ Wykład 12

Programowanie, część I

Programowanie 2. Język C++. Wykład 3.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

Transkrypt:

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................................ 5 1.2.1. Wyrażenia lambda............................ 5 1.2.2. Klasy funktorów............................. 7 1.3. Algorytmy.................................... 8 1.4. Wskazówki do zadania.............................. 9 3

4 Spis treści

1. Zadanie 3 1.1. Wprowadzenie Biblioteka algorytmów pozwala na parametryzowanie algorytmów za pomoca funktorów. Rol e funktora może pe lnić wskaźnik do funkcji, wyrażenie lambda oraz klasa z prze ladowanym operatorem nawiasów okrag lych. 1.2. Obiekty funkcyjne 1.2.1. Wyrażenia lambda Wyrażenia lambda daja możliwość utworzenia domkniecia: obiektu anonimowej funkcji, która ma możliwość przechwytywania zmiennych z zasiegu ja otaczajacego. Podstawowa sk ladnia wyrażeń lambda jest nieskomplikowana: [ l i s t a przechwytywanych zmiennych ] ( parametry ) { c i a l o wyra ż enia lambda} W nawiasach kwadratowych sa przekazywane zmienne z zasiegu otaczajacego wyrażenie lambda, dzieki tej konstrukcji jest możliwe użycie zmiennych wewnatrz cia la wyrażenia lambda. Zmienne moga być przechwytywane przez wartość (sama nazwa zmiennej) lub przez referencj e (nazwa zmienne poprzedzona &). Oprócz wybranych zmiennych można wciagn ać do wyrażenia lambda wszystkie zmienne przez referencje lub przez kopiowanie. Na przyk lad: [x,y](){} - do wyrażenia lambda przekazywane sa kopie zmiennych x i y, nie można ich modyfikować, [&x,&y](){} - do wyrażenia lambda przekazywane sa zmienne x i y za pomoca referencji, można te zmienne modyfikować, [x,&y](){} - do wyrażenia lambda przekazywane sa zmienne x i y, x jest kopiowane, zaś y przekazywane za pomoca referencji, [&](){} - przechwytuje wszystkie zmienne z zasiegu otaczajacego przez referencje, 5

6 1. Zadanie 3 [=](){} - kopiuje wszystkie zmienne z zasiegu otaczajacego, [](){} - nic nie jest przekazywane do wyrażenia lambda. Parametry oznaczaja parametry wywo lania funkcji. W tej formie wyrażenie lambda może zawierać jedynie prosta instrukcje powrotu return(c++11). Na podstawie wyrażenia używanego z return kompilator jest w stanie wywnioskować typ wartości zwracanej z funkcji. Na podstawie tego krótkiego wprowadzenia można przedstawić kilka wyrażeń lambda: auto fun = [ ] ( double x, double y ) {return x > y ; } ; std : : cout << std : : boolalpha << fun (4, 6) << std : : endl ; W ten sposób utworzono wyrażenie lambda, które nie przechwytuje zmiennych z zewnatrz (pusta lista zmiennych), oczekuje na wejściu dwóch parametrów x i y i zwraca wynik ich porównania (bool). double a = 5 ; auto fun2 = [ a ] ( double x ) {return x > a ; } ; std : : cout << std : : boolalpha << fun2 ( 6 ) << std : : endl ; Z kolei w tym przypadku do zasi egu wyrażenia lambda przekazywana jest zmienna a, która jest porównywana z przekazywanym do funktora parametrem. Typ wartości zwracanej W niektórych sytuacjach kompilator nie jest w stanie wywnioskować typu wartości zwracanej, dlatego trzeba go wtedy jawnie poinformować, jaki bedzie typ wartości zwracanej. Zapis jest nastepuj acy: [ l i s t a przechwytywanych zmiennych ] ( parametry ) > typ { c i a l o wyra ż enia lambda} Na przyk lad: double tab [ ] = { 1, 2, 3 } ; auto fun2 = [ tab ] ( ) > double { double sum = 0. 0 ; for ( auto elem : tab ) sum += elem ; return sum ; } ; std : : cout << fun2 ( ) << std : : endl ;

1.2. Obiekty funkcyjne 7 1.2.2. Klasy funktorów Oprócz wyrażeń lambda j ezyk C++ pozwala na zdefiniowanie funktorów, klas, które zachowuja sie jak funkcja. Sk ladnia jest nastepuj aca: class Pred{ std : : s t r i n g nazwiskoposzukiwane ; public : Pred ( std : : s t r i n g naz ) : nazwiskoposzukiwane ( naz ) {} bool operator ( ) ( const Osoba& o ) { return o. nazwisko == nazwiskoposzukiwane ; } } ; //... Osoba osoba ; // Konstruktor f u n k t o r a Pred pred ( Nocul ) ; // Operator funkcyjny std : : cout << pred ( osoba ) ; To, że definiujemy funktor pokazuje s lowo kluczowe operator z nastepuj acymi po nim nawiasami okrag lymi () wewnatrz nich nie wpisuje sie nazwy argumentów, parametry wpisuje sie w drugiej parze nawiasów okrag lych. Klasy funktorów moga zawierać dane, funkcje sk ladowe (szczególnie używane sa konstruktory). Zwróćcie uwag e na dwa aspekty wykorzystania funktora - jego utworzenie z zainicjowaniem za pomoca konstruktora i jego wykorzystanie (wywo lanie operatora funkcyjnego). Ma to szczególne znaczenie, przy ich wykorzystywaniu, gdy wywo lanie funktora b edzie zaszyte wewnatrz szablony, jedyne co jest widoczne to utworzenie funktora. Bedzie to lepiej widoczne na nastepuj acym przyk ladzie: class Generator { public : Generator ( int l i c z ) : l i c z b a ( l i c z ) {} int operator ( ) ( ) { return l i c z b a ; } private : int l i c z b a ; } ;

8 1. Zadanie 3 //Moż na wyobrazi ć s o b i e nast e puj a cy s z a b l o n template<typename I t e r, typename Gen> void generate ( I t e r b, I t e r e, Gen g ) { for ( ; b!=e;++b ) //Uż y c i e operatora funkcyjnego b = g ( ) ; } //... int [ 1 0 ] tab ; //Tu j e s t wo l any k o n s t r u k t o r Gen g (12) ; generate ( tab, tab + 10, g ) ; //To samo, a l e z uż yciem anonimowego o b i e k t u generate ( tab, tab +10, Gen (12) ) ; Obiekt klasy Generator jest przekazywany do szablonu funkcji generate - jest zainicjowany konstruktorem. Operator funkcyjny jest wykorzystywany wewnatrz szablonu (co robi ten funktor?). Ten aspekt wykorzystania obiektu funkcyjnego jest niewidoczny w przypadku korzystania z funkcji bibliotecznych. 1.3. Algorytmy Jak wspomniano funktory sa wykorzystywane prze algorytmy ogólne z biblioteki STL. Algorytmy ogólne to szablony funkcji przygotowane dla wielu zadań takich jak sortowanie, wyszukiwanie wartości itd. Oczywiście różne algorytmy maja różne wymagania odnośnie funktorów - co maja zwracać jakie wartości pobierać, na przyk lad (przyk lady z wyrażeniami lambda): Jeśli coś generujemy to funktor nie powinien pobierać żadnych argumentów i zwracać generowany obiekt. Funktory używane do wyszukiwania elementów powinny zwracać wartość logiczna (bool) oraz pobierać jeden argument. #include <iostream> #include <algorithm> #include <vector > using namespace std ; int main ( ) {

1.4. Wskazówki do zadania 9 } vector <double> vec = { 1, 2, 3, 4, 5 } ; // Znajduje i t e r a t o r do pierwszego elementu spe l n i a j a cego predykat auto i t e r = f i n d i f ( vec. begin ( ), vec. end ( ), [ ] ( double x ) {return x > 4 ; } ) ; cout << i t e r ; Funktory używane do nadawania porzadku elementom (np. w przypadku sortowania) powinny zwracać wartość logiczna i pobierać dwa argumenty, które chcemy porównywać. #include <iostream> #include <algorithm> #include <vector > using namespace std ; int main ( ) { vector <double> vec = { 1, 2, 3, 4, 5 } ; // S o r t u j e elementy wektora w porz adku malej acycm s o r t ( vec. begin ( ), vec. end ( ), [ ] ( double x, double y ) {return x > y ; } ) ; } 1.4. Wskazówki do zadania Wektor vector<t> to odpowiednik tablicy, lista list<t> to lista dwukierunkowa. Zbiór set<t> to struktura uporzadkowana przechowujaca klucze. Poczatki sekwencji jak widać na podstawie za l aczonych przyk ladów sa pokazywane za pomoca iteratorów (dla zwyk lej tablicy wystarczaja wskaźniki na poczatek i pierwszy element tablicy - tak jak we wprowadzeniu) - sa one uzyskiwane za pomoca metod begin() i end(). Klasa ostream_iterator wymaga przeciażenia operatora wysy lania do strumienia - inaczej dostaniecie kilka ekranów b l edów (kompilator stara si e być pomocny i próbuje ustalić co móg lby programista użyć w danym momencie). Oczywiście przeciażenia operatora jest wymagane dla klas i struktur zdefiniowanych przez użytkownika. W celu użycia klas i szablonów należy do l aczyć nag lówki, odpowiednio: vector<t> - <vector>,

10 1. Zadanie 3 list<t> - <list>, set<t> - <set>, sort,remove_if,generate - <algorithm>, ostream_iterator<t> - <iterator>, Zwrócić uwage na różnice pomiedzy przekazywaniem funktora jako parametru szablonu oraz jako parametru dla funkcji. Opisy algorytmów http: http://www.sgi.com/tech/stl/, http://www.cplusplus.com/reference/.