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}