Typ wyliczeniowy. Wszystkie typy danych i najczęściej używany typ wyliczeniowy Pascala

Typ wyliczeniowy jest określany bezpośrednio przez wyliczenie wszystkich wartości, które może przyjąć zmienna. tego typu. Każda wartość jest stałą swojego typu i może należeć tylko do jednego z wyliczonych typów zdefiniowanych w programie. Typ wyliczeniowy jest opisany w sekcji deklaracji typu, która zaczyna się od słowa kluczowego type. Każda wartość jest nazwana przez jakiś identyfikator i znajduje się na liście ujętej w nawiasy, na przykład:

Typ Kolory = (czerwony, biały, niebieski); Dni = (pon., wt., śr., czw., pt., sob., niedz.);

Programista łączy w jedną grupę, zgodnie z jakąś cechą, cały zestaw wartości składających się na typ wyliczeniowy. Użycie typów wyliczeniowych sprawia, że ​​programy są bardziej czytelne. Typy wyliczeniowe zwiększają niezawodność programów poprzez możliwość kontrolowania wartości, które otrzymują odpowiednie zmienne.

Zmienne dowolnego typu wyliczeniowego można deklarować bez uprzedniego deklarowania tego typu, na przykład:

Var TextColor: (czarny, biały, zielony);

Wartości w typie wyliczeniowym są stałymi. Działania na nich podlegają regułom obowiązującym dla stałych. Są one numerowane począwszy od 0 w kolejności, w jakiej pojawiają się w opisie. Operatory relacji mają zastosowanie do wszystkich typów wyliczeniowych (jeśli oba operandy są tego samego typu). Kolejność jest ustalana przez kolejność wyliczania stałych.

Dla argumentów typów porządkowych istnieją następujące predefiniowane funkcje:

  • succ(X) - obok X
  • pred(X) - poprzedni X
  • ord(X) – liczba porządkowa X

Dozwolona jest również konwersja odwrotna: dowolne wyrażenie typu WORD można zamienić na wartość typu wyliczeniowego, o ile wartość wyrażenia typu integer nie przekracza liczności typu wyliczeniowego. Ta konwersja jest realizowana przy użyciu automatycznie zadeklarowanej funkcji z wyliczoną nazwą typu.

Do programu można również wprowadzać zmienne dowolnego typu, które nie pasują do żadnego ze standardowych typów. Taki typ jest określony przez wyliczenie wartości w deklaracji typu; dowolną z tych wartości może przyjąć zmienna tego typu zadeklarowana w dalszej części programu. Ogólna postać opisu typu wyliczeniowego:

wpisz nm = (słowo1, słowo2, …, słowoN) ; varw:nm;

tutaj nm to identyfikator typu (dowolny), słowo1, słowo2… to konkretne wartości, które może przyjąć zmienna w należąca do typu nm. Wartości tego typu uważane są za uporządkowane, tj. deklaracja typu wprowadza jednocześnie porządek word1< word2 < wordN. Порядковые значения отсчитываются с 0.

Funkcje ord, pred, succ oraz procedury inc i dec można zastosować do zmiennych typu enum.

Operacje relacyjne mają zastosowanie do wszystkich zmiennych tego samego typu skalarnego: =,<>, <=, >=, <, >.

Cechą zmiennych typu enum jest to, że ich wartości nie można wprowadzić z klawiatury i wyświetlić na ekranie (ale można je wykorzystać podczas pracy z wpisywanymi plikami).

Przykład 1. typ color = (czerwony, żółty, zielony, niebieski);
Określa się tutaj, że czerwony< yellow < green < blue. Переменная типа color может принимать одно из перечисленных значений.

funkcja succ(x)

Biorąc pod uwagę element x, określana jest uporządkowana sekwencja, do której należy x, i zwracany jest element następujący po x w tej sekwencji.

Przykład 2. Niech ciąg liter zostanie podany w porządku alfabetycznym. Wtedy succ(A) to B; succ(L) to M i tak dalej.

Na przykład 1, succ(red) jest żółte.

funkcja pred(x)

Biorąc pod uwagę element x, określana jest sekwencja, do której należy x, i zwracany jest poprzedni element tej sekwencji.

Przykład 3. pred(F) to E; pred(Z) to Y i tak dalej.

ord(x) funkcja

Zwracany jest numer elementu x w sekwencji.

Przykład 4. ord(czerwony) to 0, a ord(zielony) to 2.


