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