Antoni M. Zajączkowski: Abstrakcyjne typy danych i typy prywatne. Pakiet Ulamki 20 maja 2015

Podobne dokumenty
Wstęp do Programowania potok funkcyjny

Podstawy Programowania Obiektowego

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

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

Przeciążanie operatorów

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

Programowanie obiektowe - 1.

Pakiety i interfejsy. Tomasz Borzyszkowski

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

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

Interfejsy i klasy wewnętrzne

Wykład 9: Polimorfizm i klasy wirtualne

Ada-95. Dariusz Wawrzyniak

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

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

Wstęp do programowania 2

Wykład 8: klasy cz. 4

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

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

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Aplikacje w środowisku Java

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

Programowanie strukturalne i obiektowe. Funkcje

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

Do czego służą klasy?

Zadanie 2: Arytmetyka symboli

Wstęp do programowania 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe

Podstawy i języki programowania

Wstęp do programowania 2

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

UML cz. II. UML cz. II 1/38

TEMAT : KLASY DZIEDZICZENIE

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

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

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

C++ Przeładowanie operatorów i wzorce w klasach

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Materiały do zajęć VII

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

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do programowania

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Definiowanie własnych klas

Modelowanie obiektowe

Próbny egzamin z matematyki dla uczniów klas II LO i III Technikum. w roku szkolnym 2012/2013

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wstęp do Programowania 2

Podstawy Programowania C++

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Technologie i usługi internetowe cz. 2

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

Aplikacje w środowisku Java

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

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

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

1 Powtórzenie wiadomości

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Funkcje wymierne. Jerzy Rutkowski. Teoria. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Rozdział 4 KLASY, OBIEKTY, METODY

Część 4 życie programu

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

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

Deklaracja struktury w C++

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Tabela wewnętrzna - definicja

Kurs WWW. Paweł Rajba.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Podstawy Programowania semestr drugi. Wykład czternasty

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

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

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

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

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Lab 9 Podstawy Programowania

Wstęp do programowania obiektowego. Wykład 2

1. ZBIORY PORÓWNYWANIE ZBIORÓW. WYKŁAD 1

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Wyjątki (exceptions)

PODSTAWOWE ZASADY PROGRAMOWANIA OBIEKTOWEGO NA BAZIE PAKIETU ROOT

Wzorce projektowe. dr inż. Marcin Pietroo

Transkrypt:

ABSTRAKCYJNE TYPY DANYCH I TYPY PRYWATNE Abstrakcja danych (data abstraction) polega na tym, że typ danych rozumiany jest jako struktura składająca się ze zbioru wartości, do którego należą dane i operacji podstawo wo- wych (primitive operations), które mogą być wykonywane na elementach tego zbioru (Feldman, Koffman, 1996). Z podanego określenia wynika, że wprowadzona wcześniej definicja typu danych jest definicją abstrakcyjnego typu danych - ATD (abstract data type - ADT). Najważniejszą własnością abstrakcji danych jest udostępnianie operacji na danych, przy jednoczesnym ukryciu szczegółów ich reprezentacji i szczegółów implementacji operacji zdefiniowanych dla tych danych. Najczęściej osiągamy to umieszczając definicję ATD w odpowiednim pakiecie do abstrakcji danych. Program korzystający z ATD nazywamy programem klienckim (client program), albo krótko klientem (client). W programie tym można deklarować obiekty i używać operacji zdefiniowanych dla tego ATD. Stosując ukrycie informacji (information hiding) osiąga się separację (separation) wykorzystania typu w programie klienckim od reprezentacji typu (type representation) i im- plementacji operacji (operation implementation). Dzięki temu program kliencki może być opracowany niezależnie od ATD. 1. Struktura abstrakcyjnego typu danych Zazwyczaj abstrakcyjny typ danych jest typem strukturalnym, najczęściej typem rekordowym. Wśród operacji definiowanych dla ATD wyróżnia się cztery ważne grupy tych operacji (Feldman, Koffman, 1996): - Konstruktory (constructors), które tworzą lub konstruują obiekty typu abstrakcyjnego łącząc składowe typu w jedną całość, - Selektory (selectors), które udostępniają składowe obiektu typu abstrakcyjnego, - Zapytania (inquiries), które służą do stwierdzenia, czy obiekt typu abstrakcyjnego posiada pewną własność, - Operacje wejścia/wyjścia (input/output operations) służą do pobierania wartości typu abstrakcyjnego, albo wyprowadzania wartości tego typu na zewnątrz. W Adzie istnieje kilka mechanizmów i pojęć pozwalających na implementację i stosowanie ATD. Wyróżniamy tu (Feldman, Koffman, 1996): - Podtypy (subtypes). Możliwość deklarowania podtypów pozwala na definiowanie ograniczonych zbiorów wartości typów liczbowych, albo wyliczeniowych, co pociąga za sobą pewność, że zmienna danego podtypu nie przyjmie wartości spoza dopuszczalnego zakresu, - Inicjowanie pól rekordów (initialisation of record fields), czyli nadawanie wartości początkowych (domyślnych) składowym rekordu przy deklaracji typu rekordowego, - Pakiety (packages). Pakiet jest idealnym sposobem grupowania zasobów udostępnianych klientom pakietu, przy czym wszystkie zasoby udostępniane w części publicznej muszą być zaimplementowane w części niepublicznej pakietu, a program kliencki musi prawidłowo korzystać z udostępnionych zasobów, - Typy prywatne i typy pochodne (private and derived types). Omawiamy je w następnych punktach. - Przeciążanie operatorów (operator overloading). Mechanizm ten pozwala na definiowanie nowych operacji algebraicznych i relacji w przypadku nowych typów i stosowanie tych operacji w wyrażeniach, podobnie jak operacji algebraicznych i relacji zdefiniowanych wstępnie, 1