Algorytm języka Pascal jest skonstruowany w taki sposób, że aby operować na zmiennych, zazwyczaj trzeba określić ich typ. Ponadto opis typu dla każdej zmiennej musi być wykonany przed wykonaniem programu (w sekcji var). Oznacza to, że po uruchomieniu kompilatora program najpierw otrzymuje informację o tym, z jakimi typami danych będzie pracował, a dopiero potem wykonuje jakiekolwiek działania.
Tak więc w Pascalu istnieją 3 główne typy: prosty, strukturalny i wskaźnikowy. Jednak każdy typ ma swoje własne podtypy. Dla wygody wymieniono wszystkie typy danych.

Każdy typ ma swój własny zakres wartości. Poniżej zakresy dla prosty typ

Najczęściej stosowane typy liczba całkowita,prawdziwy,długi,bajt,strunowy,logiczna I zwęglać ponieważ zwykle w zadaniach nie jest wskazane, które konkretne typy należy zastosować do rozwiązania. Zachowaj ostrożność podczas używania typów i uważnie obserwuj dozwolone zakresy dla każdego typu. Na przykład liczbom ułamkowym nie można przypisać typu całkowitego, a typu char może być tylko jeden znak (na przykład zmienna f:=gfgfgf nie może być typu char)
Teraz o tym, jak opisać typ. Jak wspomniano powyżej, operatorom przypisywany jest typ na samym początku programu (można nawet powiedzieć, że przed startem programu). Tak więc typy są opisane w sekcji var, która znajduje się przed początkiem programu (czyli przed rozpoczęciem). Rozważ prosty przykład
varx,u,yu,i:liczba całkowita;
s,f:rzeczywiste;
g: ciąg;
zaczynać
....
koniec. Jak widać na przykładzie, szablon opisu typu wygląda następująco
operator1, operator2: typ; Jak już zauważyłeś, nie ma potrzeby opisywania każdego operatora, jeśli typ jest ogólny, wystarczy wymienić je oddzielone przecinkami. Nie ma również potrzeby przechodzenia do nowej linii po każdym typie, robi się to tutaj po prostu dla łatwiejszego czytania kodu. Ogólnie kod powinien być czytelny i dobrze postrzegany, dlatego zaleca się łączenie operatorów typów ogólnych i pisanie każdego typu od nowej linii.

Opis i zastosowanie

Typ wyliczeniowy jest zdefiniowany jako zestaw identyfikatorów, które z punktu widzenia języka pełnią taką samą rolę jak zwykłe nazwane stałe, ale są powiązane z tym typem. Klasyczny opis typu wyliczeniowego w Pascalu wygląda następująco:

Typ Cardsuit = (trefl, karo, kier, pik) ;

Tutaj deklarowany jest typ danych Cardsuit, którego wartością może być dowolna z czterech wymienionych stałych. Zmienna typu Cardsuit może przyjmować jedną z wartości trefl, karo, kier, pik, dozwolone jest porównywanie wartości typu wyliczeniowego dla równości lub nierówności, a także używanie ich w instrukcjach selekcji (w przypadku Pascala) jako wartości identyfikujące opcje.

Używanie wyliczeń pozwala ci to zrobić kody źródłowe programy są bardziej czytelne, ponieważ pozwalają zastąpić „magiczne liczby”, które kodują określone wartości, czytelnymi nazwami.

Na podstawie wyliczeń w niektórych językach można tworzyć zestawy czcionek. W takich przypadkach zbiór jest rozumiany (i opisywany) jako nieuporządkowany zbiór unikalnych wartości typu wyliczeniowego.

Typ wyliczeniowy może być stosowany w deklaracjach zmiennych i parametrach formalnych funkcji (procedur, metod). Wartości typu wyliczeniowego mogą być przypisane do odpowiednich zmiennych i przekazywane przez parametry odpowiednich typów w funkcjach. Ponadto zawsze obsługiwane jest porównywanie wyliczonych wartości dla równości i nierówności. Niektóre języki obsługują również inne operatory porównania dla wartości typów wyliczeniowych. O wyniku porównania dwóch wyliczonych wartości w takich przypadkach decyduje z reguły kolejność tych wartości w deklaracji typu – wartość, która występuje wcześniej w deklaracji typu, uważana jest za „mniejszą” od wartości, która następuje później. Czasami typ wyliczeniowy lub pewien zakres wartości typu wyliczeniowego może być również użyty jako typ indeksu dla tablicy. W tym przypadku w tablicy jest jeden element dla każdej wartości wybranego zakresu i prawdziwy porządek kolejność elementów odpowiada kolejności wartości w deklaracji typu.

Realizacja

