Programowanie w C++ Wykład 8 Katarzyna Grzelak 7 maja 2018 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31
STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki: 1 Pojemniki (kontenery) 2 Iteratory 3 Algorytmy K.Grzelak (Wykład 8) Programowanie w C++ 2 / 31
Pojemniki STL - powtórzenie Vector Set Deque List Map K.Grzelak (Wykład 8) Programowanie w C++ 3 / 31
vector - powtórzenie vector plik nagłówkowy #include<vector> dynamiczna tablica operator indeksowania [] lub metoda at() możliwość płynnej zmiany rozmiaru wektora szybkie dodawanie i usuwanie elementów na końcu wektora K.Grzelak (Wykład 8) Programowanie w C++ 4 / 31
Wybrane metody dla wektora (np. vector<int> vec;) vec.push_back() - dodawanie elementu na końcu wektora vec.pop_back() - usuwanie elementu z końca wektora vec.size() - zwraca liczbę elementów vec.clear() - usuwa wszystkie elementy vec[i] - zwraca element o indeksie i vec.at(i) - zwraca element o indeksie i K.Grzelak (Wykład 8) Programowanie w C++ 5 / 31
Czym się różni vec.at() od vec[i]? vec.at(i) - zwraca element o indeksie i (sprawdzanie czy prawidłowy indeks sygnalizuje próbę odwołania do nieistniejacego elementu tablicy throws an out_of_range exception) vec[i] - zwraca element o indeksie i (bez sprawdzania czy prawidłowy indeks) K.Grzelak (Wykład 8) Programowanie w C++ 6 / 31
Dygresja sytuacje wyjatkowe Jak zabezpieczyć się przed nieoczekiwanymi sytuacjami, np.: próba dzielenia przez zero, próba odwołania się do nieistniejacego elementu tablicy...? Wersja pierwsza Wiadomość o błędzie, wychodzenie z funkcji z kodem błędu, przerywanie programu... if(n<0){ cout «Próba dzielenia przez zero «endl; return 1; K.Grzelak (Wykład 8) Programowanie w C++ 7 / 31
Dygresja sytuacje wyjatkowe C++ exceptions Wersja druga Obsługa wyjatków (C++ exceptions) try sprawdzana część kodu znajduje się w bloku try: try {... throw sygnalizacja sytuacji wyjatkowej poprzez użycie słowa kluczowego throw z wewnatrz bloku try catch blok zaraz za blokiem try; składnia catch jak zwykłej funkcji z jednym parametrem K.Grzelak (Wykład 8) Programowanie w C++ 8 / 31
Dygresja sytuacje wyjatkowe C++ exceptions Przykład cout «Podaj dwie liczby rzeczywiste «endl; double r1,r2,iloraz=0.; cin» r1» r2; try{ if(fabs(r2)<1e-6){ throw 15; iloraz=r1/r2; catch(int a){ cout «Dzielenie przez zero, wyjątek nr «a «endl; cout «iloraz= «iloraz «endl; K.Grzelak (Wykład 8) Programowanie w C++ 9 / 31
Dygresja sytuacje wyjatkowe C++ exceptions 1 Po zgłoszeniu sytuacji wyjatkowej automatyczne wyjście z bloku try 2 Który z najbliższych bloków catch ma być uruchomiony zależy od typu wyjatku i typu argumentu catch 3 Po zadziałaniu obsługi wyjatków - powrót do programu za blokami try i catch 4 W przypadku braku pasujacego argumentu wołane sa funkcje terminate() abort() K.Grzelak (Wykład 8) Programowanie w C++ 10 / 31
Dygresja sytuacje wyjatkowe standardowe wyjatki Przykład bez catch #include <iostream> #include <vector> using namespace std; int main() { vector<int> vec(15,6); cout «vec.at(15) «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 11 / 31
Dygresja sytuacje wyjatkowe standardowe wyjatki #include <iostream> #include <vector> #include <stdexcept> using namespace std; int main() { vector<int> vec(15,6); try{ cout «vec.at(15) «endl; catch(out_of_range e){ cout «Out of range error «endl; cout «e.what() «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 12 / 31
Przesyłanie pojemnika vector do funkcji Przykłady prototypów funkcji : Można tak: double srednia(vector<double> v); Lepiej: double srednia(vector<double> &v); lub w przypadku gdy nie chcemy modyfikować vector a: double srednia(const vector<double> &v); K.Grzelak (Wykład 8) Programowanie w C++ 13 / 31
Klasy...... czyli zaczynamy programowanie obiektowe K.Grzelak (Wykład 8) Programowanie w C++ 14 / 31
Klasy Klasy to typy definiowane przez użytkownika Przykłady: klasa Wektor2D - reprezentowana przez współrzędne dwóch punktów, poczatkowego i końcowego klasa Punkt2D - reprezentowana przez dwie współrzędne klasa Pracownik - reprezentowana przez imię, nazwisko, stanowisko, numer identyfikacyjny, rok zatrudnienia, pensję... K.Grzelak (Wykład 8) Programowanie w C++ 15 / 31
Klasy Klasy to dane składowe plus funkcje składowe (metody) funkcje dedykowane dla (działajace na rzecz) obiektów danej klasy Przykłady metod w różnych klasach: klasa Wektor2D - metoda wypisujaca wektor na ekran, liczaca jego długość... klasa Punkt2D klasa Pracownik - metoda obliczajaca długość zatrudnienia, liczaca dodatek do pensji zwiazany z wysługa lat... K.Grzelak (Wykład 8) Programowanie w C++ 16 / 31
Definicja klasy Średnik na końcu! Podstawy składni class Wektor2D { public: double x1; double y1; double x2; double y2; ; Nowy typ danych, deklaracja: Wektor2D v; K.Grzelak (Wykład 8) Programowanie w C++ 17 / 31
Definicja klasy - dane składowe Podstawy składni x1,x2,y1,y2 to dane składowe Składnikami klasy moga być zmienne różnych typów, także obiekty innej klasy. To co jest deklarowane wewnatrz klasy, ma zakres ważności równy obszarowi całej klasy. K.Grzelak (Wykład 8) Programowanie w C++ 18 / 31
Definicja klasy - funkcje składowe (metody) Podstawy składni Funkcje składowe zdefiniowane sa wewnatrz klasy i moga używać wszystkich danych składowych. K.Grzelak (Wykład 8) Programowanie w C++ 19 / 31
Definicja klasy Przykład definicji class Wektor2D { public: double x1; double y1; double x2; double y2; double dlugosc(){ double d=sqrt((x2-x1)*(x2-x1) +(y2-y1)*(y2-y1)); return d; ; K.Grzelak (Wykład 8) Programowanie w C++ 20 / 31
Użycie nowego typu Składnia z kropka int main(){ Wektor2D v1; v1.x1=0.5; v1.y1=0.2; v1.x2=1.5; v1.y2=0.8; cout «v1.dlugosc() «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 21 / 31
Użycie nowego typu Składnia ze strzałka int main(){ Wektor2D v1; v1.x1=0.5; v1.y1=0.2; v1.x2=1.5; v1.y2=0.8; Wektor2D * wsk; wsk = &v1; cout «wsk->dlugosc() «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 22 / 31
Definicja klasy Składnikami klasy moga być zmienne różnych typów, także obiekty innej klasy Klasa Punkt2D class Punkt2D{ public: double x; double y; ; Inaczej zdefiniowana klasa Wektor2D class Wektor2D{ public: Punkt2D poczatek; Punkt2D koniec; ; K.Grzelak (Wykład 8) Programowanie w C++ 23 / 31
public vs private public Składniki klasy (zwykle funkcje) - dostępne spoza klasy private Składniki klasy dostępne tylko dla funkcji składowych danej klasy Przez domniemanie wszystkie składniki klasy sa prywatne. K.Grzelak (Wykład 8) Programowanie w C++ 24 / 31
Definicja klasy ze składnikami publicznymi i prywatnymi class Wektor2D { public: void ustaw(double a1, double b1, double a2, double b2){ x1=a1; y1=b1; x2=a2; y2=b2; double dlugosc(){ double d=sqrt((x2-x1)*(x2-x1) +(y2-y1)*(y2-y1)); return d; private: double x1,y1,x2,y2; ; K.Grzelak (Wykład 8) Programowanie w C++ 25 / 31
Użycie nowego typu Próba bezpośredniego odwołania się z zewnatrz do składników prywatnych bład. int main(){ Wektor2D v1; v1.ustaw(0.5,0.2,1.5,0.8); cout «v1.dlugosc() «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 26 / 31
Definicja klasy - podział na pliki.h i.cc Każda klasa w osobnym pliku W pliku nagłówkowym (rozszerzenie.h) definicja klasy W pliku.cc (lub.cpp,.cxx... ) definicje funkcji składowych K.Grzelak (Wykład 8) Programowanie w C++ 27 / 31
Plik nagłówkowy Przykład: Wektor2D.h #ifndef WEKTOR2D_H #define WEKTOR2D_H class Wektor2D { public: void ustaw(double a1, double b1, double a2, double b2); double dlugosc(); private: double x1,y1,x2,y2; ; #endif Powyższe polecenia dla preprocesora zabezpieczaja przed wstawieniem pliku nagłówkowego więcej niż raz. K.Grzelak (Wykład 8) Programowanie w C++ 28 / 31
Plik z definicjami funkcji składowych Przykład: Wektor2D.cc #include<cmath> #include "Wektor2D.h" void Wektor2D::ustaw(double a1, double b1, double a2, double b2){ x1=a1; y1=b1; x2=a2; y2=b2; double Wektor2D::dlugosc(){ double d=sqrt((x2-x1)*(x2-x1) +(y2-y1)*(y2-y1)); return d; Jeśli funkcje poza definicja klasy, to musi być zdefiniowane z której klasy pochodza, np.: Wektor2D:: K.Grzelak (Wykład 8) Programowanie w C++ 29 / 31
Główny program Przykład: prog.cc #include<iostream> #include "Wektor2D.h" using namespace std; int main(){ Wektor2D v1; v1.ustaw(0.5,0.2,1.5,0.8); cout «v1.dlugosc() «endl; return 0; K.Grzelak (Wykład 8) Programowanie w C++ 30 / 31
Kompilacja programu zapisanego w kilku plikach g++ -o prog prog.cc Wektor2D.cc Pliki nagłówkowe właczane sa przez preprocesor (polecenie #include wewnatrz plików.cc) K.Grzelak (Wykład 8) Programowanie w C++ 31 / 31