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