dom - Urządzenia mobilne
2 główne podstawowe i strukturalne typy danych. Podstawowe projekty algorytmów

3.2.1 Proste i strukturalne typy danych. Struktury danych - rekordy, tablice, listy.

Zmienne

Podczas programowania zwykle konieczne jest zapamiętanie określonej ilości danych (wyniki pośrednie, zdarzenia, które miały miejsce, dane wejściowe, dane wyjściowe itp.). Wartości te należy przechowywać w pamięci. W tym celu deklarowana jest lokalizacja w pamięci, która służy do przechowywania danych, a ta zadeklarowana lokalizacja nazywana jest zmienną. Ponieważ przechowywane dane mogą być bardzo różne, przy deklarowaniu zmiennej deklarowany jest również typ danych, które będą przechowywane w tej zmiennej (typ zmiennej).

Proste typy

W przypadku zmiennej prostego typu pojedyncza wartość (często odczytywana jako liczba) jest ukryta pod słowem kluczowym i można uzyskać do niej bezpośredni dostęp. Najbardziej znane typy proste to: liczba całkowita ze znakiem, liczba całkowita bez znaku, liczba ułamkowa (z przecinkiem), symbol, wartość logiczna. Mogą się nieznacznie różnić w różnych językach.

Typy strukturalne

W przypadku typów strukturalnych pod jednym słowem kluczowym grupowanych jest kilka wspólnych wartości, jak np. współrzędne punktu czy imię i nazwisko osoby. W tej formie zbiór danych łatwiej jest przenieść jednorazowo. Jednocześnie musisz wykorzystywać lub zmieniać dane w obrębie struktury pojedynczo.

Tablice

Tablica to zbiór danych tego samego typu, które mają tę samą nazwę i są oddzielone od siebie indeksem. Tablice znacznie ułatwiają przetwarzanie danych tego samego typu. Łatwość przetwarzania wynika z faktu, że w trakcie wykonywania programu można po prostu zmienić indeks i dzięki temu łatwiej uzyskać dostęp do żądanej zmiennej. Pobranie wartości zmiennej z tablicy przy użyciu liczby porządkowej jest dość szybkim zadaniem dla komputera.

Tablice mogą być jednowymiarowe (wiersz, wiersz), dwuwymiarowe (tabela, macierz), trójwymiarowe (sześcian) itp.