- Wyjątki definiowane przez użytkownika (user defined exceptions). Umożliwia to na zdefiniowanie nowych wyjątków i ich obsługę w programie klienckim, - Atrybuty (attributes). Atrybuty pozwalają na pisanie podprogramów, które manipulują strukturami bez odwoływania się do wszystkich szczegółów ich reprezentacji. Jest to szczególnie użyteczne w przypadku podprogramów implementujących operacje na obiektach typów tablicowych, - Definicje ogólne (generic definitions). Definicja ogólna umożliwia na pisanie podprogramów i pakietów ogólnych, które udostępniają operacje na danych bez odwoływania się do reprezentacji typów. Jeżeli chcemy użyć jednostki ogólnej (podprogramu, lub pakietu) w programie klienckim, musimy dokonać konkretyzacji tej jednostki do typu jaki stosujemy. Dotychczas omawialiśmy podtypy, typy rekordowe, atrybuty, pakiety i przeciążanie operatorów, a teraz zajmiemy się typami prywatnymi.. Typy prywatne W programie klienckim dane typu abstrakcyjnego powinny być używane we właściwy - prawidłowy sposób. W Adzie do bezpiecznego udostępnianiu ATD klientowi przez pakiet służą typy prywatne (private types). Typy tego rodzaju opisują stopień widzialności typu abstrakcyjnego pomiędzy klientem, a pakietem udostępniającym ten typ. W przypadku typu prywatnego program kliencki dysponuje jedynie zdefiniowaną wstępnie instrukcją podstawienia := i zdefiniowaną wstępnie relacją równości = i jej negacją, czyli relacją nierówności /=. Inne operacje wykonywane na danych typu prywatnego muszą być zdefiniowane i udostępnione w części publicznej pakietu definiującego typ prywatny. Przykład 1. Pakiet Wektory_D i program Test_Wektory_D. Na początku pakietu definicyjnego mamy deklarację type Wektor_D is private; która definiuje typ prywatny o nazwie Wektor_D, przy czym istotne jest to, że deklaracja ta nie zawiera opisu typu, który znajduje się w części prywatnej pakietu. Część ta występuje po słowie kluczowym private. W ten sposób pakiet podzielony jest na dwie części: publiczną do słowa private i prywatną od tego słowa do kończącego pakiet słowa end. Typ Wektor_D służy do reprezentacji wektorów znanych z elementarnej geometrii analitycznej na płaszczyźnie, a więc wektorów zaczepionych w początku kartezjańskiego układu współrzędnych i o końcu w punkcie reprezentowanym przez parę uporządkowaną liczb rzeczywistych. Po deklaracji typu prywatnego mamy deklarację stałej Zero, reprezentującej wektor zerowy, przy czym deklaracja ta jest niepełna, bo nie podaje wartości stałej. Uzupełnienie deklaracji stałej znajdujemy w części prywatnej, gdzie po podaniu wszystkich szczegółów reprezentacji typu prywatnego można, zgodnie z tą reprezentacją, nadać odpowiednią wartość stałej. Stałą tego rodzaju nazywamy stałą odło- żoną (deferred constant). Warto podkreślić to, że klient pakietu nie ma udostępnionych szczegółów reprezentacji typu prywatnego i w związku z tym, w programie klienckim nie można deklarować stałych tego typu tak, jak to zrobiono w części prywatnej pakietu. Pakiet służy do implementacji struktury rzeczywistej przestrzeni wektorowej w zbiorze wektorów dwuelementowych reprezentowanych przez typ Wektor_D. W tym celu część publiczna zawiera nagłówki funkcji "+" i "*", które realizują odpowiednio dodawanie wektorów i mnożenie wektorów przez skalary z ciała liczb rzeczywistych. Zwróćmy uwagę na to, że mamy tu przykład przeciążenia operatorów dodawania i mnożenia oraz na to, że dostępne są dwie funkcje "*" realizujące odpowiednio mnożenie lewo i prawostronne. Kompilator analizując wyrażenia, w których wywołano te funkcje rozpozna jaka jest kolej-

