to get the file

Transkrypt

to get the file
Podstawy Programowania
Instrukcja laboratoryjna
Ćwiczenie piąte: Typy okrojone, wyliczeniowe i zbiory.
Opracował: mgr inż. Arkadiusz Chrobot
1. Wstęp
Typy okrojone służą do zawężania zbioru wartości typów porządkowych. Można
je definiować w sekcji programu lub podprogramu zaczynającej się słowem
kluczowym type:
type
przedzial = 0 .. 5;
Zmienna tego typu możemy zadeklarować w sekcji var programu lub
podprogramu na przykład w ten sposób:
var
x:przedzial;
Możemy również zdefiniować okrojony typ anonimowy, definiując go w miejscu
deklaracji zmiennej, ale nie jest to rozwiązanie poręczne:
var
x: 0 .. 5;
Ponieważ nie istnieje fizyczna (w pamięci komputera) reprezentacja typu
pozwalająca reprezentować tylko sześć wartości, to kompilator na zmienną x
przeznaczy jedną komórkę pamięci i będzie pilnował, żebyśmy nie umieszczali
tam wartości większych niż 5. Jeśli chcemy, aby tak kontrola działała również
w czasie pracy programu, to powinniśmy włączyć dyrektywę R kompilatora,
np.: umieszczając na początku programu zapis {$R+}
Typy wyliczeniowe służą do reprezentowania uporządkowanego zbioru
elementów. Za ich pomocą możemy definiować typy pozwalające reprezentować
np.: nazwy dni tygodnia lub nazwy miesięcy. Wszystkie typy wyliczeniowe są
typami porządkowymi. Jeśli w typie jest n elementów, to pierwszy otrzymuje
numer porządkowy 0, a ostatni n-1. Należy pamiętać o ograniczeniach
zmiennych tego typu (np.: nie można ich wartości wypisywać za pomocą write i
writeln, do elementu pierwszego nie można stosować funkcji pred, a do
ostatniego funkcji succ). Typ wyliczeniowy definiujemy podobnie jak typ
okrojony w sekcji type podprogramu lub programu:
type
dni_robocze = (poniedzialek, wtorek, sroda, czwartek, piatek);
2
Możemy też zdefiniować anonimowy typ wyliczeniowy w miejscu deklaracji
zmiennej, ale nie jest to zalecany sposób:
var
x:(poniedziale, wtorek, sroda, czwartek, piatek);
Typy zbiorowe reprezentują zbiory matematyczne. Operatory mnożenia,
dodawania i odejmowania zamieniają się dla zmiennych tych typów, na
operatory teoriomnogościowe, tzn. operator przekroju, sumy i różnicy zbiorów.
Zmienia się również działanie operatorów relacyjnych. Operator = sprawdza nie
tylko wartości zbiorów, ale również liczbę ich elementów, operatory <=, >= stają
się teraz operatorami zawierania. Oprócz tych operatorów, ze zbiorami możemy
stosować operator in, stwierdzający, czy dany element jest w zbiorze, oraz
procedury include i exclude, które pozwalają umieścić lub usunąć dany element
ze zbioru. Typy zbiorowy możemy zdefiniować w programie lub podprogramie:
type
znaki = set of char;
Należy pamiętać, że typ występujący po słowie kluczowym of nie może mieć
więcej niż 256 wartości. Możemy również zdefiniować anonimowy typ zbiorowy
w miejscu deklaracji zmiennej np.:
var
zz: set of char;
Podobnie jak w przypadku wyżej opisanych typów, nie jest to zalecane
rozwiązanie. Wartości zmiennych typów zbiorowych nie możemy bezpośrednio
wypisywać na ekran, za pomocą write lub writeln. Jeśli chcemy nadać wartość
zmiennej tego typu możemy to uczynić za pomocą tzw. konstruktora zbioru,
czyli umieścić wszystkie elementy, które chcemy by znalazły się w zbiorze w
nawiasach
kwadratowych.
Poszczególne
elementy
należy
rozdzielić
przecinkami.
zz := ['q','l','x','w'];
2. Zadania
We wszystkich zadaniach należy posługiwać się procedurami i/lub
funkcjami z parametrami.
3
1. Zadeklaruj dwie zmienne globalne typu okrojonego, którego wartości
ograniczają się wyłącznie do liter. Spróbuj przekazać te zmienne do
procedury lub funkcji za pomocą parametrów. Sprawdź jakie będą miały
wartości domyślne. Zapisz jakąś dozwoloną wartość do jednej z tych
zmiennych, a następnie przepisz ją z niej do drugiej. Wyświetl te wartości
na ekran. Znajdź różnicę w działaniu programu, kiedy dyrektywa R jest
wyłączona i gdy jest włączona.
2. Napisz program, który zamieni datę napisaną w formacie np.: dzień,
miesiąc, rok, na datę z nazwą miesiąca np.: 2.5.2007 => 2 maja 2007.
3. Wiadomo z matematyki, że funkcja jest odwzorowaniem, które
jednoznacznie przyporządkowuje elementy zbioru zwanego dziedziną na
elementy zbioru zwanego przeciwdziedziną. W programie stwórz dwa
zbioru o elementach typu byte. Jeden będzie dziedziną i będzie zawierał
elementy od 1 do 100, a drugi będzie przeciwdziedziną, Stwórz
procedurę, która będzie udawała funkcję matematyczną y=2*x, tzn, dla
każdego elementu zbioru dziedziny zapisze odpowiadający mu element do
zbioru przeciwdziedziny.
4. Stwórz zbiór elementów typ byte i wypełnij go liczbami od 2 do 255.
Następnie usuń ze zbioru wszystkie wielokrotności 2, 3 i pozostałych
elementów zbioru. Zbiór wynikowy powinien zawierać wyłącznie liczby
pierwsze. Ta metoda znajdowania liczb pierwszych jest nazwana sitem
Eratostenesa.
5. Załóżmy, że chcemy stworzyć własna wersję zbiorów. Przyjmijmy, że
w naszym zbiorze może być maksymalnie 8 elementów. To czy dany
element jest w zbiorze, czy też nie mogłaby sygnalizować wartość
pojedynczego bitu w bajcie (1 – element jest w zbiorze, 0 – brak
elementu). Żeby uniknąć problemów z pamiętaniem, który bit odpowiada
za jaki element, można stworzyć typ wyliczeniowy, w którym będą nazwy
wszystkich możliwych elementów zbioru. Napisz program, w którym
skorzystasz ze zbioru opartego na wyżej opisanym pomyśle.
4