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

Podobne dokumenty
Programowanie - wykład 4

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

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

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

Wstęp do programowania

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

Język C++ wykład VIII

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

Wstęp do Programowania, laboratorium 02

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) 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

Pytania sprawdzające wiedzę z programowania C++

1 Podstawy c++ w pigułce.

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

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

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

C++ Przeładowanie operatorów i wzorce w klasach

Część 4 życie programu

Język C++ zajęcia nr 1

Programowanie Obiektowew języku C++ Zadania L4

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.

C++ wprowadzanie zmiennych

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

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Szablony funkcji i klas (templates)

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

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

1 Podstawy c++ w pigułce.

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

Programowanie komputerowe. Zajęcia 7

Szablony. Szablony funkcji

TEMAT : KLASY DZIEDZICZENIE

Język C++ Różnice między C a C++

PARADYGMATY PROGRAMOWANIA Wykład 4

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.

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

Szablony funkcji i szablony klas

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wyrażenia arytmetyczne

Programowanie strukturalne i obiektowe. Funkcje

Paradygmaty programowania

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

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.

I - Microsoft Visual Studio C++

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Podstawy Programowania Obiektowego

Do czego służą klasy?

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

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

Biblioteka obiektowa C++ klasa string - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

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

Wprowadzenie do szablonów szablony funkcji

2 Przygotował: mgr inż. Maciej Lasota

Wprowadzenie do szablonów szablony funkcji

Programowanie komputerowe. Zajęcia 1

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Zmienne, stałe i operatory

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

Język C zajęcia nr 11. Funkcje

Szablony klas, zastosowanie szablonów w programach

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

TEMAT : KLASY POLIMORFIZM

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Programowanie obiektowe. Wykład 5. C++: szablony

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

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

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

Język ludzki kod maszynowy

Struktury Struktura polami struct struct struct struct

Podstawy programowania w C++

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

Podstawy Programowania Podstawowa składnia języka C++

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

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

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

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

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

Programowanie obiektowe

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Wstęp do Programowania 2

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

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

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

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

Transkrypt:

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 korzystających z szablonów (templates). Często mamy do czynienia z funkcjami (metodami) które wyspecjalizowane są do działań na zmiennych jakiegoś zadanego typu np. int a jednocześnie te same funkcje które różnią się tylko zamianą typu zmiennej, np. zamiast int jest użyty typ double, użyte są w innej części kodu. Okazuje się że można napisać program w sposób bardziej uniwersalny gdzie zamiast konkretnej zmiennej mamy zmienną uniwersalną, tzw. zmienną szablonową, i programista bezpośrednio w programie rzutuje wykonywanie operacji na jednym z typów zmiennych w zależności od potrzeb. Tego rodzaju działania potrafią istotnie przyspieszyć wykonywanie się programu np. od strony numerycznej. Poniższe przykłady powinny ułatwić dalszą naukę programowania z użyciem szablonów. Przyjrzymy się też krótko standardowym bibliotekom języka C++ które korzystają z szablonów. Wybrane przykłady Na wstępie rozważmy programy szablon1a0.cc, szablon1a1.cc, szablon1a2.cc, których jedynym celem jest pokazanie na czym polega zastąpienie konkretnych typów zmiennych swojego rosdzaju abstrakcją typu zmiennej - zmienną szablonową. Programem wykorzystującym ideę zmiennej szablonowej jest rzeci z nich. Najpierw rozważmy pierwszy przykład polegający na znajdowaniu minimum spośród dwóch liczb całkowitych. 4 // f u n k c j a z n a j d u j a c a minimum pomiedzy wartosciami 5 // calkowitymi zmiennych a i b int minimum( int a, int b ) 7 { 8 i f ( a<=b ) return a ; 9 return b ; } 12 int main ( ) { 1 int a=,b=; 15 cout<<"a="<<a<<"\t b="<<b<<":\ t Minimum = "<<minimum( a, b)<<e n d l ; 1 return 0 ; 17 } Nastepnie popatrzmy na taki sam program ale zamiast zmiennych całkowitych mamy zmienne zmiennoprzecinkowe. 4 //minimum pomiedzy dwoma wartosciami zmiennoprzecinkowymi typu double 5 double minimum( double a, double b ) { 7 i f ( a<=b ) return a ; 8 return b ; 9 } int main ( ) { 12 double pi =.15, sq =1.42; 1 cout<<" pi="<<pi<<"\t sq="<<sq<<":\ t Minimum = "<<minimum( pi, sq)<<e n d l ; 2