ność argumentów mnożenia i zastosuje właściwy kod. Dzięki temu klient nie musi troszczyć się o kolejność argumentów mnożenia wektorów przez skalary. Poza tym, pakiet udostępnia dwie operacje wejścia/wyjścia w postaci procedur Czytaj_Wektor_D i Wypisz_Wektor_D. Pierwsza z tych procedur jest jednocześnie konstruktorem danych typu Wektor_D, natomiast pakiet nie zawiera zapytań i selektorów. Zwróćmy uwagę na ważną własność ukrycia szczegółów reprezentacji typu Wektor_D przed programem klienckim. W sytuacji, gdy z jakichś powodów zostanie zmieniona pełna deklaracja tego typu oraz wynikający z tego sposób wartościowania stałej Zero, to program kliencki nie zmieni się, mimo że importować będzie zmodyfikowany pakiet Wektory_D. Oczywiście, przy zmianie deklaracji typu Wektor_D, musi zostać odpowiednio zmodyfikowana część implementacyjna pakietu. W programie klienckim pakietu udostępniającego typ prywatny można deklarować stałe i zmienne tego typu w zwykły sposób, przy czym stałym nie można nadawać wartości, a zmiennym nadawać wartości początkowych lub zmieniać ich wartości odwołując się do szczegółów reprezentacji typu prywatnego. W związku z tym, otrzymamy błąd kompilacji pisząc A : Wektor_D := (1 => 0.0, => 0.0); natomiast poprawna jest deklaracja A : Wektor_D := Zero; Zadanie 1. Napisać funkcje First_Component i Second_Component obliczające odpowiednio pierwszą i drugą składową wektora typu Wektor_D. Założyć przy tym, że pełna deklaracja tego typu ma postać type Wektor_D is record First : Float; Second : Float; end record; Zadanie. Przyjmując definicję typu Wektor_D jak w zadaniu 1 napisać funkcje Konstruktor_D, "+", "*", "*" służące odpowiednio do: konstrukcji wektora z jego składowych, obliczania sumy dwóch wektorów i obliczania iloczynu skalara przez wektor i wektora przez skalar rzeczywisty. Zadanie 3. Przyjmując definicję typu Wektor_D jak w zadaniu 1 napisać pełne deklaracje stałych Zero, Wersor_1 i Wersor_, które reprezentują odpowiednio wektory: 0 =(0,0), e = (1,0), 1 e = (0,1) R. Obiekty zadeklarowane w części prywatnej pakietu definicyjnego dostępne są w części implementacyjnej. Dotyczy to na przykład stałej Zero z naszego pakietu Wektory_D. W ten sposób doszliśmy do tego, że pakiet abstrakcji danych można podzielić na trzy logiczne części 1 (Feldman, Koffman, 1996): 1 Są one jednak umieszczone w dwóch plikach - Nazwa.ads, Nazwa.adb. 3

