Kurs Pascala

Download Report

Transcript Kurs Pascala

Materiały do zajęć z przedmiotu: Narzędzia i języki programowania

Programowanie w języku PASCAL

Część 6: Tablice, rekordy, zbiory © Jan Kaczmarek

Typy strukturalne

Typy strukturalne są używane do opisu obiektów złożonych, tzn. takich, które w danym momencie przechowują nie jedną, ale kolekcję wielu wartości.

Typy strukturalne definiuje się na podstawie pewnych schematów strukturalizacji podając typy składowych i metodę strukturalizacji, określającą mechanizm dostępu do danych elementów struktury.

W Pascalu mamy cztery rodzaje struktur: - tablice – opisywane typami tablicowymi - rekordy – opisywane typami rekordowymi - zbiory – opisywane typami zbiorowymi - pliki – opisywane typami plikowymi

Tablice

Tablica składa się z elementów jednakowego typu, przy czym każdy element tablicy może być jawnie nazwany (wskazany), a liczbę elementów ustala się w chwili opisywania (deklarowania) tablicy i nie można tej liczby zmienić.

Tablica posiada regularną strukturę i dlatego jest używana do reprezentowania regularnych układów danych, np. wektorów: -4 6 12 -3 0 10 2 4 lub macierzy: 8 9 2 7 9 5 5 7 1 5 6 3 3 5 3 7 8 10 2 1 1 9 4 4 7 5 3 2 11 3 2 1 0 6 2 9 2 5 9 8 12 1

Typy tablicowe

Definicja typu tablicowego ma postać:

type identyfikator-typu = array [typy-indek sów] of typ-bazowy;

gdzie: typy indeksów – oddzielone przecinkami opisy typów porządkowych (najczęściej wykorzystuje się tu typy okrojone lub wyliczeniowe) typ-bazowy – dowolny typ prosty lub strukturalny.

Rozmiar tablicy ustalony jest na etapie kompilacji.

Przykłady:

type

wektor =

array

macierz =

array

[1..10]

of

integer; [-10..10, 1..8]

of

real; tab1 =

array

[5..8, Boolean]

of

byte; tab2 =

array

[1..5]

of array

tablica =

array

[1..5, 1..20] [1..20]

of of

real; real; //10 elementów //168 elementów //8 elementów //100 elementów //100 elementów

var

T1: macierz; T2:

array

[1..20]

of

byte; //deklaracja tablicy typu macierz //deklaracja tablicy 20 elementów typu byte

Dla tablic metoda dostępu do danych nazywa się

indeksowaniem

. Indeksem może być dowolne wyrażenie zgodne z odpowiadającym mu na danej pozycji typem indeksu podanym w definicji typu tablicowego.

Wartości indeksów są wyliczane w chwili odwołania się do elementu tablicy.

Przykłady: T1[3, 7] := 2.5; T1[3][7] := 2.5; T2[5] := 5;

var

T1 : macierz; i, j : integer;

begin end

.

//wczytywanie danych do tablicy

for for

i:=-10 j:=1

to to

8 10

do do begin

write (‘kolejny element = ’); readln (T1[i, j]);

end

;

program

suma; {program znajdowania sumy n elementów jednowymiarowej tablicy A} {$APPTYPE CONSOLE} uses SysUtils;

var

n, i : integer; suma : real; A : array [1..100] of real; //tablica A ma co najwyżej 100 elementów

begin

write (‘podaj n: ‘); readln (n);

for

i:=1

to

n

do

//1<=n<=100 //wczytywanie elementów tablicy A

begin

write ( ’podaj A[’, i, ’] =’); readln (A[i]);

end

; suma := 0;

for

i:=1

to

n

do

suma := suma+A[i]; write (’suma = ’ , suma); readln;

end.

program

maximum; {program znajdowania największego elementu w tablicy A} {$APPTYPE CONSOLE} uses SysUtils;

var

n, i : integer; max : real; A : array [1..100] of real; //tablica A ma co najwyżej 100 elementów

begin

write (‘podaj n: ‘); readln (n);

for

i:=1

to

n

do

//1<=n<=100 //wczytywanie elementów tablicy A

begin

write ( ’podaj A[’, i, ’] =’); readln (A[i]);

end

; max := A[1];

for

i:=2

to

n

do if

A[i]>max

then

max := A[i]; write (’najwiekszy element = ’ , max); readln;

end.

Rekordy

Rekordem nazywamy złożoną strukturę danych, której elementy, zwane polami, mogą być (w odróżnieniu od tablic) różnych typów (prostych lub strukturalnych). Pola muszą mieć różne identyfikatory, a ich ilość jest z góry ustalona.

Rekord posiada strukturę używaną do reprezentowania układów różnego typu danych, tworzących pewne całości: Nr indeksu D123456 Miejscowość Poznań Kierunek studiów informatyka Pesel 88021601123 Imię Nazwisko Adam Kowalski Adres Rok NIP ul. Mickiewicza 22 m. 3 Semestr 3 Z Telefon 777-888-23-24 (61) 8765432

Typy rekordowe

Definicja typu rekordowego ma postać:

type identyfikator-typu = record lista-deklaracji pól; end;

gdzie lista-deklaracji pól ma postać:

lista identyfikatorów-pól : opis-typu;

