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, ukrywanie informacji (public, protected, private, friend) ˆ Polimorfizm i metody wirtualne ˆ Dziedziczenie ˆ pola static ˆ, ˆ Operacje wejścia-wyjścia ˆ
, lub szablony (ang. template) pozwalają na tworzenie kodu niezależnego od typów danych. template < parametry-wzorca > definicja-wzorca
funkcji 1 #include <i o s t r e a m > 2 3 template <class T> 4 T max ( T a, T b ) { 5 return ( a > b )? a : b ; 6 } 7 8 int main ( ) { 9 int a=10, b =15; 10 double c =14.0, d =3.9; 11 12 std : : cout << max ( a, b ) << std : : endl ; 13 std : : cout << max ( c, d ) << std : : endl ; 14 }
klas 1 #include <i o s t r e a m > 2 # include <cmath> 3 4 template <class T> 5 class Gauss { 6 public : 7 T a ; 8 T b ; 9 Gauss ( T c, T d ) : a ( c ), b ( d ) {} 10 double modul ( ) { return sqrt ( a*a+b*b ) ; } 11 } ; 12 int main ( ) { 13 Gauss<double> z ( 1. 0, 3. 4 ) ; 14 std : : cout << z. modul ( ) <<"\n" ; 15 Gauss<int> t(1, 3) ; 16 std : : cout << t. modul ( ) <<"\n" ; 17 }
Standard Template Library Biblioteka wzorców (szablonów) składa się m.in. ˆ vector ˆ list ˆ map ˆ string ˆ...
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 ˆ void pop_back() - usuwa ostatni element z wektora ˆ 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.
1 #include <i o s t r e a m > 2 #include <v e c t o r > 3 using namespace std ; 4 5 int main ( ) { 6 7 vector<int> tab ; 8 int n ; 9 cin >> n ; 10 11 while ( n>0) { 12 cin >> n ; 13 tab. push_back ( n ) ; 14 } 15 16 cout << "\ nrozmiar tablicy: " 17 << tab. size ( ) << "\nn" ; 18 }
string 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
string 1 #include <i o s t r e a m > 2 #include <s t r i n g > 3 using namespace std ; 4 5 int main ( ) { 6 7 cout << " Podaj imie " ; 8 string imie ; 9 cin >> imie ; 10 11 string witaj=" Witaj " ; 12 string powitanie=witaj. append ( imie ) ; 13 // 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 14 15 cout << powitanie <<"\n" ; 16 }
ˆ istream, metody: get, getline, read ˆ ostream, metody: put, write
ˆ 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
1 #include <i o s t r e a m > 2 #include <fstream > 3 using namespace std ; 4 5 int main ( ) { 6 7 char a ; 8 ofstream f ( "plik.txt" ) ; 9 10 do { 11 a = cin. get ( ) ; 12 f << a ; 13 } while ( a!= '\n' ) ; 14 15 }
1 #include <i o s t r e a m > 2 #include <fstream > 3 #include <c s t d l i b > 4 using namespace std ; 5 6 int main ( ) { 7 8 const int rozmiar =256; 9 char bufor [ rozmiar ] ; 10 11 ifstream f ( "plik.txt" ) ; 12 if (! f ) { 13 cerr << " Nie moge otworzyc pliku\n" ; 14 exit ( 1 ) ; 15 } 16 17 while ( f. getline ( bufor, rozmiar ) ) { 18 cout << bufor << "\n" ; 19 } 20 21 }
Zgłaszanie sytuacji wyjątkowej ( (wy)rzucanie wyjątku ) 1 throw... ; // za... podstawiamy wartość Przechwytywanie wyjątków 1 try { 2 // b l o k z a w i e r a c j ą c y 3 // kod w którym może 4 // z o s t a ć zgoszony w y j ą t e k 5 } 6 7 catch (... ) { 8 // kod wykonywany w przypadku 9 // z g o s z e n i a wyjątku 10 }
1 #include <i o s t r e a m > 2 using namespace std ; 3 4 int dzielenie ( int a, int b ) { 5 if ( b == 0) throw " dzielenie przez zero" ; 6 if ( a % b!= 0) throw " reszta różna od 0" ; 7 return a/ b ; 8 } 9 10 int main ( ) { 11 try { 12 cout << dzielenie ( 4, 2 ) << endl ; 13 cout << dzielenie ( 1, 2 ) << endl ; 14 cout << dzielenie ( 2, 0 ) << endl ; 15 cout << dzielenie ( 3, 1 ) << endl ; 16 } 17 catch ( char *s ) { 18 cout << "Blad: " << s << endl ; 19 } 20 catch (... ) { cout << "Inny blad:\n" ; } 21 }
1 #include <i o s t r e a m > 2 using namespace std ; 3 4 int dzielenie ( int a, int b ) { 5 if ( b == 0) throw " dzielenie przez zero" ; 6 if ( a % b!= 0) throw a % b ; 7 return a/ b ; 8 } 9 10 int main ( ) { 11 try { 12 cout << dzielenie ( 4, 2 ) << endl ; 13 cout << dzielenie ( 1, 2 ) << endl ; 14 cout << dzielenie ( 2, 0 ) << endl ; 15 cout << dzielenie ( 3, 1 ) << endl ; 16 } 17 catch ( char * s ) { cout<<" Blad: "<<s<<endl ; } 18 catch ( int n ) { 19 cout << " Blad: reszta = " << n << endl ; 20 } 21 catch (... ) { cout << "Inny blad:\n" ; } 22 }
Mechanizm wyjątków ˆ mogą być zgłaszane przez wywołanie throw. ˆ 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 (...) { }).
Mechanizm wyjątków (c.d.) ˆ 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.
1 class Blad { /* */ } ; 2 class BladWeWy : Blad { /* */ } ; 3 class BladOtwarciaPliku : BladWeWy { /* */ } ; 4 class BladDostepuDoUrzad : BladWeWy { /* */ } ; 5 class BladArytmetyczny : Blad { /* */ } ; 6 class BladDzieleniaPrzezZero 7 : BladArytmetyczny { /* */ } ; 8 9 try { 10 //... 11 } 12 13 catch ( BladOtwarciaPliku ) { /*... */ } 14 catch ( BladDostepuDoUrzad ) { /*... */ } 15 catch ( BladWeWy ) { /*... */ } 16 catch ( BladDzieleniaPrzezZero ) { /*... */ } 17 catch ( BladArytmetyczny ) { /*... */ } 18 catch ( Blad ) { /*... */ } 19 catch (... ) { /*... */ }
Zadanie Napisz program, który ze standardowego wejścia wczytuje słowo i wyszukuje wszystkie wystąpnie tego słowa w pliku plik.txt. 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.
Zadanie Niech n będzie liczbą naturalną. Losujemy n punktów z kostki [0, 1] 3. Oznaczmy je przez (x 1, y 1, z 1 ), (x n, y n, z n ). Napisz procedurę, która oblicza liczbę s = s(n) będącą największą możliwą liczbą punktów (x i1, y i1, z i1 ),..., (x is, y is, z is ) o własności: x i1 x i2... x in, y i1 y i2... y in, z i1 z i2... z in. 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!?
Dziękuję za uwagę.