Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Podobne dokumenty
Podstawy Programowania semestr drugi. Wykład czternasty

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Podstawy Programowania 2

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Język programowania PASCAL

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Wykład 8: klasy cz. 4

Rozdział 4 KLASY, OBIEKTY, METODY

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Wykład 5: Klasy cz. 3

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Podstawy Programowania Obiektowego

Ada-95. Dariusz Wawrzyniak

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Zapis programu z wykorzystaniem modułu (Podstawy Delphi 2.1, 2.2, 2.3 str11 )

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Programowanie obiektowe - 1.

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

TEMAT : KLASY DZIEDZICZENIE

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wykład VI PASCAL procedury i funkcje przekazywanie parametrów,

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Wykład 9: Polimorfizm i klasy wirtualne

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Technologie obiektowe

Aplikacje w środowisku Java

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Deklaracja struktury w C++

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wstęp do Programowania potok funkcyjny

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Wstęp do programowania 2

Materiały do zajęć VII

Programowanie obiektowe

Laboratorium 1 - Programowanie proceduralne i obiektowe

Czym są właściwości. Poprawne projektowanie klas

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Aplikacje w środowisku Java

Materiały do laboratorium MS ACCESS BASIC

1. Programowanie obiektowe. Wstęp.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Mechanizm dziedziczenia

Programowanie strukturalne i obiektowe. Funkcje

Programowanie obiektowe

Język programowania. Andrzej Bobyk

Konstruktor destruktor Programowanie obiektowe

Programowanie w Turbo Pascal

10. Programowanie obiektowe w PHP5

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

Kurs WWW. Paweł Rajba.

Podprogramy. Procedury

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Technologie i usługi internetowe cz. 2

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

PODSTAWOWE ZASADY PROGRAMOWANIA OBIEKTOWEGO NA BAZIE PAKIETU ROOT

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Tworzenie własnych komponentów

Programowanie Obiektowe Ćwiczenie 4

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wstęp do programowania obiektowego. Wykład 2

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Języki i techniki programowania Ćwiczenia 4 Wzorce

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Lista 5 Typy dynamiczne kolejka

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Szablony funkcji i klas (templates)

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie 2. Język C++. Wykład 3.

Dziedziczenie jednobazowe, poliformizm

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Podstawy programowania III

Dziedziczenie jednobazowe, poliformizm, tablice wskaźników na obiekty

Zaawansowane programowanie w języku C++ Klasy w C++

Języki i techniki programowania Ćwiczenia 2

Transkrypt:

Instrukcja laboratoryjna 7 Podstawy programowania 2 Temat: Obiektowość Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Obiektowość w Turbo Pascalu Wszystkie programy pisane na laboratoriach były tworzone strukturalnie, tzn. program używał wielu zmiennych, funkcji i procedur, które tak naprawdę nie były ze sobą połączone. Dopiero przekazywanie zmiennych jako parametry oraz wywoływanie procedur i funkcji w odpowiedniej kolejności powodowało, że program stawał się jedną całością. Wprowadzenie rekordów pozwoliło na zebranie powiązanych ze sobą zmiennych w jednym miejscu, jednak mimo to kod nadal był oddzielony od danych, na których operował. Mimo prostoty programowanie strukturalne posiada wiele wad, m. in. w przypadku większych programów trudno jest zapanować nad zmiennymi, jak również programiści korzystając z funkcji i procedur mogą używać ich w niepoprawny sposób. Dodatkowo dochodzi jeszcze problem w przypadku gdy udostępniamy nasz kod innym osobom programista posiada przez cały czas pełen dostęp do wszystkich zmiennych, nawet do tych których nie powinien zmieniać. Często trudno jest również zrozumieć kolejność oraz sposób korzystania ze zmiennych i podprogramów. Rozwiązaniem tych problemów jest programowanie obiektowe, które pozwala m.in. na powiązanie ze sobą zmiennych i procedur/funkcji oraz określenie do których z nich programiści będą posiadali pełny dostęp. Programowanie obiektowe w dużym stopniu jest zbliżone do tworzenia własnych typów danych za pomocą rekordów. Odpowiednikiem typu rekordowego (rekord zadeklarowany w sekcji type) jest klasa, która w przeciwieństwie do rekordu pozwala na deklarowanie procedur i funkcji w jej wnętrzu oraz określanie dostępu do poszczególnych jej elementów. Odpowiednikiem zmiennej o typie rekordu zadeklarowanego w sekcji type jest obiekt. Dzięki takiemu rozwiązaniu możliwe jest tworzenie komputerowych odpowiedników obiektów ze świata rzeczywistego (np. drzew, samochodów itp. ). Przykład 1. Rozpatrzmy przykład czajnika o maksymalnej pojemności 3 litrów, dla którego zadeklarujemy jedynie 2 procedury wyświetlenia ilości wody w czajniku (ilewody) oraz dolania do niego wody (dolejwody, w tej procedurze powinno być sprawdzenie, czy nie przekroczono

pojemności czajnika). Na początku napiszemy kod za pomocą programowania strukturalnego. Dla ułatwienia późniejszej rozbudowy programu czajnik zdefiniujemy jako rekord. Listing 1. Program w wersji strukturalnej program czajnikstrukturalnie; uses CRT; type TCzajnik = record iloscwody : real; var czajnik : Tczajnik; procedure dolejwody(var cz : TCzajnik; dolanolitrow : real); cz.iloscwody := cz.iloscwody + dolanolitrow; if( cz.iloscwody > 3) then cz.iloscwody:=3; writeln('wlano za duzo wody. Wszystko powyzej 3 litrow sie wylalo!'); procedure ilewody(var cz : TCzajnik); writeln('w czajniku jest ', cz.iloscwody:2:2,' l');