Przykład (C#, Java)

wew masa = nowyint ; //utwórz tablicę do przechowywania dziesięciu liczb całkowitych

masa=1; //wartość 1 jest zapisywana pod indeksem 0

Dodatkowa lektura: http://enos.itcollege.ee/~jpoial/java/i200loeng4.html

Posty

Rekordy służą do przechowywania różnych typów danych, które razem tworzą powiązany zestaw. Na przykład rekord osoby tworzony jest z następujących danych: imię (tekst), nazwisko (tekst), płeć (wartość logiczna, 0 - kobieta, 1 - mężczyzna), waga (liczba ułamkowa). Dane te tworzą jedną całość, opisując jedną osobę, same jednak są bardzo różnych typów.

Przykład (C#)

strukturynimene {

ciąg publiczny eesnimi;

ciąg publiczny perenimi;

publiczny seks;

pływak publiczny waga;

Za pomocą tego wpisu możemy utworzyć zmienną kasutaja(user) i przypisać użytkownikowi wartości imienia, nazwiska, płci i wagi:

inimene kasutaja;

kasutaya.eesnimi =„Jaan” ;

kasutaya.perenimi =„Mety” ;

kasutaya.sex = 1;

kasutaya.waga = 80,0;

Listy i drzewa

Obecnie listy są często używane do przechowywania danych. Jeśli każdy element listy wskazuje na element następujący po niej, to jest to lista połączona, a koniec takiej listy jest oznaczony pustym elementem (null). Lista połączona, w której każdy element wskazuje tylko na następny, nazywana jest listą jednokierunkową. Lista połączona, w której każdy element wskazuje na następny i poprzedni element, nazywa się listą dwukierunkową. Lista połączona, w której nie ma pierwszego i ostatniego elementu, a każdy element wskazuje na następny, nazywana jest listą cykliczną. Długość połączonej listy jest określona przez liczbę jej elementów. Pierwszym elementem listy jest głowa, a pozostałe elementy to ogon.

Stos to lista połączona, w której jako pierwszy czytany jest ostatni dodany element (LIFO – Last In First Out).

Kolejka to połączona lista, w której najpierw czytany jest element dodany jako pierwszy (FIFO – First In First Out).

Dodatkowa lektura: http://www.cs.tlu.ee/~inga/alg_andm/linked_list_C_2011.pdf

Drzewo to struktura danych, w której dane są umieszczone w postaci drzewa, składa się z wierzchołków (angielski węzeł) i łuków (angielski krawędzie), które łączą wierzchołki (wskaźniki). Wierzchołki połączone łukami z wierzchołkiem znajdującym się powyżej nazywane są dziećmi, a wierzchołek znajdujący się powyżej w tym przypadku jest rodzicem. Najwyższym wierzchołkiem jest korzeń. Wierzchołek, który nie ma dzieci, nazywany jest liściem.

Przejście od góry do rodzica, a stamtąd do następnego rodzica itd. docieramy do korzenia. Przodkami są wszystkie wierzchołki znajdujące się na ścieżce od danego wierzchołka do korzenia. Wysokość drzewa określa najdłuższa droga od liścia do korzenia.

W przypadku drzewa uporządkowanego korzeń i wierzchołki bezpośrednio z nim połączone są definiowane jako węzły pierwszego poziomu (dzieci korzenia), a wierzchołki połączone bezpośrednio z wierzchołkami pierwszego poziomu są wierzchołkami drugiego poziomu (dzieci wierzchołków pierwszego poziomu) itd. .; Ważna jest także kolejność dzieci od lewej do prawej.

Dodatkowa lektura: http://www.cs.tlu.ee/~inga/alg_andm/tree_gen_2011.pdf

Drzewo binarne to drzewo, w którym każdy z rodziców może mieć jedno dziecko, dwoje dzieci lub nie mieć żadnych dzieci, a kolejność dzieci jest ważna.

Drzewo wyszukiwania binarnego to drzewo binarne, które jest uporządkowane. Na lewo od wierzchołka zawsze znajduje się mniejsza liczba, a na prawo zawsze większa.

Podczas przeszukiwania takiego drzewa poszukiwana wartość jest porównywana z pierwiastkiem i jeśli szukana wartość jest równa pierwiastkowi, to istnieje i zostaje znaleziona. Jeśli pożądana wartość nie jest równa pierwiastkowi, operacja porównania jest kontynuowana odpowiednio dalej, porównując żądaną wartość z zestawem wierzchołków znajdujących się po prawej lub lewej stronie, aż dotrą do liści. Jeśli szukana wartość jest równa wartości jednego z wierzchołków, to szukany element zostaje znaleziony i istnieje, natomiast jeśli taki wierzchołek nie zostanie znaleziony, to szukanego elementu nie ma w tym drzewie. Ta metoda wyszukiwania jest wielokrotnie szybsza niż pełne przechodzenie przez tablicę lub połączoną listę.

Drzewo B jest drzewem poszukiwań, w którym liczba dzieci w każdym węźle mieści się w przedziale od (t-1) do (2t-1), gdzie t jest dowolną stałą.

Drzewo B* to drzewo B, w którym wierzchołki są wypełniane do 2/3 poprzez wypełnienie najpierw dwóch wierzchołków potomnych poprzez redystrybucję kluczy, a następnie podzielenie ich na 3 wierzchołki.

Z tego powodu drzewo B pozwala zachować głębokość drzewa mniejszą niż drzewo binarne. Ograniczając dopełnienie, możliwe jest również na poziomach pośrednich utrzymanie ilości wykorzystywanej pamięci w ściśle określonych granicach i jednocześnie możliwość natychmiastowego dodawania danych w odpowiednie miejsce.

Złożony, Lub strukturalny, typy danych w przeciwieństwie do prostych, definiują zbiory wartości złożonych za pomocą jednej wspólnej nazwy. Można powiedzieć, że typy strukturalne definiują pewien sposób tworzenia nowych typów danych na podstawie istniejących. Dzięki temu możliwe jest tworzenie struktur danych o dowolnej złożoności, co pozwala na uzyskanie odpowiedniej reprezentacji w programie danych, z którymi operuje.

Istnieje kilka metod strukturyzacji, z których każda różni się sposobem odnoszenia się do poszczególnych komponentów, a co za tym idzie, sposobem odnoszenia się do komponentów zawartych w danych konstrukcji. Ze względu na sposób organizacji i rodzaj komponentów w złożonych typach danych wyróżnia się następujące odmiany:

  • typ zwykły (tablice);
  • typ łączony (rekord);
  • typ pliku(pliki);
  • wiele typów;
  • typ ciągu(stringi);
  • typ obiektu (obiekty).

W odróżnieniu od prostych typów danych, dane typu strukturalnego charakteryzują się mnogością elementów tworzących ten typ, tj. zmienna lub stała typu strukturalnego zawsze ma wiele komponentów. Każdy komponent z kolei może należeć do typu strukturalnego, tj. możliwe jest zagnieżdżanie typów.

Literatura

  1. Popow V.B. Pascala i Delphi. Instrukcja samokształcenia - St. Petersburg: Peter, 2004. - 544 s.: il.

Rozdział 6. STRUKTURALNY
TYPY DANYCH Ustrukturyzowane typy danych definiują zbiory komponentów tego samego lub różnych typów. Typy komponentów są tworzone z innych typów danych (prostych, strukturalnych, wskaźników itp.). W języku Pascal istnieją następujące typy strukturalne: - typ tablicowy; - typ rekordu; - zestaw typów; - Typ pliku. Turbo Pascal ma jeszcze dwa typy strukturalne: - typ string i - typ string PChar, które są typami tablic. W dalszej części, dla uproszczenia, obiekty typów strukturalnych będą wywoływane tymi samymi nazwami, co ich typy, bez określania słowa „typ”: array, record, set, file, string. W standardzie językowym istnieją spakowane i rozpakowane typy strukturalne. W Turbo Pascalu słowo „pakowany”, które charakteryzuje typ upakowany, nie ma żadnego znaczenia; Jeśli to możliwe, pakowanie danych odbywa się automatycznie. 6.1. Typ tablicy-tablica to stała liczba uporządkowanych elementów tego samego typu, wyposażonych w indeksy. Może być jednowymiarowy lub wielowymiarowy. Aby określić typ tablicy, należy skorzystać ze słowa zastrzeżonego array, po którym należy wskazać typ indeksu(ów) składników (w nawiasach kwadratowych), a następnie po słowie z - typ samych składników: typ<имя типа>= tablica [<тип индекса(индексов)>] z<тип компонент> ; Przykład. wpisz Arr = tablica Real; (typ tablicy składający się z 3 liczb rzeczywistych) Matrix = tablica liczb całkowitych; (typ to dwuwymiarowa tablica liczb całkowitych, składająca się z 3 wierszy i 2 kolumn) Wprowadzając typ tablicy, można następnie zdefiniować zmienne lub wpisane stałe tego typu. Wymiar tablicy może być dowolny, elementy tablicy mogą być dowolnego typu, także strukturalnego, indeks (indeksy) mogą być dowolnego typu porządkowego z wyjątkiem typu Longint. Przy przypisywaniu wartości do stałej tablicy składniki są wskazywane w nawiasach i oddzielane przecinkami, a jeśli tablica jest wielowymiarowa, nawiasy zewnętrzne odpowiadają lewemu indeksowi, zagnieżdżone w nich nawiasy odpowiadają kolejnemu indeksowi itp. Zatem dla typów przedstawionych powyżej można podać np. następujące zmienne i stałe: var Ml, M2: Arr; Matryca: Matryca; stała M3: Arr =(1, 2, 3); Mata: Macierz = ((1, 2), (3, 4), (5, 6)); Ostatnia stała odpowiada następującej strukturze: 1 2 3 4 5 6 Uwaga. Typ tablicy można także wprowadzić bezpośrednio podczas definiowania odpowiednich zmiennych lub wpisywanych stałych. Na przykład: var Ml, M2: tablica Real; Matr: tablica liczb całkowitych; Zdefiniowano tutaj te same tablice, co w poprzednim przykładzie. Deklarując tablice w ten sposób należy pamiętać, że ich typy nie będą identyczne z żadnymi innymi typami, nawet jeśli mają tę samą strukturę. Dlatego nie można przekazać ich jako parametrów do podprogramu (patrz rozdział 10.3); nie można także przypisać im wartości innych tablic (i odwrotnie), nawet jeśli ich struktura jest taka sama. Dostęp do komponentów tablicy uzyskuje się poprzez określenie nazwy tablicy, po której następuje wartość indeksów komponentów w nawiasach kwadratowych. Generalnie każdy indeks składowy można określić poprzez wyrażenie odpowiedniego typu, np.: M1, Matrix, M2, itd. Jednej tablicy można przypisać wartość innej tablicy, ale tylko tego samego typu. Zatem, jeśli podane są następujące tablice: var A, B: tablica liczb całkowitych; C: tablica liczb całkowitych; następnie powiedzmy następujący operator: A:= B; Z drugiej strony operator C:= A; jest nieprawidłowy, ponieważ tablice A i C nie są identycznymi typami. Istnieją pewne różnice w pracy z jednowymiarowymi tablicami znaków (nie mylić z wartościami łańcuchowymi - patrz sekcja 6.2). Zatem do wpisanych stałych tego typu można przypisać wartość podobnie jak do zwykłych stałych łańcuchowych, określając ciąg znaków w apostrofach, na przykład const A: tablica Char="aaaaa"; B: tablica Char="bbb"; W przypadku takich tablic, jak i ciągów znaków, można zastosować operacje porównania (nawet jeśli nie są to identyczne typy i nawet jeśli mają różne rozmiary) oraz konkatenację (unię) - patrz. klauzula 6.2. Można ich używać w instrukcjach wyjściowych Write i WriteLn. Na przykład dla tablic wprowadzonych powyżej możesz zapisać jeśli A > B, a następnie WriteLn(A) else WriteLn(B); 6.2. Ciąg znaków typu string W Turbo Pascalu typ ciągu (standardowy typ ciągu) to ciąg znaków o dowolnej długości (do 255 znaków). Ciąg można traktować jako tablicę znaków, ale ze względu na powszechne użycie ciągów i niektóre funkcje w porównaniu ze standardowymi tablicami, są one rozdzielane na osobny typ danych. Rozmiar typu string może być podany w nawiasach kwadratowych (od 1 do 255). Jeśli rozmiar łańcucha nie jest określony, przyjmuje się, że wynosi 255, na przykład: var Str: string; MaxStr: ciąg znaków; (ciąg 255 znaków) const styczeń: string = "styczeń"; Operacje łączenia (+) i porównania mają zastosowanie do ciągów. Operacja łączenia dodaje drugi ciąg do pierwszego. Przykład. Połącz dwa ciągi. Str, Strl, Str2: ciąg; rozpocznij Strl:= "Turbo"; Str2:= "Paskal"; Str:= Strl + Str2; (w zmiennej Str - „Turbo Pascal”) koniec. Można porównywać ciągi o różnych długościach. Porównanie odbywa się od lewej do prawej zgodnie z kodami ASCII odpowiednich znaków. Uważa się, że brakujące znaki w krótszym ciągu mają kod mniejszy niż jakikolwiek prawidłowy znak. Na przykład „XS” jest większe niż „X”. Przykład. Sprawdź, czy wprowadzony zestaw znaków jest nazwą miesiąca w języku rosyjskim. program PRZYKŁAD11; const Instancja: tablica string!10]= („STYCZEŃ”, „LUTY”, „MARZEC”, „KWIECIEŃ”, „MAJ”, „CZERWIEC”, „LIPIEC”, „SIERPIEŃ”, „WRZESIEŃ”, „PAŹDZIERNIK” , "LISTOPAD GRUDZIEŃ"); Miesiąc: Boolean = False; zmienna Str: ciąg znaków; ja: liczba całkowita; rozpocząć Writeln("Wpisz wielkie litery: "); OdczytLn(Str); dla i:= 1 do 12 wykonaj, jeśli Str = Instancja[i] to Miesiąc:=True; jeśli Miesiąc, to WriteLn("Wprowadzono nazwę miesiąca") else WriteLn("Nie wpisano nazwy miesiąca") end. W rzeczywistości ciąg N znaków jest tablicą N+1 znaków: string[N] = tablica Char. Znak null ma na celu wskazanie liczby znaków w ciągu, który ma zostać użyty, i może różnić się od znaku o kodzie 0 do znaku o kodzie N. Można z nim pracować jak z innymi znakami w ciągu (zapis i odczyt jego wartości itp.), ale nie zapominając o jego głównym celu. 6.3. Ciąg ASCIIZ W wersji 7.0, w celu zapewnienia zgodności z innymi językami programowania oraz środowiskiem Windows, wprowadzono inny rodzaj ciągu znaków - ciągi zakończone bajtem zerowym - znak o kodzie 0 (tzw. ciągi ASCIIZ). W przeciwieństwie do ciągów, te ciągi nie mają limitu rozmiaru (w rzeczywistości mogą mieć maksymalnie 65535 bajtów). Ciągi te mają nadawany standardowy typ PChar. Tak naprawdę ten typ jest wskaźnikiem do znaku (o wskaźnikach zobacz akapit 7): PChar = ^Char; Jednakże zastosowanie rozszerzonej składni (klucz (X+) - patrz rozdział 17.7.1) pozwala na użycie takiej zmiennej jako ciągu znaków odpowiadającego tablicy typu pChar = array of Char, gdzie K jest liczbą znaków w ciąg znaków, nie licząc znaku końcowego z kodem 0 W przeciwieństwie do typu łańcuchowego, znak z indeksem 0 jest tutaj pierwszym znakiem ciągu, a ostatni znak z indeksem K jest ostatnim znakiem z kodem 0. Podczas pracy z ciągami ASCIIZ , wskazane jest określenie rozszerzonej składni; w tym przypadku nie ma żadnych trudności przy korzystaniu z różnych standardowych procedur pracujących z ciągami znaków. Przykład. Używanie ciągów PChar z rozszerzoną składnią. program PRZYKŁAD12; ($X+) (nie jest to konieczne, ponieważ jest to ustawienie domyślne) wpisz T = tablica Char; (tablica dla ciągu 7 znaków) var Str: PChar; const A: T = „cześć!”#0; rozpocząć Str:= "Witajcie!"; ZapiszLn(Str); (linia wyjściowa: HI Str:= @А; {допустимо также: Str:=A} WriteLn(Str); {вывод строки: привет!} WriteLn(Str);{вывод символа "р"} ReadLn end. Если используется ключ {$Х-}, переменная типа PChar в этом случае рассматривается как указатель на один единственный символ. В этом случае ни один из операторов предыдущего примера, за исключением операторов Str:=@A; и ReadLn, недопустимы, а оператор WriteLn(Str^), выполненный после оператора Str:=@A;, выдаст один символ "п". Для работы с ASCIIZ-строками в версии 7.0 используются специальные стандартные модули Strings (см. п. 16.2) и WinDos (см. п. 16.6). 6.4. Запись Тип-запись включает ряд компонент, называемых полями, которые могут быть разных типов. При задании типа-записи после зарезервированного слова record следует перечислить все поля типа-записи с указанием через двоеточие их типов и завершить задание типа словом end. Поля отделяются друг от друга точкой с запятой. Количество полей записи может быть любым. Пример. type Complex = record {Тип комплексных чисел} Re: Real; Im: Real end; Data = record {Тип - дата рождения} Year: Integer; Month: 1..12; Day: 1..31 end; Person = record {Тип - сведения о сотруднике} Name: string; Sex: (Male, Female); Age: Integer; Married: Boolean end; Примечание. Если несколько полей типа-записи имеют один и тот же тип, то их имена можно перечислить через запятую и затем указать этот общий тип. Так, рассмотренный в примере тип комплексных чисел можно ввести и другим образом: type Complex = record Re, Im: Real end; После введения типа-записи можно затем задать переменные или типизированные константы этого типа - записи. При задании значений константе ее поля записываются в круглых скобках через точку с запятой. Для задания значения каждого поля сначала указывается имя поля, а затем через двоеточие - его значение. Так, для введенных выше типов можно задать, например, следующие переменные и константы: var X, У, Z: Complex; Dat: Data; const Birthday: Data = (Year: 1971; Month: 12; Day: 9); Ivanov: Person = (Name: "Иванов"; Sex: Male; Age: 40; Married: True); Примечание. Тип-запись можно вводить и непосредственно при определении переменных или типизированных констант. Например, фрагмент var X, Y, Z: record Re, Im: Real end; определяет те же комплексные переменные, что и в предыдущем примере. Доступ к полям записи осуществляется указанием имени переменной (константы) и имени поля, записываемого через точку, например: Ivanov.Age, X.Re, Dat.Day и т. д. Пример. Использование полей записей. X.Re:= 1.5; X.Im:=1.7; Y.Re:= -X.Re; Y.Im:= -X.Im; Ivanov.Married:= False; Для того чтобы не выписывать каждый раз имя записи при обращении к ее полям, можно использовать оператор над записями WITH. Его структура выглядит следующим образом: with !}<имя записи>Do<оператор> ; W takim przypadku wewnątrz instrukcji można określić jedynie pole rekordu. Na przykład fragment: od X zaczyna się Re:= 1,5; Im:= 1,7; Y.Re:= -Re; Y.Im:= -Koniec; z Iwanowem ożenił się:= Fałsz; jest odpowiednikiem fragmentu z poprzedniego przykładu. Typ rekordu może mieć część wariantową, która zmienia się w zależności od różnych implementacji, na przykład w typie rekordu dla parametrów figur geometrycznych określony jest bok dla kwadratu, dwa boki i kąt między nimi dla trójkąta, promień dla kółko itp. Część wariantowa może być tylko jedna i powinna znajdować się na końcu wpisu. Przykład. Korzystanie z części wariantowej. wpisz Rysunek = (kwadrat, trójkąt, okrąg); Param = rekord X, Y: Rzeczywisty; (współrzędne punktu kontrolnego) przypadek Ryc.: Rysunek (parametry rysunku) Kwadrat: (Bok: Rzeczywisty); Trójkąt: (Bok, Bok2, Kąt: Rzeczywisty); Okrąg: (Promień: Rzeczywisty) koniec; var Mój Kwadrat, Moje Koło: Param; Część wariantowa rozpoczyna się od przypadku słowa, po którym następuje zmienna wyboru wariantu (w przykładzie na rys.) wskazująca typ. Następnie znajdują się stałe, których wartości może przyjmować zmienna wyboru opcji (w przykładzie Kwadrat, Trójkąt, Okrąg). Po każdej stałej zapisywane są pola danej opcji rejestracji, oddzielone dwukropkiem w nawiasie wskazującym ich typ. Nawiasy są wymagane nawet jeśli dla danej opcji nie ma części wariantowej. Należy zauważyć, że część wariantowa nie jest zakończona własną instrukcją końcową, jak w zwykłej konstrukcji CASE, ponieważ następuje po niej instrukcja końcowa całego typu. W standardzie języka Pascal przed skorzystaniem z jednej z opcji zapisu zmiennej wyboru opcji należy nadać odpowiednią wartość: Rys:= Kwadrat; MójSquare.Side:=5.0; Rys.:= Okrąg; Mój okrąg.Promień:=7,5; W Turbo Pascalu ta operacja nie jest konieczna, chociaż jeśli określono zmienną wyboru, można ją następnie sprawdzić w programie, aby określić, który wybór został ustawiony. Ponadto ustawienie wartości zmiennej selekcji nie ma na nic wpływu, a poniższy fragment jest równoważny omówionemu powyżej: Rys:= Okrąg; MójSquare.Side:= 5,0; Rys.:= Kwadrat; Mój krąg.Promień: -7,5; W typie rekordu dopuszczalne jest nie wprowadzanie zmiennej służącej do wyboru opcji, a jedynie wyszczególnienie różnych opcji, np.: Transf = przypadek rekordu Integer of 1: (_Word: Word); 2: (_TwoSymb: tablica Char) koniec; 6.5. Zestaw W języku Pascal typ zestawu to stopień zestawu pierwotnego zbioru obiektów typu porządkowego, to znaczy zbiór wszystkich możliwych kombinacji obiektów pierwotnego zbioru. Liczba elementów oryginalnego zestawu w Turbo Pascalu nie może być większa niż 256, a liczby porządkowe elementów (czyli wartość funkcji Ord) muszą mieścić się w przedziale od 0 do 255. Aby określić typ zestawu , należy użyć słów zastrzeżonych set i of, a następnie wskazać elementy tego zbioru, zwykle w formie wyliczenia lub zakresu, np.: wpisz Alfa = zbiór „A”..”Z”; Liczba = zbiór (plus, minus, mnożenie, dzielenie); Dziesięć = zestaw 0..9; Liczba = zestaw „0”..”9” ; Wprowadzając typ zestawu, możesz zdefiniować zmienne lub wpisane stałe tego typu zestawu. Przypisując wartości do zbioru stałego, jego elementy wyszczególnia się oddzielone przecinkami (dopuszczalne jest określenie zakresów) i umieszczone w nawiasach kwadratowych. Przykładowo dla typów przedstawionych powyżej można ustawić następujące zmienne i wpisane stałe: var CharVal: Alfa; Operacja: Policz; const Indeks: Dziesięć = ; Cyfra: Liczba = ["0".."9"]; Notatka. Podobnie jak w przypadku innych typów strukturalnych, typ zestawu można wprowadzić bezpośrednio podczas definiowania zmiennych lub wpisywanych stałych: var CharVal: zestaw „A.”.”Z”; Operacja: zbiór (Plus, Minus, Mult, Podziel); const Indeks: zestaw 0..9 = ; Cyfra: zbiór „0”..”9”=[„0”..”9”]; Zestawowi można przypisać tę lub inną wartość w programie. Zazwyczaj wartość jest ustawiana za pomocą konstruktora set. Konstruktor definiuje zbiór elementów wymieniając w nawiasach kwadratowych wyrażenia, których wartości podają elementy tego zbioru. Dopuszczalne jest stosowanie zakresów elementów. Przykład. Konstruktorami zestawów są następujące struktury: Każdy zestaw zawiera tzw. pusty zbiór nie zawierający żadnych elementów. Konstruktora zestawów można także używać bezpośrednio w operacjach na zbiorach. Na zbiorach zdefiniowano następujące operacje: + - suma zbiorów; - - różnica zbiorów; * - przecięcie wielu; = - sprawdzenie równoważności dwóch zbiorów;<>- sprawdzenie nierównoważności dwóch zbiorów;<= - проверка, является ли левое множество подмножеством правого множества; > = - sprawdzenie, czy zbiór prawy jest podzbiorem zbioru lewego; in - sprawdza, czy element określony po lewej stronie znajduje się w zestawie określonym po prawej stronie. Wynikiem operacji sumy, różnicy lub przecięcia jest odpowiedni zbiór, inne operacje dają wynik typu logicznego. Przykład. Wprowadź ciąg znaków składający się z liter łacińskich, cyfr i spacji. Sprawdź poprawność wprowadzonych znaków. program PRZYKŁAD13; zmienna Str: ciąg znaków; L: Bajt; Tru: wartość logiczna; rozpocząć WriteLn("Wpisz linię"); OdczytLn(Str); L:= Długość(str); (liczba wprowadzonych znaków) Tru:= L > 0; (prawda, jeśli nie jest to pusty ciąg znaków), podczas gdy Tru i (L > 0) wykonują (sprawdź od końca linii) rozpoczynają Tru:=Str[L] w ["0".."9", "A"., „Z”, „a”..”z”, „ „]; (sprawdzanie ważności znaku) Dec(L) (poprzedni znak) end; jeśli Tru, to WriteLn("Poprawna linia"), w przeciwnym razie WriteLn("Zła linia") zakończy się. 6.6. Plik typu plik to ciąg składników tego samego typu znajdujący się na urządzeniu zewnętrznym (standard językowy opiera się na lokalizacji danych na taśmach magnetycznych). Komponenty mogą być dowolnego typu, z wyjątkiem typu pliku (lub zawierającego komponenty typu pliku) i typu obiektu. Liczba komponentów w pliku nie jest zadeklarowana. Aby określić typ pliku, użyj słów zastrzeżonych file i of, po których następuje typ komponentu pliku. Przykład. wpisz Number = plik Integer; (typ pliku typu integer) Symb = plik „A”..”Z”; (typ pliku z dużymi literami) Standardowy typ tekstowy definiuje typ pliku zawierający znaki połączone w ciągi znaków. Należy pamiętać, że typ Text w Turbo Pascalu nie jest odpowiednikiem pliku typu Char. Wpisując typ pliku, można zdefiniować zmienne typu pliku: var Fl, F2: Liczba; F3: Tekst; FF4: Symb; W Turbo Pascalu można użyć pliku bez typu, którego definicja nie określa typu komponentu. W takim przypadku praca z plikiem odbywa się na poziomie fizycznym, zgodnie z wewnętrznym formatem jego danych. W takim przypadku rzeczywiste komponenty pliku mogą być różnych typów. Przykład. wpisz UnType = plik; Typ pliku można także zdefiniować bezpośrednio przy deklarowaniu zmiennych pliku: var Fl, F2: plik Integer; Zmienne pliku mają określone zastosowania. Nie można na nich wykonywać żadnych operacji (przypisywać wartości, porównywać itp.). Można ich używać wyłącznie do wykonywania operacji na plikach (odczyt, zapis, usuwanie pliku itp.). Praca z plikami zostanie omówiona w paragrafie 11. Dodatkowo poprzez zmienną pliku można uzyskać informacje o konkretnym pliku (typ, parametry, nazwa pliku itp.). D.)

Typ danych definiuje zbiór prawidłowych wartości i zbiór prawidłowych operacji.

Proste typy.

Typy proste dzielą się na ORDINAL i REAL.

1. RODZAJE ZAMÓWIEŃ , z kolei są:

cały

Pascal definiuje 5 typów liczb całkowitych, które są definiowane w zależności od znaku i wartości, jaką przyjmie zmienna.

Wpisz imię

Długość (w bajtach)

Zakres wartości

32 768...+32 767

2 147 483 648...+2 147 483 647

b) logiczne

Nazwa tego typu to BOOLEAN. Wartości logiczne mogą być jedną ze stałych boolowskich: PRAWDA (prawda) lub FAŁSZ (fałsz).

c) symboliczne

