Pascal. Типы данных
Понятие данных является одним из ключевых в программировании, да и вообще в компьютерных науках. Грубо говоря, данные в информатике это информация, находящиеся в состоянии хранении, обработки или передачи, в какой-то отрезок времени. В машинах Тьюринга информация имеет тип, а он в свою очередь, зависит от рода информации.
Типы данных в Паскале определяют возможные значения переменных, констант, выражений и функций. Они бывают встроенными и пользовательскими. Встроенные типы изначально присутствуют в языке программирования, а пользовательские создаются программистом.
По способу представления и обработки типы данных бывают:
- простые
- структурированные
- указатели
- объекты
- процедуры
В этой статье будут рассмотрены лишь, наиболее простые типы данных, так как на начальных этапах обучения, вашей программе будет проще обойтись, например, без файлов и записей, чем без целочисленных или строковых переменных.
Целочисленный тип
Сюда входят несколько целочисленных типов, которые различаются диапазоном значений, количеством байт отведённых для их хранения и словом, с помощью которого объявляется тип.
Тип | Диапазон | Размер в байтах |
shortint | -128…127 | 1 |
integer | -32 768…32 767 | 2 |
longint | -2 147 483 648…2 147 483 647 | 4 |
byte | 0…255 | 1 |
word | 0…65 535 | 2 |
Объявить целочисленную переменную можно в разделе Var, например:
Над переменными этой категории можно выполнять все арифметические и логические операции за исключением деления (/), для него нужен вещественный тип. Также могут быть применены некоторые стандартные функции и процедуры.
Вещественный тип
В Паскале бывают следующие вещественные типы данных:
Тип | Диапазон | Память, байт | Количество цифр |
Real | 2.9e-39 … 1.7e38 | 6 | 11-12 |
Single | 1.5e-45 … 3.4e38 | 4 | 7-8 |
Double | 5.0e-324 …1.7e308 | 8 | 15-16 |
Extended | 3.4e-4932 … 1.1e493 | 10 | 19-20 |
Comp | -9.2e63 … (9.2e63)-1 | 8 | 19-20 |
Над ними может быть выполнено большее количество операций и функций, чем над целыми. Например, эти функции возвращают вещественный результат:
ln(x) – натуральный логарифм;
sqrt(x) – квадратный корень;
Логический тип
Переменная, имеющая логический тип данных может принимать всего два значения: true (истина) и false (ложь). Здесь истине соответствует значение 1, а ложь тождественная нулю. Объявить булеву переменную можно так:
Над данными этого типа могут выполняться операции сравнения и логические операции: not , and, or, xor.
Символьный тип
Символьный тип данных – это совокупность символов, используемых в том или ином компьютере. Переменная данного типа принимает значение одного из этих символов, занимает в памяти компьютера 1 байт. Слово Char определяет величину данного типа. Существует несколько способов записать символьную переменную (или константу):
- как одиночный символ, заключенный в апострофы: ‘W’, ‘V’, ‘п’;
- указав код символа, значение которого должно находиться в диапазоне от 0 до 255.
- при помощи конструкции ^K, где K – код управляющего символа. Значение K должно быть на 64 больше кода соответствующего управляющего символа.
К величинам символьного типа данных применимы операции отношения и следующие функции:
Succ(x) — возвращает следующий символ;
Pred(x) — возвращает предыдущий символ;
Ord(x) — возвращает значение кода символа;
Chr(x) — возвращает значение символа по его коду;
UpCase(x) — переводит литеры из интервала ‘a’..’z’ в верхний регистр.
Для плодотворной работы с символьным типом рекомендую пользоваться таблицей ASCII.
Строковый тип
Строка в Паскале представляет собой последовательность символов заключенных в апострофы, и обозначается словом String. Число символов (длина строки) должно не превышать 255. Если длину строки не указывать, то она автоматически определиться в 255 символов. Общий вид объявления строковой переменной выглядит так:
Каждый символ в строке имеет свой индекс (номер). Индекс первого байта – 0, но в нем храниться не первый символ, а длина всей строки, из чего следует, что переменная этого типа будет занимать на 1 байт больше числа переменных в ней. Номер первого символа – 1, например, если мы имеем строку S=‘stroka’, то S[1]=s;. В одном из следующих уроков строковый тип данных будет рассмотрен подробнее.
Перечисляемый тип данных
Перечисляемый тип данных представляет собой некоторое ограниченное количество идентификаторов. Эти идентификаторы заключаются в круглые скобки, и отделяются друг от друга запятыми.
Type Day=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Переменная A может принимать лишь значения определенные в разделе Type. Также можно объявить переменную перечисляемого типа в разделе Var:
Var A: (Monday, Tuesday);
К данному типу применимы операции отношения, при этом заранее определенно, что Monday = .. ;
Источник
10. Типы данных
Переменные бывают разных типов. Тип переменной определяет набор допустимых значений и операций. Типы делятся на простые, составные, строковые, варианты и классы.
Простые типы
Простые типы делятся на порядковые, вещественные и дата-время.
Порядковые типы имеют конечное множество возможных значений, их можно определенным образом упорядочить (отсюда и название) и сопоставить некоторое целое число.
Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
Тип дата-время предназначен для хранения даты и времени. Фактически для этих целей он использует вещественный формат.
Порядковые типы
К порядковым типам относятся целые, логические, символьный и перечисляемый. К любому из них применима функция Ord(x), которая возвращает порядковый номер значения выражения X.
Для целых типов функция Ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый).
К порядковым типам можно также применять функции:
Например, если в программе определена переменная:
то функция Pred(C) вернет символ ‘4’, а функция Succ(C) — символ ‘6’.
Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция pred(x) не определена для левого, a succ(X) – для правого конца этого отрезка.
Целые
Ниже приведена таблица поддерживаемых целых типов и диапазон допустимых значений:
Тип данных | Длина, байт | Диапазон допустимых значений |
Byte | 1 | 0 .. 255 |
Shortint | 1 | -128 .. +127 |
Smallint | 2 | -32 768 .. +32 767 |
Word | 2 | 0 .. 65 535 |
Integer | 4 | -2 147 483 648 .. +2 147 483 647 |
Longint | 4 | -2 147 483 648 .. +2 147 483 647 |
Cardinal | 4 | 0 .. 4 294 967 295 |
LongWord | 4 | 0 .. 4 294 967 295 |
Int64 | 8 | -9*10 18 .. +9*10 18 |
При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т. е. везде, где может использоваться Word, допускается использование Byte (но не наоборот), в Longint «входит» Smallint, который, в свою очередь, включает в себя Shortint.
Логические
Логический тип может принимать 2 значения: True или False. К логическим типам относят: Boolean, ByteBool, WordBool, LongBool. Первый тип является стандартным типом Паскаля, а последние три введены для совместимости с Windows. В данной реализации языка функция Ord вернет для True – 1, для False – 0.
В Pascal Script функция Ord для переменной типа Boolean также возвращает результат типа Boolean.
Символьный
К символьному типу относится тип Char, вмещает в себя 1 байт, символы с кодом 0..255. Переменной этого типа можно присвоить один символ:
Код | Символ | Код. | Символ | Код. | Символ | Код | Символ |
0 | NUL | 32 | BL | 64 | @ | 96 | ‘ |
1 | ЗОН | 33 | ! | 65 | А | 97 | а |
2 | STX | 34 | “ | 66 | В | 98 | b |
3 | ЕТХ | 35 | # | 67 | С | 99 | с |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | Е | 101 | е |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | ‘ | 71 | G | 103 | д |
8′ | BS | 40 | ( | 72 | Н | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | К | 107 | k |
12 | FF | 44 | f | 76 | L | 108 | 1 |
13 | CR | 45 | — | 77 | М | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | 0 | 111 | о |
16 | DEL | 48 | 0 | 80 | Р | 112 | P |
17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC 4 | 52 | 4 | 84 | Т | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | ETB | 55 | 7 | 87 | W | 119 | W |
24 | CAN | 56 | 8 | 88 | х | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | У |
26 | SUB | 58 | : | 90 | Z | .122 | z |
27 | ESC | 59 | ; | 91 | t | 123 | < |
28 | FS | 60 | 94 | Л | 126 |
Символы с кодами 0..31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.
Перечисляемый тип
Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:
Применение перечисляемых типов делает программы нагляднее. Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе — 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа Word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.
В Object Pascal присваивание переменным разных перечисляемых типов значений не своего типа приводит к ошибке несовместимости типов.
Однако компилятор Pascal Script не увидит ошибку и код будет работать. Будьте внимательны.
Вещественные типы
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа. Pascal Script поддерживает следующие вещественные типы:
Тип данных | Длина, байт | Количество значащих цифр | Диапазон допустимых значений |
Single | 4 | 7-8 | 1.5*10e-45 .. 3.4*10e38 |
Double | 8 | 15-16 | 5.0*10e324 .. 1.7*10e308 |
Extended | 10 | 19-20 | 3.4*10-4951 .. 1.1*10e4932 |
Currency | 8 | 19-20 | +/-922 337 203 685 477,5807 |
В DataExpress числовые поля имеют тип Double.
Сравнение вещественных чисел
Из-за того, что вещественные числа хранят приблизительное значение числа, их нельзя проверять на равенство с числовыми константами. Для сравнения используйте функцию SameValue. Пример:
Тип дата-время
Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и подобно Currency представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной — время.
Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время — как часть суток, прошедших с 0 часов, так что значение 36444,837 соответствует дате 11.10.1999 и времени 20:05. Количество суток может быть и отрицательным, однако значения меньшие -693594 (соответствует дате 00.00.0000 от Рождества Христова) игнорируются функциями преобразования даты к строковому типу.
Над данными типа TDateTime определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов. Например, можно без труда определить дату, отстоящую от заданной на сколько-то дней вперед или назад: для этого достаточно соответственно прибавить к заданной дате или отнять от нее нужное целое число. Например, оператор:
поместит в метку IbOutput дату, соответствующую текущей дате плюс 3 недели. Чуть сложнее с исчислением времени. Например, чтобы добавить к текущему времени полтора часа, следует использовать выражение:
Составные типы
К составным типам относятся: массивы, записи и множества. Они характеризуется множественностью образующих этот тип элементов. Каждый элемент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт (в реализации от RemObjects не проверялось).
Строковые типы
Строки представлены типами String, AnyString, AnsiString, WideString и PChar. Для всех типов строк, кроме PChar, память выделяется динамически, по мере необходимости. Типы String, AnyString, AnsiString являются синонимами. Тип String можно представить, как массив символов. Подобно массиву можно обращаться к отдельным символам строки по их индексу. Первый символ строки имеет индекс 1. Примеры работы со строками:
UTF-8 является основной кодировкой, база данных и скрипты используют именно эту кодировку.
К строкам применимы операции сравнения. Сравнение происходит посимвольно.
Тип WideString хранит строки в кодировке UTF-16. Каждый символ кодируется двумя байтами (за исключением символов с номерами больше FFFF — для обозначения таких символов используется четыре байта). Несмотря на то, что каждый символ занимает 2 байта, вы можете обратиться к символу по индексу, как если бы для кодирования использовался 1 байт. Строки этого типа используются OLE-объектами и функциями Windows API .
Символы, кодируемые четырьмя байтами всегда состоят из пары двухбайтовых слов (т.наз. «суррогатной пары»), первое из которых принадлежит диапазону D800..DBFF, а второе — диапазону DC00..DFFF. Символы, кодируемые двумя байтами не могут входить ни в один из этих диапазонов. Что позволяет при посимвольном обходе строки легко отличать двухбайтовые символы от частей четырёхбайтовых
Тип PChar представляет строки с завершающим нулем. Переменная типа PChar содержит указатель на массив строк. Концом строки считается символ с кодом #0. В чистом виде тип PChar не используется, т. к. Pascal Script не работает с указателями. Предположительно, он введен только для совместимости с функциями Windows API .
Pascal Script автоматически преобразует строку из одного типа в другой, так что работа со строками разных типов является прозрачной для разработчика.
Варианты
Переменная вариантного типа может принимать хранить значение следующих типов: целый, вещественный, логический, строка, дата-время, OLE-объект. Вариант представляет собой структуру, в которой хранятся сведения о типе и значении переменной. В выражениях и при передаче параметров в процедуры происходит попытка преобразования варианта к нужному типу. Если это не удается, будет ошибка “invalid variant type cast”. Вариант может хранить специальное значение Null (пусто, неизвестно).
Любая арифметическая операция с null даст в результате null. Попытка автоматического преобразования null к какому-либо типу (кроме Variant) приведет к ошибке ‘could not convert variant of type (Null) into type (…)’.
Варианты широко используются при работе с OLE-объектами. С помощью специальных функций можно узнать значение какого типа хранится в варианте или преобразовать значение к нужному типу.
Источник