BEGIN clrscr; czajnik.iloscwody:=0; ilewody(czajnik); dolejwody(czajnik, 5); ilewody(czajnik); readln; END. Poniżej znajduje się wynik działania powyższego programu. Jak widać realizuje on poprawnie wszystkie założenia. Wyobraźmy sobie teraz sytuację, w której udostępniamy komuś nasz kod. Osoba ta stwierdziła, że zamiast wywoływać procedurę dolania wody, sama zmieni wartość zmiennej czajnik.iloscwody. W takim przypadku możliwe jest dolanie dowolnej ilości wody, bez żadnego błędu podczas kompilacji, ani komunikatu o przepełnieniu czajnika: {jeśli dostaniemy si ę do zmiennej nic nas nie powstrzyma przed dolaniem nawet 1000 litrów wody}

czajnik.iloscwody:=1000; ilewody(czajnik); Wynik działania powyższego kodu: O ile w tym przykładzie takie zachowanie jedynie spowoduje niespełnienie założeń, o tyle w rzeczywistych programach jest niedopuszczalne. Jeżeli założymy że pewne zmienne będą miały wartości tylko z określonego przedziału, może nastąpić sytuacja w której program będzie działał nieprawidłowo (np. przy obliczeniach matematycznych będzie generował nieprawidłowe wyniki) lub nawet zakończy swoje działanie błędem. Warto byłoby w jakiś sposób ograniczyć dostęp do zmiennej iloscwody, jednak w programowaniu strukturalnym nie jest to możliwe w prosty i czytelny sposób. Z pomocą w takim wypadku przychodzi programowanie obiektowe. Listing 2. Program w wersji obiektowej program czajnikobiektowo; uses CRT; type TCzajnik = object private iloscwody : real;

public procedure dolejwody(dolanolitrow : real); procedure ilewody; procedure TCzajnik.dolejWody(dolanoLitrow : real); iloscwody := iloscwody + dolanolitrow; if( iloscwody > 3) then iloscwody:=3; writeln('wlano za duzo wody. Wszystko powyzej 3 litrow sie wylalo!'); procedure TCzajnik.ileWody; writeln('w czajniku jest ', iloscwody:2:2,' l'); var czajnik : TCzajnik; BEGIN clrscr; czajnik.ilewody; czajnik.dolejwody(5); czajnik.ilewody; readln; END.

Listing 2 zawiera wiele nowych elementów. Pierwszym z nich jest definicja klasy: TCzajnik = object private iloscwody : real; { Zmienna atrybut} public procedure dolejwody(dolanolitrow : real); procedure ilewody; Jak już wspomniano, klasa może być traktowana w dużym uproszczeniu jako odpowiednik rekordu. Jej deklaracja wygląda bardzo podobnie do deklaracji rekordu znajdują się w niej zmienne (nazywane w programowaniu obiektowym atrybutami klasy) oraz procedury/funkcje (nazywane metodami klasy). Słowo private oznacza, że wszystkie atrybuty i metody znajdujące się po nim będą niewidoczne poza klasą. Słowo public jest jego przeciwieństwem pozwala na pełny dostęp z dowolnego miejsca. Jak można zauważyć, deklaracje procedur są pozbawione parametru, w którym przekazywana była zmienna przechowująca czajnik nie jest to potrzebne w tym przypadku, ponieważ gdy procedury/funkcje znajdują się wewnątrz klasy, posiadają pełny dostęp do wszystkich jej atrybutów (z których można korzystać, tak jakby były zmiennymi globalnymi). Oprócz samej deklaracji procedur w ciele klasy, należy napisać ich implementację. Tworzy się ją w identyczny sposób, co dla zwykłych procedur/funkcji, z jedną różnicą przed nazwą podporgramu należy podać nazwę klasy oraz kropkę: procedure TCzajnik.ileWody; writeln('w czajniku jest ', iloscwody:2:2,' l'); Po stworzeniu kodu klasy i jej metod, możemy przejść do deklaracji w sekcji var zmiennej, która będzie obiektem. W tym wypadku tworzy się ją identycznie jak inne zmienne własnych typów (np. rekordów). Należy również zwrócić uwagę, że obiektów można używać również jako atrybuty innych klas, rekordów, parametry funkcji itp. Po zadeklarowaniu obiektu, możemy już z niego korzystać w zwykły sposób dostęp do atrybutów wygląda identycznie jak w rekordach, metody również wywołuje się w analogiczny sposób:

obiekt.metoda(parametry), np.: czajnik.ilewody; czajnik.dolejwody(5); czajnik.ilewody; 1.2 Konstruktory i destruktory Konstruktor i destruktor jest czymś, co jeszcze bardziej odróżnia klasy od rekordów. Konstruktor to specjalna procedura wywoływana w celu zainicjalizowania obiektu, tzn. przypisania prawidłowych wartości początkowych atrybutów i wykonanie czynności, które muszą zostać zrobione dla każdego obiektu przed pierwszym użyciem. Podobnie jak zwykła procedura, konstruktor może być bezparametrowy, jak i może posiadać dowolną liczbę parametrów. Destruktor jest procedurą wywoływaną pod koniec życia obiektu zaraz przed jego całkowitym usunięciem z pamięci. Jest przydatny np. w celu zwalniania pamięci utworzonej w konstruktorze lub innych metodach. W języku TurboPascal w celu odróżnienia konstruktorów i destruktorów od zwykłych procedur podczas ich deklaracji należy używać zamiast słowa kluczowego procedure słowa construktor (dla konstruktora) i destructor (dla destruktora). Przykład 2 program p; uses CRT; type Tpies = object private imie : string; public constructor init; constructor initparam(noweimie : string); destructor dest; procedure dajglos; var pies, pies2 : Tpies;

constructor TPies.init; writeln('konstruktor bezparametrowy'); imie:='szarik'; constructor TPies.initParam(noweImie : string); writeln('konstruktor z parametrem'); imie:=noweimie; destructor TPies.dest; writeln('destruktor'); procedure Tpies.dajGlos; writeln(imie,': Hau! Hau!'); clrscr; pies.init; {wywołanie konstruktora bezparametrowego} pies2.initparam('azor'); {wywołanie konstruktora parametrowego} pies.dajglos; pies2.dajglos; pies.dest; pies2.dest; readln; end. Obiekty można również tworzyć dynamicznie, tak jak zwykłe typy danych. W takim wypadku konstruktory i destruktory wywołuje się w funkcjach new i dispose, np.: pies2:=new(wsktpies, initparam('azor')); dispose(pies2, dest);

Przykład 3 program p; uses CRT; type Tpies = object private imie : string; public constructor init; constructor initparam(noweimie : string); destructor dest; procedure dajglos; WSKTPies = ^TPies; var pies, pies2 : WSKTpies; constructor TPies.init; writeln('konstruktor bezparametrowy'); imie:='szarik'; constructor TPies.initParam(noweImie : string); writeln('konstruktor z parametrem'); imie:=noweimie; destructor TPies.dest; writeln('destruktor');

procedure Tpies.dajGlos; writeln(imie,': Hau! Hau!'); clrscr; pies:=new(wsktpies, init); pies2:=new(wsktpies, initparam('azor')); pies^.dajglos; pies2^.dajglos; dispose(pies, dest); dispose(pies2, dest); readln; end. Konstruktory i destruktory pełnią bardzo ważną rolę przy dziedziczeniu i polimorfizmie, o którym będzie następna instrukcja. 2 Zadania 1. Napisz program, w którym stworzysz klasę reprezentującą konto bankowe. Obiekt powinien posiadać atrybuty: imię i nazwisko właściciela, numer konta i ilość pieniędzy na koncie oraz metody wpłać i wypłać. Przy wypłacaniu należy sprawdzać, czy nie został przekroczony limit debetowy (np. saldo konta może mieć minimum -1000 zł). Stwórz jeden obiekt konta bankowego i przetestuj kod, wykonując kilka operacji wpłat i wypłat. 2. Do programu dodaj konstruktor, w którym zainicjujesz obiekt imię, nazwisko oraz ilość pieniędzy na koncie powinna być podawana przez parametr, natomiast numer konta powinien być wartością losową. 3. Do klasy konta bankowego dodaj metodę, która będzie służyła do przelewania pieniędzy między kontami (jako parametr podaj obiekt klasy konto bankowe oraz sumę do przelania). Stwórz 3 obiekty konta bankowego i przetestuj jej działanie.