Nazwa tego typu to CHAR - zajmuje 1 bajt. Wartość typu znaku to zbiór wszystkich znaków PC. Każdemu znakowi przypisana jest liczba całkowita z zakresu 0…255. Liczba ta służy jako kod wewnętrznej reprezentacji symbolu.

2. PRAWDZIWE TYPY .

W przeciwieństwie do typów porządkowych, których wartości są zawsze odwzorowywane na szereg liczb całkowitych i dlatego są reprezentowane absolutnie precyzyjnie na PC, wartości typów rzeczywistych definiują dowolną liczbę tylko z pewną skończoną precyzją w zależności od wewnętrznego formatu liczby rzeczywistej .

Długość liczbowego typu danych, w bajtach

Numeryczna nazwa typu danych

Liczba cyfr znaczących typu danych numerycznych

Zakres porządku dziesiętnego liczbowego typu danych

2*1063 +1..+2*1063 -1

TYPY STRUKTURALNE

Ustrukturyzowane typy danych definiują uporządkowany zbiór zmiennych skalarnych i charakteryzują się rodzajem ich składników.

Ustrukturyzowane typy danych, w odróżnieniu od prostych, definiują wiele wartości złożonych pod jedną wspólną nazwą. Można powiedzieć, że typy strukturalne wyznaczają pewien sposób tworzenia nowych typów z istniejących.

