Programowanie C/C++ Jezyk C++ wykład VIII
Transkrypt
Programowanie C/C++ Jezyk C++ wykład VIII
Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Programowanie C/C++ Język C++ wykład VIII Wyjątki Zadania dr Jarosław Mederski uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis 1 Wzorce STL Wzorce STL Wejście wyjście 2 Wejście - wyjście Wyjątki Zadania 3 Wyjątki 4 Zadania Programowanie C/C++ Język C++ wykład VIII Obiektowość języka C++ dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory Enkapsulacja - kapsułkowanie, ukrywanie informacji (public, protected, private, friend) Polimorfizm i metody wirtualne Dziedziczenie pola static Wzorce, STL Operacje wejścia-wyjścia Wyjątki Programowanie C/C++ Język C++ wykład VIII Wzorce dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Wzorce, lub szablony (ang. template) pozwalają na tworzenie kodu niezależnego od typów danych. Zadania template < parametry-wzorca > definicja-wzorca Programowanie C/C++ Język C++ wykład VIII Wzorce funkcji dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # include <i o s t r e a m > template <class T> T max ( T a , T b ) { return ( a > b ) ? a : b ; } int main ( ) { int a=10 , b =15; double c =14.0 , d = 3 . 9 ; std : : cout << max ( a , b ) << std : : endl ; std : : cout << max ( c , d ) << std : : endl ; } Programowanie C/C++ Język C++ wykład VIII Wzorce klas dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # include <i o s t r e a m > # include <cmath> template <class T> class Gauss { public : T a; T b; Gauss ( T c , T d ) : a ( c ) , b ( d ) {} double modul ( ) { return sqrt ( a * a+b * b ) ; } }; int main ( ) { Gauss<double> z ( 1 . 0 , 3 . 4 ) ; std : : cout << z . modul ( ) <<"\n" ; Gauss<int> t (1 , −3) ; std : : cout << t . modul ( ) <<"\n" ; } Programowanie C/C++ Język C++ wykład VIII Standard Template Library dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania Biblioteka wzorców (szablonów) składa się m.in. vector list map string ... Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście vector vector<T> reprezentuje tablicę obiektów typu T wyposarzoną w mechanizmy: void push_back(const T obj) - dodaje na końcu wektora kopię przekazanego argumentu Wyjątki void pop_back() - usuwa ostatni element z wektora Zadania void clear() - usuwa wszystkie elementy z wektora iterator insert(iterator pos, T obj) - wstawia element obj przed wskazywaną przez iterator pos pozycją i zwraca iterator do dostawionego elementu iterator erase(iterator pos) - usuwa element wskazywany przez pos i zwraca iterator do następnego elementu size_t size() - zwraca obecną ilość elementów wektora. Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # include <i o s t r e a m > # include <v e c t o r > using namespace std ; int main ( ) { vector<int> tab ; int n ; cin >> n ; while ( n>0) { cin >> n ; tab . push_back ( n ) ; } cout << "\ nRozmiar tablicy : " << tab . size ( ) << "\nn" ; } Programowanie C/C++ Język C++ wykład VIII string dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania string jest klasą napisów w C++. size(),length() - zwraca ilość znaków w napisie at() - zwraca znak o podanym położeniu, (podobnie jak operator []) clear() - usuwa wszystkie znaki z napisu substr() - zwraca podciąg na podstawie indeksu początkowego i długości podciągu append() - dodaje zadany napis na końcu istniejącego ciągu Programowanie C/C++ Język C++ wykład VIII string dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # include <i o s t r e a m > # include <s t r i n g > using namespace std ; int main ( ) { cout << " Podaj imie " ; string imie ; cin >> imie ; string witaj=" Witaj " ; string powitanie=witaj . append ( imie ) ; // s t r i n g p o w i t a n i e=w i t a j+i m i e ; OK cout << powitanie <<"\n" ; } Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania istream, metody: get, getline, read ostream, metody: put, write Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania istream, metody: get, getline, read ostream, metody: put, write cin - strumień standardowego wejścia cout - strumień standardowego wyjścia cerr - strumień standardowego wyjścia błędów obsługa plików: ifstream, ofstream Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # include <i o s t r e a m > # include <f s t r e a m > using namespace std ; int main ( ) { char a ; ofstream f ( "plik.txt" ) ; do { a = cin . get ( ) ; f << a ; } while ( a != ' \n ' ) ; } Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # include <i o s t r e a m > # include <f s t r e a m > # include < c s t d l i b > using namespace std ; int main ( ) { const int rozmiar =256; char bufor [ rozmiar ] ; ifstream f ( "plik.txt" ) ; if ( ! f ) { cerr << "Nie moge otworzyc pliku \n" ; exit ( 1 ) ; } while ( f . getline ( bufor , rozmiar ) ) { cout << bufor << "\n" ; } } Programowanie C/C++ Język C++ wykład VIII Wyjątki dr Jarosław Mederski Zgłaszanie sytuacji wyjątkowej („(wy)rzucanie wyjątku”) Spis Wzorce 1 throw . . . ; // za ” . . . ” podstawiamy w a r t o ś ć STL „Przechwytywanie wyjątków ” Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 try { // b l o k z a w i e r a c j ą c y // kod w którym może // z o s t a ć z g o s z o n y w y j ą t e k } catch ( . . . ) { // kod wykonywany w p r z y p a d k u // z g o s z e n i a w y j ą t k u } Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # include <i o s t r e a m > using namespace std ; int dzielenie ( int a , int b ) { if ( b == 0 ) throw " dzielenie przez zero" ; if ( a % b != 0 ) throw " reszta różna od 0" ; return a/b ; } int main ( ) { try { cout << dzielenie ( 4 , 2 ) << endl ; cout << dzielenie ( 1 , 2 ) << endl ; cout << dzielenie ( 2 , 0 ) << endl ; cout << dzielenie ( 3 , 1 ) << endl ; } catch ( char * s ) { cout << "Blad: " << s << endl ; } catch ( . . . ) { cout << "Inny blad :\n" ; } } Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # include <i o s t r e a m > using namespace std ; int dzielenie ( int a , int b ) { if ( b == 0 ) throw " dzielenie przez zero" ; if ( a % b != 0 ) throw a % b ; return a/b ; } int main ( ) { try { cout << dzielenie ( 4 , 2 ) << endl ; cout << dzielenie ( 1 , 2 ) << endl ; cout << dzielenie ( 2 , 0 ) << endl ; cout << dzielenie ( 3 , 1 ) << endl ; } catch ( char * s ) { cout<<"Blad: "<<s<<endl ; } catch ( int n ) { cout << "Blad: reszta = " << n << endl ; } catch ( . . . ) { cout << "Inny blad :\n" ; } } Programowanie C/C++ Język C++ wykład VIII Mechanizm wyjątków dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania Wyjątki mogą być zgłaszane przez wywołanie throw. Wyjątki mogą być przechwycone w bloku try { } W momencie przechwycenia wyjątku (w bloku try { }) przerywane jest wykonywanie kodu (w bloku try { }); sterowanie przekazywane jest do pierwszego bloku catch ( ) { }, którego typ argumentu odpowiada typowi wyjątku (typowi wartości zgłoszonej przez throw); sterowanie może być przekazane do innego (dalszego bloku) catch ( ) { } poprzez ponowne wywołanie throw, w przeciwnym wypadku – po wyjściu z bloku catch ( ) { } strerowanie jest przekazywane za ostatni z bloków „catch” argument „...” pasuje do każdego wyjątku (catch (...) { }). Programowanie C/C++ Język C++ wykład VIII Mechanizm wyjątków (c.d.) dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania O ile nie zostanie dopasowany żaden blok catch ( ) { } (wszystkie mają niezgodne typy wyjątków) lub wyjątek zostanie zgłoszony poza blokiem try { }), to program kończy działanie z błędem. W przypadku zagnieżdżonych bloków try { } przechwywanie jest przeprowadzane od najbardziej zagnieżdżonego bloku aż do dopasowania bloku catch ( ) { } (lub – przy przejściu przez wszystkie poziomy zagnieżdżenia bez napotkania pasującego bloku catch ( ) { } – do zakończenia programu z błędem. Zwykle zaleca się używanie hierarchicznej struktury wyjątków (z dziedziczeniem) oraz obsługi wyjątków – od najbardziej szczegółowych do najbardziej ogólnych. Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class class class class class class Blad { / * * / } ; BladWeWy : Blad { / * * / } ; BladOtwarciaPliku : BladWeWy { / * * / } ; BladDostepuDoUrzad : BladWeWy { / * * / } ; BladArytmetyczny : Blad { / * * / } ; BladDzieleniaPrzezZero : BladArytmetyczny { / * * / } ; try { // . . . } catch catch catch catch catch catch catch ( BladOtwarciaPliku ) { / * . . . * / } ( BladDostepuDoUrzad ) { / * . . . * / } ( BladWeWy ) { / * . . . * / } ( BladDzieleniaPrzezZero ) { / * . . . * / } ( BladArytmetyczny ) { / * . . . * / } ( Blad ) { / * . . . * / } ( . . . ) { /* . . . */ } Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Zadanie Napisz program, który ze standardowego wejścia wczytuje słowo i wyszukuje wszystkie wystąpnie tego słowa w pliku plik.txt. Spis Wzorce STL Wejście wyjście Wyjątki Zadania Zadanie Napisz rekurencyjną funkcję, która oblicza symbol Newtona n k . Zadanie Napisz klasę Gauss, która reprezentuje liczby zespolone. Użyj przeciążenia operatorów: +, - , *, / , ==. Zadanie Napisz procedurę, która rozwiązuje układ kongruencji: x ≡ a mod( m), x ≡ b mod( n). Zobacz twierdzenie Chińskie o resztach. Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Zadanie Niech n będzie liczbą naturalną. Losujemy n punktów z kostki [0, 1]3 . Oznaczmy je przez (x1 , y1 , z1 ), (xn , yn , zn ). Napisz procedurę, która oblicza liczbę s = s(n) będącą największą możliwą liczbą punktów (xi1 , yi1 , zi1 ),..., (xis , yis , zis ) o własności: Wzorce STL xi1 ¬ xi2 ¬ ... ¬ xin , Wejście wyjście yi1 ¬ yi2 ¬ ... ¬ yin , Wyjątki Zadania zi1 ¬ zi2 ¬ ... ¬ zin . Ile wynosi s(n), dla n = 1, 2, 3, 4, 5, 6, 7, ...? Zadanie Niech f : [a, b] → R będzie ciągłą funkcją taką, że f (a) · f (b) < 0. Napisz procedurę, która znajduje pierwiasek równania f (x) = 0. Użyj metody bisekcji. Zadanie Ile zer ma na końcu liczba 1000! ? Programowanie C/C++ Język C++ wykład VIII dr Jarosław Mederski Spis Wzorce STL Wejście wyjście Wyjątki Zadania Dziękuję za uwagę.