W13 Typ rekordowy ------------- Często okazuje się, że mamy kilka zmiennych różnych typów opisujących jeden obiekt. Na przykład Imię, Nazwisko, RokUrodzenia i Płeć opisują jedną osobę. Można używać kilku zmiennych, ale wtedy nie podkreślamy, że te zmienne opisują jeden obiekt. W Pascalu możemy takie zmienne zgrupować w jedną paczkę, używając rekordów. Rekord jest po prostu paczką zawierającą wiele zmiennych nazywanych polami. Składnia deklaracji typu rekordowego jest następująca: record <pole> : <Typ>; <pole> : <Typ>; ... <pole> : <Typ>; {; w tym miejscu nie jest obowiązkowy} end Jeśli kilka pól ma ten sam typ, to można ich deklarację zapisać nieco krócej: <pole>, <pole>, ..., <pole>: <Typ>; (diagramy składniowe można znaleźć np. w dużym Wirth'cie) Oto przykład deklaracji dla wspomnianych uprzednio zmiennych opisujących osobę: type TOsoba = record Imię : String[15]; Nazwisko : String[40]; RokUr : 1900..2100; Płeć : (Kobieta, Mężczyzna) end; Do poszczególnych pól rekordu odwołujemy się pisząc nazwę rekordu, kropkę i nazwę pola, np. przy powyższej deklaracji: var Osoba: TOsoba; begin {...} Osoba.Imię := 'Jan'; Osoba.Nazwisko := 'Kowalski'; Osoba.Staż := 1975; Osoba.Płeć := Mężczyzna; {...} end. Jeśli w ciągu instrukcji wielokrotnie odwołujemy się do tego samego rekordu można użyć instrukcji with, tak jak w poniższym przykładzie: var Osoba: TOsoba; begin {...} with Osoba do begin Imię := 'Jan'; Nazwisko := 'Kowalski'; RokUr := 1975; Płeć := Mężczyzna; end; {...} end. Rekordy a tablice: W przypadku rekordów trzeba określić już w czasie kompilacji, do którego pola rekordu chcemy się odwoływać (w przypadku tablic można było dopiero w czasie wykonywania programu określić indeks elementu tablicy). Z kolei w tablicy wszystkie elementy muszą mieć ten sam typ. -----> program zbiory.pas -----> Ew. przykład z kolejką (nie mam tu treści) =================================================================================== Typ zbiorowy ------------ - bardzo ograniczona reprezentacja zbiorów - set of <typ prosty> - przykłady set of 0..30; set of char; - stałe typu zbiorowego [ ] [ '0', '2', '4', '6', '8' ] [ '0'..'9' ] [ 'a'..'z', 'A'..'Z'] - zmienne są na poczatku niezainicjowane (jak zawsze!), w szczególności NIE są na początku pustymi zbiorami - operacje *, +, - (przecięcie, suma, różnica) in (operator zawierania) (priorytety: *; +,-; in) - ograniczenia: implementacja określa zakres dozwolonych wartości, zwykle b. mały - możliwa implementacja (wektor charakterystyczny) - przykłady a) {Sprawdzenie czy znak c jest literą} if c in ['a'..'z', 'A'..'Z'] then .... b) var s: set of char; c: char; begin {Obliczenie zbioru znaków w wczytywanym z wejścia napisie zakończonym znakiem $} s := [ ]; repeat read(c); if UpCase(c) in ['A'..'Z'] then s := s + [UpCase(c)]; until c = '$'; for c := 'A' to 'Z' do if c in s then write(c:2); end. {Uwaga: operacja UpCase nie jest standardowa, ale występuje w wielu implementacjach Pascala}