Programowanie obiektowe PO Programowanie obiektowe PO - LAB 1 Wojciech Pieprzyca
PO 1. Wstęp Programowanie obiektowe pozwala nam posługiwać się rzeczywistymi pojęciami, które znamy z codziennego życia. Nie musimy zatem odwoływać się do określonej specyfiki języka maszynowego, ani też nawet do jego bardziej abstrakcyjnych wersji (ale nadal odległych od rzeczywistości, która nas otacza). Obiektowość upraszcza nie tylko samo programowanie, ale także fazę projektowania oprogramowania. Pojęciem kluczowym dla tego sposobu programowania jest obiekt.
PO 2. Czym jest obiekt ? Obiekt jest tworem abstrakcyjnym jednak w dużym stopniu odzwierciedlającym rzeczywistą charakterystykę i działanie maszyn, ludzi, organizacji, itp. Z obiektem możemy utożsamiać 3 cechy: a) stan - dane opisujące obiekt tzw. składowe czyli informacje które obiekt ZNA, b) zachowanie - funkcje jakie może wykonywać obiekt tzw. metody, czyli zachowania które obiekt WYKONUJE, c) tożsamość - pozwala na jednoznaczne odróżnianie obiektów od siebie.
PO 3. Klasy Klasa jest pojęciem pierwotnym dla obiektu ponieważ każdy obiekt jest reprezentantem jakiejś klasy obiektów (czyli, że obiekty powstają na podstawie wcześniej zdefiniowanego opisu klasy). Klasa grupuje obiekty tego samego rodzaju, posiadające tę samą strukturę. Klasę możemy wyobrazić sobie jako matrycę służącą do tworzenia obiektów. W ten sposób informujemy kompilator jakie składowe i jakie metody zawiera dana klasa, a co za tym idzie poszczególne obiekty, które są związane z daną klasą. KLASA OBIEKTÓW o1 o2 o3 o4
PO 4. Przykład klasy Rozpatrzmy klasę samochód. Jak wiemy każdy obiekt typu samochód posiada dość podobną charakterystykę i funkcjonalność. Przykładem opisu klasy samochód może być kolor, masa, rodzaj silnika, elementy wyposażenia, itp. Jako funkcje (metody) możemy z kolei wyróżnić: zmianę prędkości, zmianę biegu, hamowanie, przyspieszanie, itp. Mamy więc klasę samochód na postawie której możemy stworzyć obiekty tej klasy, a więc konkretne wystąpienia klasy takie jak np. Ford, Mercedes, Honda, itp.
PO 5. Dziedziczenie Dziedziczenie polega na tworzeniu klas (tzw. klas potomnych) na podstawie klas bardziej ogólnych (tzw. klas bazowych). Klasa potomna dziedziczy wszystkie metody oraz składowe klasy bazowej. W podanym przykładzie klasy Focus, Ka i Mondeo dziedziczą te elementy po klasie Ford. Dodatkowo każda z klas potomnych może mieć własne składowe i metody, nie związane z klasą bazową.
6. Komunikacja obiektów PO W sposób uproszczony możemy przyjąć, że program obiektowy składa się z wielu obiektów komunikujących się między sobą, wymieniających informacje i wywołujących wzajemnie swoje metody. Musi zatem istnieć odpowiedni mechanizm komunikacji obiektów. Obiekty zwykle komunikują się poprzez wywołanie metod publicznych, tzn. takich które są dostępne spoza samego obiektu macierzystego. W przykładzie widzimy, ze obiekt kierowca wywołuje metodę publiczną zmianaBiegu obiektu samochód.
PO 7. Enkapsulacja (I) Enkapsulacja jest próbą ukrycia niektórych skladowych i metod obiektu przed dostępem z zewnątrz (czyli przez inne obiekty). Dobrym zwyczajem jest pisanie dla wszystkich skladowych (zmiennych) do których istnieje potrzeba dostania się z zewnątrz obiektu, odpowiednich metod dostępowych. Na przykład dla zmiennej int liczba, napisalibyśmy dwie metody dostępowe ustawLiczbe(int x) ustalającą wartość zmiennej na podaną wartość x i pobierzLiczbe() zwracającą aktualną wartość liczby. Taki sposób programowania chroni składową x przed bezpośrednim dostępem i ingerencją z zewnątrz. Dzięki temu w metodach dostępowych można kontrolować sposób zmiany tej wartości.
PO Enkapsulacja (II) Ze względu na możliwy dostęp wyróżniamy 3 rodzaje składowych: 1) prywatne (private) – przeznaczone wyłącznie do użytku wewnątrz danej klasy 2) publiczne (public) – dostęp do nich jest nieograniczony, tzn. możliwy zarówno w ramach klasy jak i spoza niej, 3) chronione (protected) – dostępne wewnątrz danej klasy, ale również dla klas potomnych (patrz dziedziczenie) oraz klas i metod zaprzyjaźnionych (o tym powiemy później).
8. Pierwszy program (I) PO W celu napisania programu skorzystamy z darmowego kompilatora Dev C++. Po uruchomieniu programy wybieramy ikonę , aby utworzyć nowy projekt.
Pierwszy program (II) PO Dalej wybieramy opcję Console Application i wpisujemy nazwę nowego projektu, oraz jeszcze raz zatwierdzamy podaną nazwę.
Pierwszy program (III) PO Pierwszy program (III) Po uruchomieniu konsoli automatycznie generowany jest szkielet programu, Zawiera on dyrektywy kompilatora (rozpoznamy je po tym, że zaczynają się od znaku #), podstawowa dyrektywa kompilatora taka jak np. include pozwala na dołączenie plików nagłówkowych (czyli deklaracji funkcji bibliotecznych, które będą nam potrzebne podczas pisania programów). Przykładem pliku nagłówkowego jest iostream.h.
Pierwszy program (IV) PO Na początku będą nam potrzebne funkcje biblioteczne z 2 plików nagłówkowych: cstdlib – standardowa biblioteka C, którą domyślnie dołącza kompilator Dev C++, iostream – biblioteka wejścia/wyjścia, pozwala m.in. wyświetlać informacje na strumieniu wyjściowym (np. monitorze) i pobierać dane ze strumienia wejściowego (np. klawiatury),
Pierwszy program (V) PO Każdy program w języku C obowiązkowo zawiera funkcję main. Jest to główna funkcja programu od której rozpoczyna się proces wykonywania programu. Treść każdej funkcji (tzw. ciało programu) zawiera się w obszarze ograniczonym przez dwa nawiasy klamrowe. { ….. (ciało) }
PO Pierwszy program (VI) Pierwszy program będzie wyświetlał powitanie na ekranie. //dyrektywy dotyczące plików nagłówkowych #include <cstdlib> #include <iostream> //definicja funkcji main int main(int argc, char* argv[]) { //wyświetlenie napisu na ekranie i przejście do nowej linii cout << ”Witaj w swoim pierwszy programie!” << endl; //oczekiwanie na naciśnięcie klawisza system(”PAUSE”); return EXIT_SUCCESS; }
Pierwszy program (VII) PO Pierwszy program (VII) Uwagi do programu: - niektóre linie kodu poprzedzone znakami // stanowią komentarz i nie są brane pod uwagę w czasie kompilacji programu, - funkcja main zawiera argumenty wejściowe i wyjściowe, ponieważ jednak tworzona jest ona automatycznie przez środowisko Dev C++ to na razie pominiemy ten aspekt i wrócimy do jego omówienia w rozdziale dotyczącym funkcji, - jedyną linią kodu do samodzielnego wpisania jest ta z instrukcją cout powodującą wysłanie tekstu przekazanego po operatorze << na domyślny strumień wyjściowy (zwykle monitor). Tekst jawny używany w programie musi zostać objęty apostrofami. Instrukcja endl wymusza przejście do nowej linii, - instrukcja system(”pause”) powoduje zatrzymanie programu aż do naciśnięcia klawisza przez użytkownika, - return w tym przypadku zawraca kod pomyślnego zakończenia funkcji.
9. Jak skompilować program ? (I) PO 9. Jak skompilować program ? (I) W celu kompilacji programu należy nacisnąć klawisze CTRL+F9. Zazwyczaj jednak będziemy jednocześnie chcieli skompilować program i go uruchomić (klawisz F9). Kompilujemy program i…
Jak skompilować program ? (II) PO Jak skompilować program ? (II) KOMPILACJA Sukces :-) Porażka :-( Nie pojawiają się komunikaty o błędach, pojawia się za to okno programu w trybie tekstowym. Kompilator informuje nas o występujących błędach składni i podświetla linie w której wystąpił pierwszy błąd
PO 10. Slowa kluczowe Słowa kluczowe są integralną częścią skladni języka. Oznacza to, że są one zarezerwowane i nie mogą być używane w innych celach niż to pierwotnie założono, nie można ich np. wykorzystać do nadawania nazw zmiennych czy funkcji. Przyklady slów kluczowych: asm, break, case, catch, char, class, const, continue, default, delete, do, double, else, enum, extern, float, for, friend, goto, if, inline, int, long, new, operator, private, protected, public, register, return, short, signed, sizeof, static, struct, switch, this, throw, try, typedef, unsigned, virtual, void, volatile, while
PO 11. Zmienne Pod pojęciem zmiennej rozumiemy zwykle komórkę pamięci, której rozmiar zależy od typu danej, którą chcemy w niej przechowywać. Inny będzie więc rozmiar zmiennej dla liczby całkowitej, a inny dla ciągu znaków. Każda zmienna posiada swój adres w pamięci, jednak odwoływanie się do zmiennej poprzez adres byłoby dość kłopotliwe, dlatego też zmiennym można przyporządkować nazwy. Nazwa składa się z ciągu liter i cyfr, nie może jednak zawierać „polskich liter”, spacji ani rozpoczynać się od cyfry. Nie może być oczywiście taka sama jak istniejące słowo kluczowe. W języku C rozróżniane są duże i male litery.
PO 12. Typy danych Tak jak już wspomnieliśmy każda zmienna w języku C musi mieć ściśle przyporządkowany typ danych. Wyróżniamy następujące podstawowe typy danych: Typ danych Liczba bitów Zakres wartości char 8 -128:127 lub jeden znak ASCII int 32 -2 147 483 648 : 2 147 483 647 unsigned int 0 : 4 294 967 295 short int 16 -32 768 : 32 767 float 3,4*10-38 : 3,4*1038 double 64 2,2*10-308 : 1,8*10308
13. Przykładowy program (I) PO 13. Przykładowy program (I) #include <cstdlib> #include <iostream> #include <math.h> //plik naglowkowy z funkcja sqrt using namespace std; int main(int argc, char *argv[]) { //deklaracja zmiennych float a,b,c; float delta,x1,x2; //pobranie danych z klawiatury cout << "Podaj a: "; cin >> a; cout << "Podaj b: "; cin >> b; cout << "Podaj c: "; cin >> c; //obliczenie delty i pierwiastkow delta = b*b-4*a*c; x1 = (-b-sqrt(delta))/(2*a); //sqrt – pierwiastek kwadratowy x2 = (-b+sqrt(delta))/(2*a); //wypisanie wynikow na ekranie cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; system("PAUSE"); return EXIT_SUCCESS; }
Przykładowy program (II) PO Przykładowy program (II) Uwagi do programu: jak można latwo się zorientować program nie jest doskonaly, nie sprawdza chociażby czy wskaźnik delta jest nieujemny co jest warunkiem istnienia rozwiązań równania kwadratowego, podobnie nie jest sprawdzane czy iloczyn w mianowniku wyrażenia na rozwiązania x1 i x2 jest niezerowy, w przypadku gdy a=0 uzyskamy błąd dzielenia przez zero, podobnie jak instrukcja cout służyła do wyprowadzenia wyników na ekran, tak instrukcja cin służy do pobrania danych z klawiatury, ponieważ istniała konieczność użycia funkcji pierwiastkowania sqrt, to konieczne było dołączenie funkcji bibliotecznych z pliku nagłówkowego math.h, po zapoznaniu się z instrukcjami warunkowymi na następnym laboratorium będziemy mogli udoskonalić program.
PO 14. Ćwiczenia Proszę wybrać sobie jakiś obiekt ze świata rzeczywistego (obiektem może być także część jakiejś organizacji, struktury, itp.), a następnie: określić składowe i metody występujące w klasie reprezentującej zbiór obiektów, zastanowić się które ze składowych i metod powinny mieć określony dostęp jako private a które mogą być public ? Proszę uruchomić środowisko Dev C++, utworzyć projekt, dopisać odpowiednią linię kodu i spróbować skompilować i uruchomić pierwszy podany program wyświetlający powitanie na ekranie. Proszę napisać program realizujący następujące zadania: pyta użytkownika o jego imię i wyświetla je na ekranie, następnie pyta użytkownika o długość boków a,b prostokąta (liczby całkowite), wylicza obwód (2a+2b) i pole (a*b) i wyświetla wynik na ekranie, następnie pyta użytkownika o promień kuli wylicza jej objętość (4/3*pi*r3) i pole powierzchni (4*pi*r2).