Istnieje kilka metod strukturyzacji. Ze względu na sposób organizacji i typ komponentów w złożonych typach danych wyróżnia się następujące odmiany: typ regularny (tablice); typ łączony (rekord); typ pliku(pliki); wiele typów; typ ciągu(stringi); w języku Turbo Pascal w wersji 6.0 i starszych wprowadzono typ obiektowy (obiekty).

W odróżnieniu od prostych typów danych, dane typu strukturalnego charakteryzują się mnogością elementów tworzących ten typ, tj. zmienna lub stała typu strukturalnego zawsze ma wiele komponentów. Każdy komponent z kolei może należeć do typu strukturalnego, tj. możliwe jest zagnieżdżanie typów.

1. Tablice

Tablice w Turbo Pascalu są pod wieloma względami podobne do podobnych typów danych w innych językach programowania. Charakterystyczną cechą tablic jest to, że wszystkie ich elementy są danymi tego samego typu (prawdopodobnie ustrukturyzowanymi). Elementy te można łatwo uporządkować, a dostęp do każdego z nich można uzyskać po prostu podając numer seryjny.

Opis tablicy jest określony w następujący sposób:

<имя типа>= tablica [<сп.инд.типов>] z<тип>

Tutaj<имя типа>- poprawny identyfikator;

