Wstęp do programowania 2



Podobne dokumenty
Wstęp do programowania 2

Ada 95 #1/5 - typy. Typy skalarne. Hierarchia typów w Adzie. Typ znakowy. Typy dyskretne. Plan wykładu

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba.

Podstawy Programowania C++

1. ELEMENTY JĘZYKA PL/SQL

Algorytmy i struktury danych. wykład 1

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Właściwości i metody obiektu Comment Właściwości

Programowanie obiektowe

Wstęp do programowania. Różne różności

PODSTAWY BAZ DANYCH 13. PL/SQL

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Wstęp do programowania

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Bloki anonimowe w PL/SQL

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

Kiedy i czy konieczne?

Definiowanie własnych klas

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Wstęp do programowania 2

Ada-95. Dariusz Wawrzyniak

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

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

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

Struktury Struktura polami struct struct struct struct

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Podstawy algorytmiki i programowania - wykład 4 C-struktury

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Tabela wewnętrzna - definicja

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Programowanie obiektowe

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Programowanie strukturalne

KOTLIN. Język programowania dla Androida

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

VBA praca z makrami w Excelu: piszemy kod! Ulepszamy program! 0. Parę uwag o samym edytorze

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

OPERACJE NA PLIKACH. Podstawowe pojęcia:

C-struktury wykład. Dorota Pylak

Wstęp do programowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

ZASADY PROGRAMOWANIA KOMPUTERÓW

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Baza danych. Baza danych to:

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

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

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

Programowanie obiektowe

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

Informatyka 1. Przetwarzanie tekstów

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

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

20. Pascal i łączenie podprogramów Pascala z programem napisanym w C

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Tworzenie aplikacji w języku Java

Tworzenie bazy danych na przykładzie Access

Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia

Deklaracja struktury w C++

RBD Relacyjne Bazy Danych

Języki i techniki programowania Ćwiczenia 2

Wykład 2: Podstawy Języka

Język PL/SQL. Rozdział 2. Kursory

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

Programowanie obiektowe

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie i struktury danych

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

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

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Bazy danych TERMINOLOGIA

Materiały do laboratorium MS ACCESS BASIC

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

PL/SQL. Zaawansowane tematy PL/SQL

PODSTAWY PROGRAMOWANIA

Algorytmy i struktury danych

Wyzwalacze (triggery) Przykład

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Klasy i obiekty cz II

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Programowanie obiektowe

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

Platformy Programistyczne Podstawy języka Java

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima Uwagi przed sprawdzianem nr 1.

Standard pliku importu danych pracowników i firm do programu e-pity (od wersji e-pity 3.0)

Transkrypt:

Wstęp do programowania 2 wykład 1 rekordy z wyróżnikami Agata Półrola Wydział Matematyki UŁ 2005/2006

Egzamin z I roku - problemy Problemy z wczytywaniem danych: skip_line Problemy z obliczeniami: zerowanie zmiennych konwersja typów

Rekordy z wyróżnikami

Rekordy z wariantami rekordy z wariantami to takie rekordy, których zawartość (tj. liczba i rodzaj składowych) zależą od wartości jednego z pól wyróżnika w rekordzie można wyróżnić części: wyróżnik (discriminant) część stałą (invariant part) część wariantową (variant part)

Przykład type kategoria is (A, B, C, D, E, T); type tablica_kategorii is array (kategoria) of boolean; type osoba (kierowca:boolean) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case;

Część wariantowa musi znajdować się po części stałej składnia przypomina instrukcję case when wartość1 wartość2... wartość_n => pole : typ_pola; when wartość1.. wartość2 => pole : typ_pola; when others => pole : typ_pola; when others => null;

nie można deklarować pól o takich samych nazwach w różnych miejscach instrukcji wyboru type dni_tyg is (pon, wt, sw, czw, pt, sob, nie); type jakis_typ (k:dni_tyg) is record pole1,pole2:integer; case k is when sob nie => pole3 : float; when pon => pole3 : float; pole4 : integer; when others => null; end case; niepoprawne

Deklaracja typu i zmiennych Możliwość pierwsza: bez określania wartości wyróżnika (rekordy ograniczone - constrained records) type osoba (kierowca:boolean) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; deklaracja zmiennej musi określić, jaką wartość ma wyróżnik sasiadka : osoba (false); -- notacja pozycyjna sasiad : osoba (kierowca => true);-- notacja nazywana

nadawanie wartości składowym rekordu jest standardowe: sasiadka.imie := "Kazimiera ; sasiadka.nazwisko:="kowalska "; można też użyć agregatu rekordu i notacji pozycyjnej albo nazywanej: sasiadka:= (false, "Kazimiera ", "Kowalska ", 1955); sasiad := (kierowca=>true, imie=>"jan ", nazwisko=>"kowalski ", rok_urodzenia=>1954, prawo_jazdy=>(true,true,others=>false)); (wartość wyróżnika występuje jeszcze raz w agregacie)