15 return 0 ; 1 } A teraz wprowadzimy zmienne szablonowe i jedną funkcję która w sposób uniwersalny porównuje albo wyłącznie wartości całkowite albo rzeczywiste. 4 // p r z y k l a d z uzyciem zmiennej s z a b l o n o w e j P 5 // b e d z i e ona w naszym programie reprezentowac // w a r t o s c i c a l k o w i t e i w a r t o s c i typu double. 7 8 // konieczne j e s t n a p i s a n i e p r e f i k s a : template <c l a s s P> 9 //o symbolu P m o n a np. myslec jako o double l u b i n t. template <class P> P minimum(p a, P b ) 12 { 1 i f ( a<=b ) return a ; return b ; 15 } 1 17 int main ( ) { 18 19 int a=,b=; 20 cout<<"a="<<a<<"\t b="<<b<<":\ t Minimum = "<<minimum( a, b)<<e n d l ; 21 22 double pi =.15, sq =1.42; 2 cout<<" pi="<<pi<<"\t sq="<<sq<<":\ t Minimum = "<<minimum( pi, sq)<<e n d l ; 24 25 return 0 ; 2 } Tutaj wprowadzona została zmienna szablonowa P która w zależności od kontekstu staje się zmienną całkowitą lub zmienną zmiennoprzecinkową. Konieczne tutaj jest dodanie przed definicją funkcji prefiksa template <class P> i teraz typ argumentu nazywa się P zamiast int lub double i wartość którą funkcja zwraca w tym szczególnym przykładzie też jest typu P. Oczywiście fukcja może zwracać dowolną wartość lub być typu void. Co więcej funkcja może posiadać więcej argumentów i nie wszystkie muszą być typu P. Pokazujemy to w kolejnym przykładzie. 2 #include <c s t r i n g > #include <c s t d l i b > 4 5 using namespace std ; 7 // p r z y k l a d z szablonem f u n k c j i 8 // k t o r a ma w i e c e j n i z jeden parametr 9 // rozny od typu szablonowego P template <c l a s s P> void Wydruk(P a, char LancuchZnakow ) 12 { 1 int k=s t r l e n ( LancuchZnakow ) ; cout<<a<<"\t"<<k<<"\t"<<lancuchznakow<<e n d l ; 15 } 1