Ostatnie pole może być polem wariantowym postaci:

case pole wyróżnikowe of wykaz-wariantów;

gdzie pole wyróżnikowe może być identyfikatorem typu porządkowego lub deklaracją zmiennej porządkowej wykaz wariantów ma postać:

lista-etykiet-wyboru : (lista-deklaracji pól)

Przykład:

type

data =

record

dzien : 1..31; //typ rekordowy //typ okrojony miesiac : 1..12; rok : integer;

end

; rodzaj = (ciezarowy, osobowy); pojazd =

record

marka, kolor : string[20]; //typ wyliczeniowy //typ rekordowy data_rejestracji : data;

case

typ : rodzaj

of

//pole wariantowe ciezarowy : (ladownosc : real); osobowy : (ilosc_osob : byte);

end

;

var

auto : pojazd; //deklaracja zmiennej rekordowej

Metody dostępu do pól rekordów

-

kwalifikowanie

za pomocą

selektora

, który ma postać:

identyfikator-rekordu.identyfikator-pola

gdzie identyfikator-rekordu to zmienna rekordowa Uwaga! Kropka oddziela nazwę zmiennej rekordowej od identyfikatora pola. -

instrukcja wiążąca

postaci:

with lista-zmiennych do instrukcja;

Umieszczenie zmiennej rekordowej na liście-zmiennych oznacza, że do pól tej zmiennej można odwoływać się wewnątrz instrukcji wiążącej za pomocą samych identyfikatorów pól. Identyfikatory te są traktowane w instrukcji wewnętrznej tak, jak zmienne.

Instrukcja

with

zagnieżdżonej z1, z2, ..., zn

do

instrukcja; jest równoważna instrukcji

with

z1

do with

z2

do

..............

with

zn

do

instrukcja;

Przykłady: auto.marka := ’Ford’; auto.data_rejestracji.dzien := 4; auto.data_rejestracji.miesiac := 6; auto.data_rejestracji.rok := 2007;

with

auto

do begin

marka := ’Ford’; data_rejestracji.dzien := 4; data_rejestracji.miesiac := 6; data_rejestracji.rok := 2007;

end

;

with

auto.data_rejestracji, auto

do begin

marka := ’Ford’; dzien := 4; miesiac := 6; rok := 2007;

end

;

Zbiory

Zbiory wraz z operacjami na nich zdefiniowanymi umożliwiają zapis obliczeń teoriomnogościowych.

Struktury te mają jednak zastosowanie w ograniczonym zakresie.

Każdy zbiór jest zbiorem wszystkich podzbiorów (tzw. zbiorem potęgowym), łącznie ze zbiorem pustym, typu bazowego. Typ bazowy musi być typem porządkowym o maksymalnie 256 elementach (liczby porządkowe elementów muszą być z przedziału 0-255).

Przykład: Typ bazowy = {a, b, c} Zbiór = {[ ], [a], [b], [c], [a,b], [a,c], [b,c], [a,b,c]}

Typy zbiorowe

Definicja typu zbiorowego ma postać:

type identyfikator-typu = set of typ porządkowy;

Zmienne tego typu zajmują od 1 do 32 bajtów.

Ilość zajmowanych bajtów = ord(max) div 8 – ord(min) div 8 + 1.

Konstruktor zbioru ma postać [ ].

Przykłady:

type

pory_roku = (wiosna, lato, jesien, zima); pory = litery =

set of

liczby =

set of set of

pory_roku; 1..8; ’a’..’z’; //typ wyliczeniowy //typ bazowy – pory_roku //typ bazowy – 1..8 //typ bazowy – ’a’..’z’

var

Z1 : pory; //1 bajt Z2 : liczby; Z3 : litery; Z1 := [ ]; Z1 := [lato, zima]; //2 bajty //4 bajty ord( ’z’)=122, ord(’a’)=97 //przykłady podstawień Z2 := [1, 2, 5]; Z3 := [’a’..’d’];

Wartości zmiennych typu zbiorowego

nie można wypisać

sposób przy pomocy instrukcji write, writeln.

w standardowy Na zmiennych zbiorowych można wykonywać operacje teoriomnogościowe.

Operatory teoriomnogościowe

operator ---------------------------------------------------------------------------------------------------- + – * suma zbiorów różnica zbiorów iloczyn zbiorów typ zbiorowy typ zbiorowy typ zbiorowy typ zbiorowy typ zbiorowy typ zbiorowy <= jest zawarty, jest podzbiorem typ zbiorowy Boolean >= = <>

in

operacja argumenty wynik zawiera, jest nadzbiorem typ zbiorowy Boolean równy różny typ zbiorowy typ zbiorowy Boolean Boolean należy, jest elementem typ bazowy, zbiór Boolean

Przykład:

var

z1, z2, zw :

set of

(a, b, c, d); w : Boolean;

begin

z1 := [a..c]; z2 := [a, b]; zw := z1+ z2; zw := z1+ [d]; zw := z1 – z2; zw := z1 – [c]; zw :=z1*z2; zw := z1+ [ ] w := a in z1; w := z1<= [a, c]

end

.

// zw=[a, b, c] // zw=[a, b, c, d] // zw=[c] // zw=[a, b] // zw=[a, b] // zw=z1 // w=true // w=false