Array, of – słowa zastrzeżone (tablica, from);

<сп.инд.типов>- lista jednego lub więcej typów indeksów oddzielonych przecinkami; nawiasy kwadratowe otaczające listę są wymogiem składniowym;

<тип>- dowolny rodzaj Turbo Pascala.

Jako typy indeksowe w Turbo Pascalu można używać dowolnych typów porządkowych, z wyjątkiem typów LongInt i typów zakresowych z typem podstawowym LongInt.

Głębokość zagnieżdżenia typów strukturalnych w ogóle, a co za tym idzie tablic, jest dowolna, więc liczba elementów na liście indeksów typów (rozmiar tablicy) nie jest ograniczona, jednak całkowita długość wewnętrznej reprezentacji dowolnej tablicy nie może być większy niż 65520 bajtów.

2. Zapisy

Rekord to struktura danych składająca się ze stałej liczby elementów zwanych polami rekordów. W przeciwieństwie do tablicy, komponenty (pola) rekordu mogą być różnych typów. Aby umożliwić odwoływanie się do tego lub innego elementu rekordu, pola są nazywane.

Struktura deklaracji typu post jest następująca:

< Nazwatyp>=NAGRAJ< wspólne przedsięwzięcie. pola>KONIEC

Tutaj<имя типа>- poprawny identyfikator;