17 int main ( ) { 18 char Lancuch []= "124" ; // { 1, 2,, 4, \ 0 } ; 19 long int q ; 20 q=a t o l ( Lancuch ) ; 21 Wydruk( q, Lancuch ) ; 22 2 char Dancuch [7]= "1.245" ; 24 double d ; 25 d=a t o f ( Dancuch ) ; 2 Wydruk(d, Dancuch ) ; 27 28 return 0 ; 29 } Podobnie, może być więcej zmiennych szablonowych, np. zmienne P, T itd. Jeden warunek - trzeba je zadeklarować jako zmienne szablonowe. Jak to zrobić pokazuje kolejny przykład. 4 // p r z y k l a d z szablonem f u n k c j i 5 // k t o r a ma dwie zmienne szablonowe 7 template <class P, class T> void Wydruk(P a, T b ) 8 { 9 cout<<" Typ P: "<<a<<"\t typ T:"<<b<<e n d l ; } 12 int main ( ) { 1 15 double d =2.54; 1 int k=; 17 Wydruk(d, k ) ; 18 19 return 0 ; 20 } Niestety, w przypadku gdy zmienne szablonowe reprezentują nie tylko standardowe zmienne numeryczne, np. typu int czy double ale zmienne typu zdefiniowanego przez użytkownika to np. dodawanie ich lub inne działanie trzeba dopiero zdefiniować przeciążając je. Przykładem może być kolejny program gdzie wczytujemy wartości liczbowe tak że są obiektami z klasy Liczba, którą sami definiujemy. Jeśli działania arytmetyczne lub strumieniowe cout i cin nie byłyby przeciążone to kompilator nie wiedzia lby co zrobić np. z poleceniem c=a+b. 4 // Deklaracja k lasy s z a b l o n u 5 template <class P> class Liczba { // Tutaj P j e s t parametrem oznaczajacym // pewien dowolny t y p. Parametrow moze 7 // byc w i e c e j n i z jeden np. c l a s s P, c l a s s T 8 // Slowo c l a s s j e s t t u t a j obowiazkowe. 9 private : P wartosc ; 12 public : 4

1 15 Liczba ( ) {} // k o n s t r u k t o r bezparametrowy 1 Liczba (P zmienna ){} // k o n s t r u k t o r z jednym parametrem 17 18 // p r z e c i a z o n y operator rzutowania 19 operator P( void ) {return wartosc ; } 20 21 // p r z e c i a z o n y operator dodawania 22 2 P operator+ (P zmienna ){ return wartosc+zmienna ; } 24 P operator+ ( Liczba& zmienna ){ return wartosc+zmienna. wartosc ; } 25 // p r z e c i a z o n y operator p r z y p i s a n i a 2 Liczba& operator= ( Liczba& zmienna ){ wartosc=zmienna. wartosc ; return this ; } 27 Liczba& operator= (P zmienna ) ; // p r z e c i a z o n y operator p r z y p i s a n i a 28 29 friend ostream& operator<< ( ostream& cout, L i c z b a& zmienna ){ 0 return cout<<zmienna. wartosc ; } 1 friend istream& operator>> ( istream& cin, Liczba& zmienna ){ cin>>zmienna. wartosc ; } 2 // k l a s e t r z e b a u z u p e l n i c o dodatkowe metody 4 // to j e s t t y l k o p r z y k l a d z kilkoma metodami 5 } ; 7 8 9 // d e f i n i c j a zmiennej s z a b l o n o w e j d l a operatora p r z y p i s a n a i a 40 template <class P> Liczba <P>& Liczba<P>:: operator=(p zmienna ){ 41 wartosc=zmienna ; 42 return this ; 4 } 44 45 4 int main ( ) { 47 48 49 Liczba<int> a, b, c ; // Tutaj w miejsce parametru P podstawiamy i n t 50 Liczba<float > d ; // Tutaj w miejsce P podstawiamy f l o a t 51 float f ; 52 5 cout<<"\ nwpisz dwie liczby calkowite a i b: " ; 54 cin>>a>>b ; //mamy p r z e c i a z o n y operator strumieniowy w e j s c i a 55 5 c=a+b ; // t u t a j j u z dodajemy o b i e k t y bo 57 // p r z e c i a z o n y j e s t operator dodawania i operator p r z y p i s a n i a 58 59 cout<<"\ nich suma c= "<<c<<e n d l ; 0 f =( f loat ) c ; // zamiana typu na f l o a t 1 d=f +0.1; 2 cout<<"\ nzwiekszona o wartosc 0.1: "<<d<<e n d l ; 4 return 0 ; 5 } Teraz pokażemy przykład z działaniami na liczbach zespolonych gdzie korzysta się ze zmiennych szablonowych. Mam nadzieję że powoli wyłania się urok stosowania zmiennych szablono- 5

wych. 2 #include <cmath> #include <complex> // b i b l i o t e k a l i c z b z e s p o l o n y c h 4 5 using namespace std ; 7 8 int main ( ) { 9 12 complex<double> z1 ( 5. 0, 1. 0 ) ; 1 complex<double> z2 (. 0, 4. 0 ) ; 15 cout<<r e a l ( z1)<<endl ; 1 cout<<imag ( z1)<<endl ; 17 cout<<z1<<endl ; 18 19 complex<double> z ; 20 z=z1 z2 ; 21 cout<<z<<endl ; 22 z=z1 / z2 ; 2 cout<<z<<endl ; 24 z=z1+z2 ; 25 cout<<z<<endl ; 2 cout <<abs ( z1)<<"\t"<<s q r t ( r e a l ( z1 ) r e a l ( z1)+imag ( z1 ) imag ( z1))<<endl ; 27 28 complex<double> I ( 0, 1 ),E( 1, 0 ) ; 29 0 double a= 8.5,b=.0, pi=m PI ; 1 2 z1=a E+b I ; cout<<z1<<endl ; 4 z=cos ( z1+b I ) ; 5 cout<<z<<endl ; z=cos ( I pi ) ; 7 cout<<z<<endl ; 8 9 return 0 ; 40 41 }