1. Część widoczną, albo publiczną (visible part, public part) dla klienta pakietu określającą logiczny interfejs pomiędzy pakietem, a klientem,. Część prywatną (private part) określającą ten interfejs w pełni, 3. Część implementacyjną (implementation part), która zawiera szczegóły implementacyjne zasobów udostępnianych przez część publiczną. W części widocznej dla klienta nie można deklarować zmiennych typu prywatnego i alokować pamięci dla danych tego typu, ale można deklarować typy, podtypy i nagłówki podprogramów z parametrami typu prywatnego. 3. Typy prywatne ograniczone W niektórych zastosowaniach zdefiniowana wstępnie i udostępniana klientowi relacja równości danych typu prywatnego może być nieodpowiednia. Weźmy dla przykładu ułamki tworzące zbiór liczb wymiernych. Jeżeli zdefiniujemy typ Ulamek następująco: type Ulamek is private; private type Ulamek is record Licznik : Integer; Mianownik : Integer; end record; i jeżeli w programie klienckim zadeklarujemy zmienne A, B : Ulamek; a następnie przy pomocy konstruktora typu Ulamek nadamy im wartości 4/8 i 1/, to relacja A = B jest fałszywa (porównaj definicję danych typu rekordowego), natomiast z matematyki wiadomo (Birkhoff, Mac Lane, 1977, 43), że 4/8= 1/. Stąd wynika, że w przypadku ułamków lepiej zdefiniować własną relację równości. Możemy w tym celu wykorzystać twierdzenie mówiące (Birkhoff, Mac Lane, 1977, 43), że dwa ułamki a/ b i c/ d ( b 0 i d 0 ) są równe wtedy i tylko wtedy, gdy a d= b c. Zadanie 4. Napisać funkcję "=" obliczającą wartość relacji równości dla danych typu Ulamek zdefiniowanego wyżej. Zadanie 5. Napisać procedurę, która konstruuje dane typu Ulamek. Zadanie 6. Napisać funkcję realizującą skracanie ułamka przez największy wspólny dzielnik licznika i mianownika. W tym celu napisać osobną funkcję NWD obliczającą największy wspólny dzielnik dwóch liczb całkowitych. Ponieważ zdefiniowana wstępnie relacja równości nie zawsze jest odpowiednia dla danych typu abstrakcyjnego, możemy w uzasadnionych przypadkach zadeklarować typ abstrakcyjny jako typ prywatny ograniczony (limited private type). W takim przypadku nie ma zdefiniowanych wstępnie żadnych operacji, a więc nawet instrukcji podstawienia i wspomnianej już relacji równości. Wszystkie potrzebne operacje na danych typu prywatnego ograniczonego muszą być zdefiniowane jako odpowiednie podprogramy udostępniane klientowi. Deklaracja typu prywatnego ograniczonego ma postać type Identyfikator_Typu is limited private; -- część publiczna 4

private type Identyfikator_Typu is Opis_Typu; -- część prywatna Przykład. Pakiet Wektory Wymiarowe i program Test_Wektory Wymiarowe. Zadanie obliczeniowe. Napisać i przetestować pakiet implementujący ciało liczb wymiernych. Liczby wymierne mają być reprezentowane jako pary uporządkowane liczb całkowitych, nazywane tu ułamkami. Pakiet ma udostępniać funkcje realizujące operacje arytmetyczne oraz relacje wykonywane na ułamkach. Należy napisać podprogramy, które są konstruktorami ułamków i podprogramy realizujące operacje wejścia/wyjścia dla ułamków. W pakiecie można wykorzystać funkcję NWD w celu skracania ułamków. Działanie pakietu ma testować odpowiedni program kliencki. LITERATURA Barnes, J. (006). Programming in Ada 005. Addison Wesley, Harlow, England. Beidler, J. (1997). Data structures and algorithms. An object-oriented approach using Ada 95. Springer, New York. Birkhoff, G., Mac Lane, S. (1977). A survey of Modern Algebra. Macmillan Publishing, New York (4-th ed.). Feldman M.B., Koffman, E.B. (1996). Ada 95 Problem Solving and Program Design. Addison-Wesley, Reading Massachusetts. 5