Programowanie
obiektowe
PO
PO - LAB 1
Wojciech Pieprzyca
• 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
.
1. Wstęp
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ą.
PO
o1
o2
o3
o4
KLASA
OBIEKTÓW
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
PO
• 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.
7. Enkapsulacja
(I)
PO
• 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.
Enkapsulacja
(II)
PO
• 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
• 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)
}
Pierwszy program
(VI)
PO
• 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
• 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
• 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
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
10. Slowa kluczowe
PO
• 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
11. Zmienne
PO
• 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.
12. Typy danych
PO
• 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
32
0 : 4 294 967 295
short int
16
-32 768 : 32 767
float
32
3,4*10
-38
: 3,4*10
38
double
64
2,2*10
-308
: 1,8*10
308
13. Przykładowy program
(I)
PO
#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
• 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
.
14. Ćwiczenia
PO
• 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*r
3
) i pole powierzchni (4*pi*r
2
).