Podstawy Programowania 2

Transkrypt

Podstawy Programowania 2
Podstawy Programowania 2
Instrukcja 6
Object Pascal
Opracował:
mgr inż. Leszek Ciopiński
Wstęp:
Programowanie obiektowe a programowanie strukturalne.
W programowaniu strukturalnym, któremu były poświęcone dotychczasowe laboratoria,
przyświecała sentencja Niklausa Wirtha „Algorytmy + Struktury Danych = Programy”. Jest to
klasyczny sposób programowania polegający na tworzeniu struktur danych, na których
wykonywane są pewne operacje realizowane przez funkcje lub procedury. Dane te są jednak niemal
całkowicie oderwane od funkcji i procedur na nich operujących. Oznacza to, że jeśli jakaś zmienna
jest globalna, możemy mieć do niej dostęp nie tylko w procedurach, które powinny na danej
zmiennej operować, ale możemy modyfikować jej wartość w dowolnym miejscu programu.
Z pomocą przychodzi tu programowanie obiektowe. Umożliwia ono łączenie funkcji, procedur
i struktur danych ze sobą w jedną hermetycznie zamkniętą całość. Oznacza to, że na pewnych
danych można operować tylko poprzez wydzielone dla nich funkcje lub procedury.
Object Pascal
Klasyczny język Pascal jest typowym językiem strukturalnym nie oferującym operacji na
klasach i obiektach. W związku z tym utworzone zostało rozszerzenie tego języka o odpowiednie
funkcje i procedury, które zostało nazwane Object Pascal. Istnieje wiele implementacji tego języka,
z których najbardziej popularną jest Borland Delphi dla systemów MS Windows. Implementacja ta
wyposażona jest również w szereg dodatkowych komponentów, które nie wchodzą w skład samego
języka. Darmowym odpowiednikiem Delphi jest środowisko Lazarus dostępne na większość
systemów operacyjnych.
Klasa i obiekt
Podobnie jak typ określa rodzaj zmiennej, tak klasa określa rodzaj obiektu. Klasa jest więc
pewnym rodzajem typu danych i dlatego w języku Object Pascal deklarację klasy umieszcza się
w części type. Deklaracja klasy wygląda podobnie do deklaracji rekordu, z tym, że używamy
słowa kluczowego object zamiast record. Poniżej przedstawiony został przykład klasy:
Klasa=object
t1, t2:string;
procedure copy();
procedure drukuj();
Podstawy Programowania 2
mgr inż. Leszek Ciopiński
1
procedure dodaj(x:String);
procedure dodaj(x:byte);
private
tmp:boolean;
public
end;
Pierwszą rzeczą, która odróżnia klasę od rekordu jest występowanie oprócz pól również procedur
i funkcji. W programowaniu obiektowym nazywa się je metodami. Warto zauważyć, że
w powyższym przykładzie dwukrotnie występuje deklaracja metody dodaj(), która raz
przyjmuje zmienną typu String, a następnie typu byte. W programowaniu strukturalnym każda
procedura musiała mieć unikatową nazwę. Programowanie obiektowe wspiera jednak mechanizm
polimorfizmu. Polega on na możliwości nadawania funkcjom lub procedurom tych samych nazw.
Różnią się one między sobą jedynie listą przyjmowanych parametrów. Oznacza to, że właściwa
metoda zostanie wybrana w zależności od typu lub klasy przekazywanego parametru. Co również
istotne, ponieważ metody przypisane są do konkretnych obiektów i klas, możliwe jest
występowanie metod o tych samych nazwach i parametrach w rożnych klasach. Właściwa metoda
zostanie wtedy wybrana w oparciu o klasę z której pochodzi dany obiekt.
Ostatnim istotnym elementem są sekcje public i private. Użycie pierwszej z nich
powoduje, że wszystkie zmienne i metody wymienione po niej dostępne są w każdym miejscu
programu bez żadnych ograniczeń. Ograniczenia takie wprowadza dopiero sekcja private.
Powoduje ona, że funkcje, procedury i nazwy pól wymienione po niej dostępne są poprzez
bezpośrednie odwołanie się do nich tylko w tym module, w którym znajduje się deklaracja klasy.
W pozostałych modułach aplikacji pola i metody z tej części klasy nie są dostępne. Nie oznacza to
jednak, że omawiane tu pola i metody są w jakikolwiek sposób usuwane. Istnieje do nich stały
dostęp poprzez wybrane przez programistę pola i metody publiczne. W ten sposób tworzony jest
interfejs komunikacji i obsługi klasy. Programista zabezpiecza się w ten sposób przed
przypadkowym użyciem danego obiektu.
Implementacja elementów obiektu
Metody, które zostały zadeklarowane w klasie muszą jeszcze zostać zaimplementowane.
Wykonuje się to po sekcji type a przed sekcją var. Implementacja metody różni się od
implementacji zwykłej procedury i funkcji jedynie dwoma elementami. Pierwszym jest nazwa
metody, która składa się najpierw z nazwy klasy do której należy, a dopiero po kropce „.” własnej
nazwy. Drugim, jest możliwość dostępu do wszystkich zmiennych, które zostały zadeklarowane
wewnątrz danej klasy. Przypomina to sytuację odwoływania się do zmiennych globalnych. Należy
jednak pamiętać, że zawsze operujemy na polach należących do danego obiektu i wywołanie
metody dla jednego z obiektów nie skutkuje zmianą wartości parametrów (pól) innego obiektu.
Przykładowe implementacje metod zaprezentowanej powyżej klasy przedstawiono poniżej:
procedure Klasa.drukuj();
begin
writeln(tmp);
end;
procedure Klasa.dodaj(x:String);
begin
t2:=t2+x;
end;
Podstawy Programowania 2
mgr inż. Leszek Ciopiński
2
procedure Klasa.dodaj(x:byte);
begin
t2:=t2+IntToStr(x);
end;
procedure Klasa.copy();
begin
t2:=t1;
tmp:=true;
end;
Używanie obiektów i metod
Tworzenie obiektów danych klas wygląda podobnie do tworzenia zwykłych zmiennych
i wykonuje się je poprzez deklarację w sekcji var. Przykład takiej deklaracji pokazano poniżej:
k:Klasa;
Dostęp do kolejnych parametrów (pól) obiektu danej klasy przypomina dostęp do pól rekordu.
W analogiczny sposób został również zorganizowany dostęp do metod obiektu danej klasy:
k.t1:='Kot';
k.copy();
k.drukuj();
k.dodaj(' aaa ');
k.dodaj(5);
Writeln(k.t2);
Środowisko Lazarus
Środowisko Lazarus dostępne jest na licencjach GNU GPL i LGPL (część elementów
składowych podlega pierwszej licencji, a pozostała część drugiej). Strona domowa projektu to:
http://www.lazarus.freepascal.org/.
Po uruchomieniu środowiska automatycznie otwierany jest ostatnio tworzony projekt lub,
w przypadku jego braku, nowy projekt. Pierwszym elementem, który może nieco zaskakiwać jest
budowa tego środowiska. Wzorowana jest ona na Borland Delphi, gdzie w górnej części okna
otwierany jest pasek narzędzi z komponentami, a poniżej znajdują się formatki i okna pomocnicze.
Aby przygotować środowisko do nowego projektu należy wybrać polecenie menu: Plik |
Zamknij Wszystko, a następnie tworzymy nowy projekt poleceniem:
Plik | Nowy... → Projekt | Program. Poniżej przedstawiono ogólny wygląd
środowiska po wykonaniu powyższych czynności (w tle pulpit i inne otwarte okna):
Podstawy Programowania 2
mgr inż. Leszek Ciopiński
3
Pasek menu
i
komponentów
Okno z kodem
źródłowym
Okno
komunikatów
kompilacji
Okienko z kodem źródłowym zawiera kod tworzonego programu. Posiada numerowanie linii
i kolorowanie kodu w celu jego łatwiejszego przeglądania. Przydatnym jest również narzędzie
zwijania implementacji procedur. Informację o wyniku kompilacji, jej powodzeniu lub napotkanych
błędach znaleźć można w okienku „Komunikaty”.
Głównym elementem środowiska jest jednak pasek menu i komponentów:
Menu
Najważniejsze funkcje sterujące
Paleta formatów
Paleta komponentów wykorzystywana jest przy tworzeniu aplikacji okienkowych i zostanie
dokładniej omówiona w następnych instrukcjach. Teraz zwróćmy uwagę na najważniejsze funkcje
sterujące:
5
4
6
3
1
2
7
8
9
10
11
12
13
1. Nowy moduł – tworzony jest schemat nowego modułu.
2. Otwórz – istniejący plik.
Podstawy Programowania 2
mgr inż. Leszek Ciopiński
4
3.
4.
5.
6.
Zapisz zmiany w bieżącym oknie.
Zapisz zmiany we wszystkich otwartych plikach.
Nowy Formularz – nowa formatka przy tworzeniu aplikacji okienkowych.
Przełącz pomiędzy formularzem – modułem. Umożliwia podgląd kodu źródłowego
powiązanego z daną formatką.
7. Pokaż moduły – wyświetla listę modułów tworzonego programu/aplikacji.
8. Pokaż formularze – wyświetla listę formularzy tworzonej aplikacji.
9. Uruchom – kompiluje projekt i uruchamia utworzony program/aplikację.
10. Wstrzymaj – wstrzymuje tymczasowo działanie aplikacji.
11. Zatrzymaj – zatrzymuje i wyłącza utworzoną aplikację, Przydatne, jeśli program ulega
zawieszeniu.
12. Wejdź do – podczas debugowania umożliwia wejście do danej funkcji lub procedury
i wykonanie kolejnego kroku aplikacji.
13. Przejdź przez – podczas debugowania umożliwia przejście przez daną funkcję lub procedurę do
następnego kroku aplikacji.
Wybrane funkcje dodatkowe
W module sysutils znajdują się funkcje pomocnicze ułatwiające tworzenie aplikacji.
Poniżej podano jedynie niektóre z nich:
•
•
•
IntToStr() - zamienia liczbę typu Integer na zmienną typu String
IntToHex() - zamienia liczbę typu Integer na zmienną typu String, zawierającą liczbę
zapisaną w postaci szesnastkowej.
StrToInt() - zamienia liczbę zapisaną w typie String na typ Integer.
Zadania:
Należy utworzyć klasę, której obiekt będzie mógł wykonać następujące operacje na liczbach
zespolonych:
1. Wyświetlanie liczby w postaci kanonicznej (a+ib) i trygonometrycznej (|z|(cosφ+isinφ))
najpierw w formacie dziesiętnym, a następnie szesnastkowym.
(1 punkt)
2. Dodawanie do jednej liczby zespolonej drugiej liczby zespolonej. Należy to zrealizować
poprzez metodę przyjmującą jako parametr inną liczbę zespoloną. Wynik należy zapisać
w obiekcie wywołującym metodę:
a.dodaj(b) – wynik zapisujemy w obiekcie „a”
(1 punkt)
3. Mnożenie liczb zespolonych. Należy to zrealizować poprzez metodę przyjmującą jako
parametr inną liczbę zespoloną. Wynik należy zapisać w obiekcie wywołującym metodę:
a.pomnoz(b) – wynik zapisujemy w obiekcie „a”
(1 punkt)
4. Dzielenie liczb zespolonych. Należy to zrealizować poprzez metodę przyjmującą jako
parametr inną liczbę zespoloną. Wynik należy zapisać w obiekcie wywołującym metodę:
a.podziel(b) – wynik zapisujemy w obiekcie „a”
(1 punkt)
5. Kopiowanie wartości liczby zespolonej. Należy to zrealizować poprzez metodę przyjmującą
jako parametr inną liczbę zespoloną. Wynik należy zapisać w obiekcie wywołującym metodę:
a.kopiuj(b) – wynik zapisujemy w obiekcie „a”
(1 punkt)
Podstawy Programowania 2
mgr inż. Leszek Ciopiński
5