W przypadku powyższej deklaracji wartości wyróżnika nie można zmienić Jeśli chcemy móc modyfikować wartość wyróżnika, musimy nadać mu domyślną wartość w deklaracji typu rekordowego

Rekordy z wariantami: deklaracja typu i zmiennych z określeniem wartości wyróżnika (unconstrained records) type osoba (kierowca:boolean:=false) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; deklaracja zmiennej nie musi zawierać żadnych dodatkowych informacji: sasiadka, sasiad, tesciowa : osoba;

nadawanie wartości składowym rekordu odbywa się jak poprzednio, przy użyciu notacji pozycyjnej albo nazywanej zmiana wartości wyróżnika możliwa jest tylko przy użyciu agregatu rekordu

-- prawidłowy sposób zmiany: tesciowa:=(kierowca=>true, imie=>"kleopatra ", nazwisko=> "Kowalska ", rok_urodzenia=> 1930, prawo_jazdy=>(c D T=>true, others=>false)); -- nieprawidłowo: tesciowa.kierowca :=true; tesciowa.imie:="kleopatra ";

Rekordowi możemy nadać wartość początkową już w chwili deklaracji ciotka_sasiada : osoba := (kierowca=>true, imie=>"eleonora ", nazwisko=>"kowalska ", rok_urodzenia=>1950, prawo_jazdy=>(b=>true,others=>false)); a mimo to pozostaje on rekordem "nie określonym", z możliwością zmiany wartości wyróżnika: ciotka_sasiada := (kierowca=>false, imie=>ciotka_sasiada.imie, nazwisko=>ciotka_sasiada.nazwisko, rok_urodzenia=>ciotka_sasiada.rok_urodzenia);

możliwe jest także nadawanie wartości wyróżnika przez podstawianie całych rekordów narzeczony_jasi : osoba := (true, "Jan ", "Iksinski ", (A B=>true,others=>false)); narzeczony_basi : osoba; -- domyślnie - nie ma prawa jazdy narzeczony_basi := narzeczony_jasi; -- nastąpiła nie tylko zmiana narzeczonego, -- ale i wyróżnika rekordu...

Posiadanie przez wyróżnik wartości domyślnej nie oznacza, że wszystkie zmienne tego typu są bez ograniczenia (unconstrained) możliwa deklaracja zmiennej: niemowlak : osoba (kierowca => false); zadeklarowana w ten sposób zmienna jest z ograniczeniem (constrained), wartość wyróżnika nie może być zmieniona

Cechy rekordów z wariantami wyróżnik rekordu traktowany jest jak normalne pole, można się do niego odwoływać: if sasiad.kierowca=true then... próby odwołania do nie istniejących przy danej wartości wyróżnika pól powodują wystąpienie błędu Constraint_Error

Atrybut constrained atrybut 'Constrained (sposób użycia: zmienna'constrained) przyjmuje wartość true, gdy dany rekord jest "określony" (constrained - nie można zmienić wartości jego wyróżnika), a false - w przeciwnym przypadku. if not ktos'constrained then ktos:=(kierowca=>...,...); end if; -- zmiana wartości wyróżnika tylko wtedy, gdy jest to możliwe, -- mimo ew. ostrzeżeń w czasie kompilacji -- nie będzie błędu wykonania

Typy rekordowe z wieloma wyróżnikami Można deklarować typy rekordowe z wariantami posiadające więcej niż jeden wyróżnik. Mogą one jednak posiadać tylko jedną część wariantową; kolejne konstrukcje case mogą być w niej zagnieżdżone. Przy ich tworzeniu obowiązują dotychczasow zasady

-- nieprawidłowa definicja -- dwie części wariantowe type osoba1 (plec:p; kierowca:boolean) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case plec is when K => nazwisko_panienskie: string(1..10):=(others=>' '); when M =>null; end case; case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case;

-- nieprawidłowa definicja - powtarzające się nazwy pól type osoba2 (plec:p; kierowca:boolean) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case plec is when K => nazwisko_panienskie: string(1..10):=(others=>' '); case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; when M => case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; end case;

-- definicja prawidlowa type osoba2 (plec:p; kierowca:boolean) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case plec is when K => nazwisko_panienskie: string(1..10):=(others=>' '); case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; when M => case kierowca is when true => pj: tablica_kategorii; when false => null; end case; end case;

type osoba1 (plec:p; kierowca:boolean) is record dane : os(plec); case kierowca is when true => prawo_jazdy: tablica_kategorii; when false => null; end case; Jak to zadeklarować ładniej type os (pl: p) is record imie, nazwisko: string (1..10):=(others=>' '); rok_urodzenia: positive; case pl is when K => nazwisko_panienskie: string(1..10):=(others=>' '); when M =>null; end case;