Zwykle podczas kompilacji wartości wyliczeniowe są reprezentowane za pomocą liczb całkowitych. W zależności od konkretnego języka programowania taka reprezentacja może być albo całkowicie ukryta przed programistą, albo dostępna dla niego za pomocą pewnych „obejść” (na przykład wymuszona konwersja wartości typu enum na wartość typu „integer”) lub nawet kontrolowane przez programistę (w takich przypadkach programista ma możliwość jednoznacznego określenia jakimi liczbami zostaną zakodowane wszystkie lub niektóre wartości typu enum. Wszystkie opcje mają swoje pozytywy i negatywy. Z jednej strony możliwość posługiwania się wartościami liczbowymi stałych składających się na typ wyliczeniowy, zwłaszcza gdy jest on nadużywany, pozbawia możliwości korzystania z tych typów i stwarza niebezpieczeństwo błędów (przy stosowaniu wartości liczbowych do którym nie ma odpowiednich stałych w typie). Z drugiej strony jawne zarządzanie wartością zapewnia pewne dodatkowe funkcje. Na przykład pozwala na użycie typów wyliczeniowych podczas organizowania interfejsu z modułami napisanymi w innych językach, jeśli używają lub zwracają wartości zakodowane w liczbach całkowitych z jakiegoś predefiniowanego zestawu.

Inną możliwością zapewnianą przez typy wyliczeniowe na poziomie implementacji języka jest oszczędzanie pamięci. Przy małym typie wyliczeniowym wystarczy kilka bitów, aby zapisać wartość tego typu (powyższy typ Cardsuit wymaga tylko dwóch bitów na wartość, podczas gdy standardowa liczba całkowita na większości używanych architektur zajmuje 32 bity - 16 razy więcej), a kompilator może wykorzystać ten fakt do zagęszczenia przechowywania danych w pamięci. Może to być szczególnie ważne, jeśli w jednym rekordzie przechowywanych jest wiele wartości typów wyliczeniowych – kompaktowanie rekordów podczas przetwarzania dużej ich liczby może zwolnić dużo pamięci. Należy jednak zauważyć, że kompilatory zwykle nie implementują tej funkcji, przynajmniej w ostatnich czasach, kiedy pamięć komputera stała się znacznie tańsza.

Krytyka

Typ wyliczeniowy jest tradycyjny dla rozwiniętych języków programowania, jest używany dość powszechnie i często jest traktowany jako coś oczywistego. Jednak ten typ również nie jest pozbawiony krytyki ze strony teoretyków i praktyków programowania. Tak więc, podczas opracowywania języka programowania Oberon, wyliczone typy zostały uwzględnione na liście funkcji, które zostały usunięte z języka. Niklaus Wirth, projektant języka, podał następujące powody:

Z drugiej strony, na przykład w Javie, która początkowo nie zawierała typu wyliczeniowego, typ ten został później wprowadzony ze względu nie tylko na wygodę, ale i niezawodność: problem używania grup nazwanych stałych zamiast wyliczeń polega na tym, że brak jest kontroli ze strony kompilatora co do jednoznaczności wartości stałych, jak również możliwości losowego przypisania wartości do zmiennych, które nie odpowiadają żadnej z tych stałych.

Opis wyliczeń w różnych językach

Ada

Enum cardsuit ( trefl, karo, kier, pik ) ;

Dynamiczne, słabo typowane języki o składni podobnej do C (np. Perl czy JavaScript) generalnie nie mają wyliczeń.

C++

C#

Enum Cardsuit (trefl, karo, pik, kier);

Jawa

Enum Cardsuit (trefl, karo, pik, kier)

Haskella

W niektórych językach programowania (np. Haskell) wyliczenia można emulować za pomocą typów algebraicznych. Na przykład typ boolowski zawierający dwa identyfikatory reprezentujące wartości prawdy jest kodowany w następujący sposób:

Dane Bool = Fałsz | PRAWDA

Notatki


Fundacja Wikimedia. 2010 .

Wikipedii

Z przyczyn technicznych Bool przekierowuje tutaj. Możesz przeczytać o Bool tutaj: stdbool.h. Boolean (ang. Boolean lub logiczny typ danych) to prymitywny typ danych w informatyce, który może przyjąć dwa możliwe ... Wikipedia

W teorii programowania każdy typ, którego wartościami są wartości innego typu, jest opakowany w konstruktory typu algebraicznego. Innymi słowy, algebraiczny typ danych ma zestaw konstruktorów typów, z których każdy ... ... Wikipedia

Integer, typ danych typu integer (angielski Integer), w informatyce jeden z najprostszych i najczęściej spotykanych typów danych w językach programowania. Służy do reprezentowania liczb całkowitych. Zbiór liczb tego typu to ... ... Wikipedia

Typ pierwotny (wbudowany, podstawowy) to typ danych dostarczany przez język programowania jako podstawowa wbudowana jednostka języka. W zależności od języka i jego implementacji zestaw takich typów może się znacznie różnić. Określa to ... ... Wikipedia

Ten termin ma inne znaczenie, patrz Set (znaczenia). Zestaw jest typem i strukturą danych w informatyce, jest implementacją zestawu obiektów matematycznych. Ustaw typ danych pozwala przechowywać ograniczoną liczbę wartości... ... Wikipedia

Niektóre języki programowania zapewniają specjalny typ danych dla liczb zespolonych. Obecność wbudowanego typu upraszcza przechowywanie złożonych wartości i obliczeń na nich. Spis treści 1 Arytmetyka ponad złożona 2 Wsparcie w językach ... Wikipedia

Aby poprawić ten artykuł technologia informacyjna pożądane?: Znajdź i ułóż w formie przypisów linki do autorytatywnych źródeł, które potwierdzają to, co jest napisane. Po odłożeniu przypisów, popraw dokładniej w ... Wikipedii

Jak zorganizowany jest wyliczeniowy i interwałowy typ danych Pascala? Każdy ustrukturyzowany typ danych w języku Pascal charakteryzuje się zbiorem jego elementów składowych. Stała lub zmienna tego typu zawsze zawiera kilka składników, z których każdy może być również typu strukturalnego. Przypomina nam to zagnieżdżanie typów.

Język Pascal obejmuje następujące typy strukturalne: łańcuchy znaków, tablice, rekordy, zbiory, pliki. Ale zanim przejdziemy do badania tych typów, rozważymy dwa porządkowe typy danych - wyliczone i interwałowe.

Typ wyliczeniowy Pascala:

wyliczeniowy typ danych jest uporządkowaną sekwencją stałych skalarnych, które tworzą ten typ. Jako wartość każdej ze stałych używamy jej nazwy. Nazwy różnych stałych są oddzielone przecinkami, a zestaw stałych, które mają typ wyliczeniowy, jest umieszczony w nawiasach okrągłych.

W procesie tworzenia programu może zaistnieć potrzeba połączenia w jedną grupę, według jakiegoś kryterium, zbioru wartości typu wyliczeniowego. Na przykład typ wyliczeniowy ZnakZodiaka (Znak zodiaku) zawiera wartości skalarne Piekarnik, Strelec, Kozerog, Bliznecy, Vesy (Baran, Strzelec, Koziorożec, Bliźnięta, Waga); typ wyliczeniowy Planeta (Planeta) łączy wartości skalarne Merkury, Wenera, Ziemia, Mars (Merkury, Wenus, Ziemia, Mars). Wyliczona deklaracja typu występuje w sekcji deklaracji typu:

ZnakZodiaka=(Piekarnik,Strelec,Kozerog,Bliznecy,Vesy);

Zmienne typu skalarnego zadeklarowane w sekcji type są deklarowane przy użyciu nazw typów:

Planeta = (Merkury, Wenera, Ziemia, Mars); var Solnsystem: Planeta;

Zatem zmienna Solnsystem może przyjmować następujące wartości: Merkury, Wenera, Ziemia lub Mars. Również zmienne typu wyliczeniowego można zadeklarować w sekcji var:

Układ Słoneczny: Merkury, Wenera, Ziemia, Mars;

Jak widać, nazwy typów nie są już tutaj obecne, a zmienne są zbiorem wyliczonych wartości typu. Operator przypisania „:=” można zastosować do zmiennych danego typu

Układ Słoneczny:= Rtęć;

Sekwencja wartości typu wyliczeniowego jest numerowana automatycznie, zaczynając od zera:

Planeta = (Merkury, Wenera, Ziemia, Mars);

W tym przykładzie Merkury to 0, Wenera to 1, Ziemia to 2, Mars to 3.

Typ danych przedziału paskala:

Zakres wartości o dowolnym typie porządkowym jest definiowany jako przedziałowy typ danych. Segment ustawiany jest w zakresie od minimalnej wartości stałych do maksymalnej, które są oddzielone od siebie dwukropkiem „..” Stałe mogą być liczbami całkowitymi, znakowymi, boolowskimi lub stałymi wyliczeniowymi. Typ podstawowy to typ skalarny, na podstawie którego określony jest segment.