RECORD, END – słowa zastrzeżone (rekord, koniec);

<сп.полей>- lista pól; jest sekwencją sekcji rekordu oddzielonych średnikiem.

3 zestawy

Zbiory to zbiór obiektów tego samego typu, które są ze sobą logicznie połączone. Charakter połączeń między obiektami jest jedynie sugerowany przez programistę i nie jest w żaden sposób kontrolowany przez Turbo Pascal. liczba elementów wchodzących w skład zbioru może wahać się od 0 do 256 (zbiór niezawierający elementów nazywany jest pustym) To właśnie niestałość liczby jego elementów odróżnia zbiory od tablic i rekordów.

Dwa zbiory uważa się za równoważne wtedy i tylko wtedy, gdy wszystkie ich elementy są takie same, a kolejność elementów zbioru jest obojętna. Jeśli wszystkie elementy jednego zbioru znajdują się także w drugim, mówimy, że pierwszy zbiór należy do drugiego.

Opis typu zestawu to:

< Nazwatyp>=ZESTAW< podstawy. typ>

Tutaj<имя типа>- poprawny identyfikator;

SET, OF – słowa zastrzeżone (set, from);

<баз.тип>- podstawowy typ elementów zestawu, który może być dowolnym typem porządkowym z wyjątkiem WORD, INTEGER i LONGINT.

Do zdefiniowania zbioru stosuje się tzw. konstruktora zbiorów: listę specyfikacji elementów zbioru oddzielonych przecinkami; lista jest otoczona nawiasami kwadratowymi. Specyfikacje elementów mogą być stałymi lub wyrażeniami typu podstawowego, a także typem zakresu tego samego typu podstawowego.

4. Pliki

Przez plik rozumie się nazwany obszar pamięci zewnętrznej komputera PC lub urządzenie logiczne - potencjalne źródło lub odbiorca informacji.

Każdy plik ma trzy charakterystyczne cechy

    ma nazwę, która pozwala programowi pracować z kilkoma plikami jednocześnie.

    zawiera komponenty tego samego typu. Typ komponentu może być dowolnym typem Turbo Pascala, z wyjątkiem plików. Innymi słowy, nie można utworzyć „pliku plików”.

    długość nowo utworzonego pliku nie jest w żaden sposób określona podczas jego deklarowania i jest ograniczona jedynie pojemnością zewnętrznych urządzeń pamięci.

Typ pliku lub zmienną typu pliku można określić na jeden z trzech sposobów:

< Nazwa>= PLIK< typ>;

< Nazwa>=TEKST;

<имя>= PLIK;

Tutaj<имя>- nazwa typu pliku (poprawny identyfikator);

FILE, OF – słowa zastrzeżone (plik, z);

TEKST – nazwa standardowego typu pliku tekstowego;

<тип>- dowolny typ Turbo Pascala, z wyjątkiem plików.

W zależności od sposobu deklaracji można wyróżnić trzy typy plików:

· pliki wpisane (ustawione przez klauzulę FILE OF...);

· pliki tekstowe (zdefiniowane jako typ TEKST);

· pliki bez typu (zdefiniowane przez typ PLIK).

Informacje o konwersji numerycznych typów danych Pascala

W Pascalu niejawne (automatyczne) konwersje numerycznych typów danych są prawie niemożliwe. Wyjątek stanowi tylko typ całkowity, którego można używać w wyrażeniach typu real. Na przykład, jeśli zmienne są zadeklarowane w ten sposób:

Var X: liczba całkowita; T: prawdziwy;

potem operator

będzie składniowo poprawne, chociaż po prawej stronie znaku przypisania znajduje się wyrażenie całkowite, a po lewej zmienna rzeczywista, kompilator automatycznie przekonwertuje numeryczne typy danych. Odwrotna konwersja automatycznie z typu rzeczywistego na typ całkowity jest niemożliwa w Pascalu. Przypomnijmy, ile bajtów jest przydzielonych na zmienne typu integer i real: 2 bajty pamięci są przydzielane na dane integer typu integer, a 6 bajtów na dane realne. Istnieją dwie wbudowane funkcje umożliwiające konwersję liczby rzeczywistej na liczbę całkowitą: round(x) zaokrągla liczbę rzeczywistą x do najbliższej liczby całkowitej, trunc(x) obcina liczbę rzeczywistą, odrzucając część ułamkową.

Typy proste obejmują typy porządkowe, rzeczywiste i datetime.

Typy porządkowe różnią się tym, że każdy z nich ma skończoną liczbę możliwych wartości. Wartości te można w określony sposób uporządkować (stąd nazwa typów) i dlatego każdą z nich można powiązać z jakąś liczbą całkowitą – liczbą porządkową wartości.

Typy rzeczywiste, ściśle rzecz biorąc, również mają skończoną liczbę wartości, która jest określona przez format wewnętrznej reprezentacji liczby rzeczywistej. Jednak liczba możliwych wartości typów rzeczywistych jest tak duża, że ​​nie jest możliwe powiązanie z każdym z nich liczby całkowitej (jej liczby).

Typ datetime przeznaczony jest do przechowywania daty i godziny. W rzeczywistości używa do tych celów prawdziwego formatu.

Typy porządkowe

Typy porządkowe obejmują (patrz rysunek 1.1) typy całkowite, logiczne, znakowe, wyliczeniowe i zakresowe. Do każdego z nich można zastosować funkcję Ord(x), która zwraca liczbę porządkową wartości wyrażenia X.

Ryż. 1.1

W przypadku typów całkowitych funkcja ord(x) zwraca samą wartość x, tj. Ord(X) = x dla x należącego do dowolnego typu całkowitego. Zastosowanie Ord(x) do typów boolowskich, znakowych i wyliczeniowych daje dodatnią liczbę całkowitą z zakresu od 0 do 1 (boolean), od 0 do 255 (znak) i od 0 do 65535 (wyliczenie). Typ zakresowy zachowuje wszystkie właściwości bazowego typu porządkowego, więc wynik zastosowania do niego funkcji ord(x) zależy od właściwości tego typu.

Możesz także zastosować funkcje do typów porządkowych:

pred(x) - zwraca poprzednią wartość typu porządkowego (wartość, która odpowiada liczbie porządkowej ord(x) -1, czyli ord(pred(x)) = ord(x) - 1;

succ(x) - zwraca kolejną wartość typu porządkowego, która odpowiada liczbie porządkowej ord(x) +1, czyli ord(Succ(x)) = ord(x) + 1.

Na przykład, jeśli program definiuje zmienną

wówczas funkcja PRED(c) zwróci znak „4”, a funkcja SUCC(c) zwróci znak „6”.

Jeśli wyobrazimy sobie dowolny typ porządkowy jako uporządkowany zbiór wartości rosnących od lewej do prawej i zajmujący pewien odcinek na osi liczbowej, to funkcja pred(x) nie jest zdefiniowana dla lewego końca, a succ (x) jest niezdefiniowany dla prawego końca tego segmentu.

Całe typy. Zakres możliwych wartości typów całkowitych zależy od ich wewnętrznej reprezentacji, która może wynosić jeden, dwa, cztery lub osiem bajtów. W tabeli 1.1 pokazuje nazwy typów całkowitych, długość ich wewnętrznej reprezentacji w bajtach oraz zakres możliwych wartości.

Tabela 1.1 – Typy całkowite

Nazwa

Długość, bajty

Zakres wartości

0. .. 2 147 483 647

32 768...+32 767

2 147 483 648...+2 147 483 647

9*1018...+9*1018

0. . .4 294 967 295

Typy LongWord i Int64 zostały po raz pierwszy wprowadzone w wersji 4, ale typy Smallint i Cardinal były nieobecne w Delphi 1. Typ całkowity w tej wersji zajmuje 2 bajty i ma zakres wartości od -32768 do +32767, tj. taki sam jak Smallint.

Stosując procedury i funkcje o parametrach całkowitych należy kierować się „zagnieżdżeniem” typów, tj. wszędzie tam, gdzie można użyć słowa, dozwolony jest Byte (ale nie odwrotnie), Longint „zawiera” Smallint, który z kolei zawiera Shortint.

Listę procedur i funkcji mających zastosowanie do typów całkowitych podano w tabeli. 1.2. Litery b, s, w, i, l oznaczają odpowiednio wyrażenia typu Byte, Shortint, Word, Integer i Longint,

x jest wyrażeniem dowolnego z tych typów; litery vb, vs, vw, vi, vl, vx oznaczają zmienne odpowiednich typów. Parametr opcjonalny jest wskazany w nawiasach kwadratowych.

Tabela 1.2 - Standardowe procedury i funkcje mające zastosowanie do całych typów

Odwołanie

Typ wyniku

Działanie

Zwraca moduł x

Zwraca znak według jego kodu

Zmniejsza wartość vx o i, a w przypadku braku i - o 1

Zwiększa wartość vx o i, a w przypadku braku i - o 1

Zwraca najwyższy łuk argumentu

Zwraca trzeci bajt

Zwraca młodszy bajt argumentu

Zwraca True, jeśli argument jest liczbą nieparzystą

Taki sam jak parametr

Zwraca liczbę pseudolosową o rozkładzie jednostajnym z zakresu 0...(w-l)

Zwraca kwadrat argumentu

Zamienia bajty w słowie

Podczas pracy z liczbami całkowitymi typ wyniku będzie odpowiadał typowi operandów, a jeśli operandy są różnych typów całkowitych, typowi ogólnemu, który obejmuje oba operandy. Na przykład podczas pracy ze skrótem i słowem powszechnym typem będzie liczba całkowita. W ustawieniu domyślnym kompilator Delphi nie generuje kodu sprawdzającego, czy wartość nie wykracza poza zakres, co może prowadzić do nieporozumień.

Typy logiczne. Typy logiczne obejmują Boolean, ByteBool, Bool, wordBool i LongBool. W standardowym Pascalu zdefiniowany jest tylko typ Boolean, pozostałe typy logiczne zostały wprowadzone w Object Pascal w celu zapewnienia zgodności z Windows: typy Boolean i ByteBool zajmują po jednym bajcie, Bool i WordBool - 2 bajty, LongBool - 4 bajty. Wartości logiczne mogą być jedną z wcześniej zadeklarowanych stałych Fałsz lub Prawda.

Ponieważ typ Boolean jest typem porządkowym, można go użyć w instrukcji pętli typu policzalnego. W Delphi 32 dla wartości logicznej

Ord(True) = +1, natomiast dla innych typów (Bool, WordBool itp.)

Ord(True) = -1, więc tego rodzaju operatorów należy używać ostrożnie! Na przykład w Delphi 6 wykonywalna instrukcja showMessage („ --- ”) w poniższej pętli for nie zostanie wykonana ani razu:

dla L:= Fałsz do Prawdy

Pokaż wiadomość("--);

Jeżeli w poprzednim przykładzie zmienisz typ parametru pętli L na Boolean, pętla zostanie uruchomiona, a na ekranie pojawi się dwukrotnie komunikat. [Dla wersji Delphi 1 i 2 ord (True) =+1 dla dowolnego typu logicznego.]

Typ postaci. Wartość typu znaku to zbiór wszystkich znaków PC. Każdemu znakowi przypisana jest liczba całkowita z zakresu 0...255. Liczba ta służy jako kod wewnętrznej reprezentacji symbolu, jest zwracana przez funkcję or.

Do kodowania w systemie Windows używany jest kod ANSI (nazwany na cześć American National Standard Institute, amerykańskiego instytutu normalizacyjnego, który zaproponował ten kod). Pierwsza połowa znaków PC o kodach 0...127 odpowiada tabeli 1.3. Druga połowa znaków o kodach 128...255 jest różna dla różnych czcionek. Standardowe czcionki systemu Windows Arial Cyr, Courier New Cyr i Times New Roman używają 64 ostatnich kodów (od 192 do 256) do reprezentowania znaków cyrylicy (bez liter „ё” i „Ё”): „A”... „Z” są zakodowane wartości 192..223, „a”… „i” - 224...255. Symbole „Ё” i „е” mają odpowiednio kody 168 i 184.

Tabela 1.3 – Kodowanie znaków zgodnie ze standardem ANSI

Znaki z kodami 0...31 odnoszą się do kodów serwisowych. Jeśli te kody są użyte w tekście znakowym programu, są uważane za białe znaki.

Typ char stosuje operacje relacyjne, a także funkcje wbudowane:

Сhar (в) - funkcja typu char; konwertuje wyrażenie typu Byte na znak i zwraca je wraz z wartością;

UpCase(CH) - funkcja typu char; zwraca wielką literę, jeśli сн jest małą literą łacińską, w przeciwnym razie zwraca sam symbol сн (w przypadku cyrylicy zwraca oryginalny znak).

Typ wyliczony. Typ wyliczeniowy jest określony poprzez wyliczenie wartości, jakie może otrzymać. Każda wartość ma nazwę za pomocą jakiegoś identyfikatora i znajduje się na liście otoczonej nawiasami, na przykład:

kolory = (czerwony, biały, niebieski);

Użycie typów wyliczeniowych sprawia, że ​​programy są bardziej wizualne.

Zgodność między wartościami typu wyliczeniowego a liczbami porządkowymi tych wartości ustalana jest przez kolejność wyliczania: pierwsza wartość na liście otrzymuje liczbę porządkową 0, druga - 1 itd. Maksymalna liczność typ wyliczeniowy ma 65536 wartości, więc w rzeczywistości typ wyliczeniowy definiuje pewien podzbiór całego słowa typu i można go uznać za zwartą deklarację grupy stałych całkowitych o wartościach 0, 1 itd.

Stosowanie typów wyliczeniowych zwiększa niezawodność programów, pozwalając kontrolować wartości, jakie otrzymują odpowiednie zmienne. Obiekt Pascal umożliwia konwersję odwrotną: dowolne wyrażenie typu Word można przekonwertować na wartość typu wyliczeniowego, o ile wartość wyrażenia całkowitego nie przekracza liczności tego typu. Konwersję tę osiąga się poprzez użycie automatycznie zadeklarowanej funkcji o nazwie wyliczonego typu.

Zakres typu. Typ zakresu jest podzbiorem jego typu podstawowego, który może być dowolnym typem porządkowym z wyjątkiem typu zakresu.

Typ zakresu definiowany jest przez granice jego wartości w obrębie typu podstawowego:

<мин.знач.>..<макс.знач.>

Tutaj<мин. знач. >- minimalna wartość zakresu typu;<макс. знач. >- jego maksymalna wartość.

Typ zakresu nie musi być opisywany w sekcji typu, ale można go podać bezpośrednio podczas deklaracji zmiennej.

Określając typ zakresu, należy przestrzegać następujących zasad:

dwa znaki „..” traktowane są jako jeden znak, dlatego nie można między nimi spacji; lewa granica zakresu nie powinna przekraczać jego prawej granicy.

Typ zakresowy dziedziczy wszystkie właściwości swojego typu podstawowego, ale z ograniczeniami wynikającymi z jego niższej mocy. W szczególności, jeśli zdefiniowano zmienną.

Standardowa biblioteka Object Pascal zawiera dwie funkcje wspierające pracę z typami zakresowymi:

High(x) - zwraca maksymalną wartość typu zakresu, do którego należy zmienna x;

Low (x) - zwraca minimalną wartość typu zakresu.

Prawdziwe typy

W przeciwieństwie do typów porządkowych, których wartości są zawsze odwzorowywane na szereg liczb całkowitych i dlatego są reprezentowane absolutnie precyzyjnie na PC, wartości typów rzeczywistych definiują dowolną liczbę tylko z pewną skończoną precyzją w zależności od wewnętrznego formatu liczby rzeczywistej .

Tabela 1.4 – Typy rzeczywiste

W poprzednich wersjach Delphi 1...3 typ Real zajmował 6 bajtów i miał zakres wartości od 2,9*10-39 do 1,7*1038. W wersjach 4 i 5 ten typ jest odpowiednikiem typu Double. Jeśli chcesz (ze względu na kompatybilność) używać 6-bajtowych liczb rzeczywistych, musisz określić dyrektywę kompilatora (SREALCOMPATIBILITY ON).

Jak widać z tabeli. 1.4 liczba rzeczywista w Object Pascal zajmuje od 4 do 10 kolejnych bajtów i ma następującą strukturę w pamięci komputera.

Tutaj s jest cyfrą znaku liczby; e - część wykładnicza; zawiera porządek binarny; m jest mantysą liczby.

Mantysa m ma długość od 23 (dla pojedynczych) do 63 (dla rozszerzonych) cyfr binarnych, co zapewnia dokładność 7...8 dla pojedynczych i 19...20 dla rozszerzonych cyfr dziesiętnych. Przecinek dziesiętny jest implikowany przed lewą (najbardziej znaczącą) cyfrą mantysy, ale podczas operacji na liczbie jego położenie jest przesuwane w lewo lub w prawo zgodnie z porządkiem binarnym liczby zapisanej w części wykładniczej dlatego też operacje na liczbach rzeczywistych nazywane są arytmetyką zmiennoprzecinkową.

Należy zauważyć, że koprocesor arytmetyczny zawsze przetwarza liczby w formacie rozszerzonym, a trzy pozostałe typy rzeczywiste w tym przypadku uzyskuje się przez proste obcięcie wyników do wymaganego rozmiaru i służą głównie do oszczędzania pamięci.

Szczególną pozycję w Object Pascal zajmują typy comp i Currency, które traktowane są jak liczby rzeczywiste z częściami ułamkowymi o stałej długości: w comp część ułamkowa ma długość 0 cyfr, czyli jest po prostu nieobecna w walucie długość części ułamkowej wynosi -4 miejsca po przecinku. W rzeczywistości oba typy definiują dużą liczbę całkowitą ze znakiem, która przechowuje 19...20 znaczących cyfr dziesiętnych (wewnętrznie zajmują 8 sąsiadujących bajtów). Jednocześnie wyrażenia comp i walutowe są w pełni kompatybilne z dowolnymi innymi typami rzeczywistymi: są na nich zdefiniowane wszystkie rzeczywiste operacje, można ich używać jako argumentów funkcji matematycznych itp. Najbardziej odpowiednim obszarem zastosowań dla tych typów jest obliczenia księgowe.



 


Czytać:



Ocena najlepszych słuchawek bezprzewodowych

Ocena najlepszych słuchawek bezprzewodowych

Czy można tanio kupić uszy uniwersalne? 3000 rubli - czy za takie pieniądze można kupić wysokiej jakości słuchawki? Jak się okazało, tak. I mowa...

Główny aparat urządzenia mobilnego zwykle znajduje się z tyłu korpusu i służy do robienia zdjęć i nagrywania filmów

Główny aparat urządzenia mobilnego zwykle znajduje się z tyłu korpusu i służy do robienia zdjęć i nagrywania filmów

Zaktualizowana wersja tabletu o ulepszonych parametrach i dużej autonomii.Smartfony Acer są rzadko odwiedzane...

Jak zmienić operatora zachowując numer

Jak zmienić operatora zachowując numer

1 grudnia w Rosji weszła w życie ustawa o zachowaniu numeru telefonu w przypadku zmiany abonenta na innego operatora komórkowego. Okazało się jednak, że...

recenzja phabletu, droga, ale bardzo kompetentna

recenzja phabletu, droga, ale bardzo kompetentna

Recenzja phableta, droga, ale bardzo kompetentna 20.03.2015 Jestem jedynym szewcem na świecie bez butów, recenzentem smartfonów bez własnego smartfona....

obraz kanału RSS