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ę.