Jeśli wyróżniki niezależne... (dość ładnie bez sztuczek) type pies (rasowy:boolean; medalista:boolean) is record imie:string(1..10); wlasciciel:string(1..20); case rasowy is when true => rodzaj: rodzaj_psa; rasa: string(1..10); case medalista is when true => ilosc_medali:positive; when false => null; end case; when false=> null; end case;

Agregaty rekordów pies1 : pies := (rasowy=>false, medalista=>false, imie=>"azor ", wlasciciel=>"jan Kowalski "); pies2 : pies := (rasowy=>false, medalista=>true, imie=>"burek ", wlasciciel=>"jan Kowalski "); pies3 : pies := (rasowy=>true, medalista=>false, imie=>"cezar ", wlasciciel=>"jan Kowalski ", rodzaj=>mysliwski, rasa=>"foksterier"); pies4 : pies:= (rasowy=>true, medalista=>true, imie=>"funia ",wlasciciel=>"jan Kowalski ", rodzaj=>pokojowy, rasa=>"pekinczyk ", ilosc_medali=>10);

W przypadku wielu wyróżników także możemy deklarować rekordy z ograniczeniem i bez ograniczenia Jeśli jeden wyróżnik ma wartość domyślną, muszą mieć ją również pozostałe

Inne zastosowanie wyróżników rekordy ze składowymi o zmiennym rozmiarze Innym zastosowaniem wyróżników jest określanie za ich pomocą rozmiaru składowych rekordu, np. długości łańcucha czy rozmiaru tablicy

type dane (dl_nazwy:positive) is record zaklad_pracy:string(1..dl_nazwy); rok_zalozenia: positive; type osoba is record imie, nazwisko:string(1..10); rok_ur:positive; type tabela_pracownikow is array (positive range <>) of osoba; type firma (il_pracownikow:positive) is record nazwa_firmy : string(1..20); zatrudnieni : tabela_pracownikow (1..il_pracownikow);

W obu przykładach jedno z pól rekordu należy do niezawężonego typu tablicowego. Jeśli wyróżnik nie ma wartości domyślnej, to musimy podać ją przy deklaracji zmiennej zaklad1 : dane(dl_nazwy=>50); zaklad2 : dane(20); zaklad3 : dane := (dl_nazwy=>13, zaklad_pracy=>"wks Mostostal", rok_zalozenia=> 1974); powyższe zmienne nie mogą zmieniać wartości wyróżnika, a więc i rozmiaru swoich składowych (są z ograniczeniem )

type dane (dl_nazwy:positive:=20) is record zaklad_pracy:string(1..dl_nazwy); rok_zalozenia: positive; jeżeli wyróżnik ma wartość domyślną, to możliwe są dwa rodzaje deklaracji: zmienne z ograniczeniem: zaklad1 : dane(dl_nazwy=>50); zaklad2 : dane(20); zmienne bez ograniczenia zaklad3 : dane; -- domyślna wartość wyróżnika - 20 zaklad4 : dane:= (dl_nazwy=>13, zaklad_pracy=>"wks Mostostal", zaklad3 := zaklad4; -- zmiana długości z 10 na 13 rok_zalozenia=> 1974);

podobnie jak poprzednio wyróżników może być więcej niż jeden. Mogą się one odnosić do tego samego lub do różnych pól rekordu.

type tabela_pracownikow is array (positive range <>) of osoba; type firma (dl_nazwy,il_pracownikow:positive) is record nazwa_firmy : string(1..dl_nazwy); zatrudnieni : tabela_pracownikow (1..il_pracownikow); f1 : firma(dl_nazwy=>3, il_pracownikow=>10); f2 : firma(12,5);

Inne zastosowanie wyróżników inicjowanie wartości pola rekordu type ograniczenie (predkosc:natural) is record max_predkosc : natural := predkosc; obszar_zabudowany : ograniczenie(60);... put (obszar_zabudowany.max_predkosc); -- wypisze 60 obszar_zabudowany.max_predkosc:=50; put (obszar_zabudowany.max_predkosc); -- wypisze 50

Inne zastosowanie wyróżników określenie pola rekordu będącego polem definiowanego rekordu type tabela_pracownikow is array (positive range <>) of osoba; type firma (il_pracownikow:positive) is record nazwa_firmy : string(1..20); zatrudnieni : tabela_pracownikow (1..il_pracownikow); type pracodawca (ilosc_zatrudnionych:natural) is record imie,nazwisko : string(1..10); jego_firma : firma(ilosc_zatrudnionych);

Inne zastosowanie wyróżników tworzenie rekordów o polach zachowujących się jak stałe type plec is (M, K); -- plec i rok urodzenia nie moga sie zmienic, -- waga i wzrost - tak type czlowiek (p: plec;rok_urodzenia:positive) is record waga, wzrost: positive; Iksinski:czlowiek(p=>M, rok_urodzenia=>1966);... -- niedozwolone Iksinski:=(p=>M, rok_urodzenia=>1965, wzrost=>187, waga=>99);