Уважаемые коллеги, мы рады предложить вам, разрабатываемый нами учебный курс по программированию ПЛК фирмы Beckhoff с применением среды автоматизации TwinCAT. Курс предназначен исключительно для самостоятельного изучения в ознакомительных целях. Перед любым применением изложенного материала в коммерческих целях просим связаться с нами. Текст из предложенных вам статей скопированный и размещенный в других источниках, должен содержать ссылку на наш сайт heaviside.ru. Вы можете связаться с нами по любым вопросам, в том числе создания для вас систем мониторинга и АСУ ТП.
Типы данных в языках стандарта МЭК 61131-3
Уважаемые коллеги, в этой статье мы будем рассматривать важнейшую для написания программ тему — типы данных. Чтобы читатели понимали, в чем отличие одних типов данных от других и зачем они вообще нужны, мы подробно разберем, каким образом данные представлены в процессоре. В следующем занятии будет большая практическая работа, выполняя которую, можно будет потренироваться объявлять переменные и на практике познакомится с особенностями выполнения математических операций с различными типами данных.
Простые типы данных
В прошлой статье мы научились записывать цифры в двоичной системе счисления. Именно такую систему счисления используют все компьютеры, микропроцессоры и прочая вычислительная техника. Теперь мы будем изучать типы данных.
Любая переменная, которую вы используете в своем коде, будь то показания датчиков, состояние выхода или выхода, состояние катушки или просто любая промежуточная величина, при выполнении программы будет хранится в оперативной памяти. Чтобы под каждую используемую переменную на этапе компиляции проекта была выделена оперативная память, мы объявляем переменные при написании программы. Компиляция, это перевод исходного кода, написанного программистом, в команды на языке ассемблера понятные процессору. Причем в зависимости от вида применяемого процессора один и тот же исходный код может транслироваться в разные ассемблерные команды (вспомним что ПЛК Beckhoff, как и персональные компьютеры работают на процессорах семейства x86).
Как помните, из статьи Знакомство с языком LD, при объявлении переменной необходимо указать, к какому типу данных будет принадлежать переменная. Как вы уже можете понять, число B016 будет занимать гораздо меньший объем памяти чем число 4 C4E5 01E7 7A9016. Также одни и те же операции с разными типами данных будут транслироваться в разные ассемблерные команды. В TwinCAT используются следующие типы данных:
Биты
BOOL — это простейший тип данных, как уже было сказано, этот тип данных может принимать только два значения 0 и 1. Так же в TwinCAT, как и в большинстве языков программирования, эти значения, наравне с 0 и 1, обозначаются как TRUE и FALSE и несут в себе количество информации, соответствующее одному биту. Минимальным объемом данных, который читается из памяти за один раз, является байт, то есть восемь бит. Поэтому, для оптимизации скорости доступа к данным, переменная типа BOOL занимает восемь бит памяти. Для хранения самой переменной используется нулевой бит, а биты с первого по седьмой заполнены нулями. Впрочем, на практике о таком нюансе приходится вспоминать достаточно редко.
BIT — то же самое, что и BOOL, но в памяти занимает 1 бит. Как можно догадаться, операции с этим типом данных медленнее чем с типом BOOL, но он занимает меньше места в памяти. Тип данных BIT отсутствует в стандарте МЭК 61131-3 и поддерживается исключительно в TwinCAT, поэтому стоит отдавать предпочтение типу BOOL, когда у вас нет явных поводов использовать тип BIT.
Целочисленные типы данных
BYTE — тип данных, по размеру соответствующий одному байту. Хоть с типом BYTE можно производить математические операции, но в первую очередь он предназначен для хранения набора из 8 бит. Иногда в таком виде удобнее, чем побитно, передавать данные по цифровым интерфейсам, работать с входами выходами и так далее. С такими вопросами мы будем знакомится далее по мере изучения курса. В переменную типа BYTE можно записать числа из диапазона 0..255 (0..28-1).
WORD — то же самое, что и BYTE, но размером 16 бит. В переменную типа WORD можно записать числа из диапазона 0..65 535 (0..216-1). Тип данных WORD переводится с английского как «слово». Давным-давно термином машинное слово называли группу бит, обрабатываемых вычислительной машиной за один раз. Была уместна фраза «Программа состоит из машинных слов.». Со временем этим термином перестали пользоваться в прямом его значении, и сейчас под термином «машинное слово» обычно подразумевается группа из 16 бит.
DWORD — то же самое, что и BYTE, но размером 32 бит. В переменную типа DWORD можно записать числа из диапазона 0..4 294 967 295 (0..232-1). DWORD — это сокращение от double word, что переводится как двойное слово. Довольно часто буква «D» перед каким-либо типом данных значит, что этот тип данных в два раза длиннее, чем исходный.
LWORD — то же самое, что и BYTE, но размером 64 ;бит. В переменную типа LWORD можно записать числа из диапазона 0..18 446 744 073 709 551 615 (0..264-1). LWORD — это сокращение от long word, что переводится как длинное слово. Приставка «L» перед типом данных, как правило, означает что такой тип имеет длину 64 бита.
SINT — знаковый тип данных, длинной 8 бит. В переменную типа SINT можно записать числа из диапазона -128..127 (-27..27-1). В отличии от всех предыдущих типов данных этот тип данных предназначен для хранения именно чисел, а не набора бит. Слово знаковый в описании типа означает, что такой тип данных может хранить как положительные, так и отрицательные значения. Для хранения знака числа предназначен старший, в данном случае седьмой, разряд числа. Если старший разряд имеет значение 0, то число интерпретируется как положительное, если 1, то число интерпретируется как отрицательное. Приставка «S» означает short, что переводится с английского как короткий. Как вы догадались, SINT короткий вариант типа INT.
USINT — беззнаковый тип данных, длинной 8 бит. В переменную типа USINT можно записать числа из диапазона 0..255 (0..28-1). Приставка «U» означает unsigned, переводится как беззнаковый.
Остальные целочисленные типы аналогичны уже описанным и отличаются только размером. Сведем все целочисленные типы в таблицу.
Тип данных | Нижний предел | Верхний предел | Занимаемая память |
BYTE | 0 | 255 | 8 бит |
WORD | 0 | 65 535 | 16 бит |
DWORD | 0 | 4 294 967 295 | 32 бит |
LWORD | 0 | 264-1 | 64 бит |
SINT | -128 | 127 | 8 бит |
USINT | 0 | 255 | 8 бит |
INT | -32 768 | 32 767 | 16 бит |
UINT | 0 | 65 535 | 16 бит |
DINT | -2 147 483 648 | 2 147 483 647 | 32 бит |
UDINT | 0 | 4 294 967 295 | 32 бит |
LINT | -263 | -263-1 | 64 бит |
ULINT | 0 | -264-1 | 64 бит |
Выше мы рассматривали целочисленные типы данных, то есть такие типы данных, в которых отсутствует запятая. При совершении математических операций с целочисленными типами данных есть некоторые особенности:
- Округление при делении: округление всегда выполняется вниз. То есть дробная часть просто отбрасывается. Если делимое меньше делителя, то частное всегда будет равно нулю, например, 10/11 = 0.
- Переполнение: если к целочисленной переменной, например, SINT, имеющей значение 255, прибавить 1, переменная переполнится и примет значение 0. Если прибавить 2, переменная примет значение 1 и так далее. При операции 0 — 1 результатом будет 255. Это свойство очень схоже с устройством стрелочных часов. Если сейчас 2 часа, то 5 часов назад было 9 часов. Только шкала часов имеет пределы не 1..12, а 0..255. Иногда такое свойство может использоваться при написании программ, но как правило не стоит допускать переполнения переменных.
Подробно такие нюансы разбираются в пособиях по дискретной математике. Мы на них пока что останавливаться не будем, но о приведенных двух особенностях не стоит забывать при написании программ.
Можно встретить упоминания о данных с фиксированной запятой, это такие данные, в которых количество знаков после запятой строго фиксировано. В TwinCAT типы данных с фиксированной запятой отсутствуют в чистом виде. TwinCAT поддерживает типы данных с плавающей запятой, то есть количество знаков до и после запятой может быть любым в пределах поддерживаемого диапазона.
Типы данных с плавающей запятой
REAL — тип данных с плавающей запятой длинной 32 бита. В переменную типа REAL можно записать числа из диапазона -3.402 82*1038..3.402 82*1038.
LREAL — тип данных с плавающей запятой длинной 64 бита. В переменную типа LREAL можно записать числа из диапазона -1.797 693 134 862 315 8*10308..1.797 693 134 862 315 8*10308.
При присваивании значения типам REAL и LREAL присваиваемое значение должно содержать целую часть, разделительную точку и дробную часть, например, 7.4 или 560.0.
Так же при записи значения типа REAL и LREAL использовать экспоненциальную (научную) форму. Примером экспоненциальной формы записи будет Me+P, в этом примере
- M называется мантиссой.
- e называется экспонентой (от англ. «exponent»), означающая «·10^» («…умножить на десять в степени…»),
- P называется порядком.
Примерами такой формы записи будет:
- 1.64e+3 расшифровывается как 1.64e+3 = 1.64*103 = 1640.
- 9.764e+5 расшифровывается как 9.764e+5 = 9.764*105 = 976400.
- 0.3694e+2 расшифровывается как 0.3694e+2 = 0.3694*102 = 36.94.
Еще один способ записи присваиваемого значения переменной типа REAL и LREAL, это добавить к числу префикс REAL#, например, REAL#7.4 или REAL#560. В таком случае можно не указывать дробную часть.
Старший, 31-й бит переменной типа REAL представляет собой знак. Следующие восемь бит, с 30-го по 23-й отведены под экспоненту. Оставшиеся 23 бита, с 22-го по 0-й используются для записи мантиссы.
В переменной типа LREAL старший, 63-й бит также используется для записи знака. В следующие 11 бит, с 62 по 52-й, записана экспонента. Оставшиеся 52 бита, с 51-го по 0-й, используются для записи мантиссы.
При записи числа с большим количеством значащих цифр в переменные типа REAL и LREAL производится округление. Необходимо не забывать об этом в расчетах, к которым предъявляются строгие требования по точности. Еще одна особенность, вытекающая из прошлой, если вы хотите сравнить два числа типа REAL или LREAL, прямое сравнение мало применимо, так как если в результате округления числа отличаются хоть на малую долю результат сравнения будет FALSE. Чтобы выполнить сравнение более корректно, можно вычесть одно число из другого, а потом оценить больше или меньше модуль получившегося результата вычитания, чем наибольшая допустимая разность. Поведение системы при переполнении переменных с плавающей запятой не определенно стандартом МЭК 61131-3, допускать его не стоит.
Строковые типы данных
STRING — тип данных для хранения символов. Каждый символ в переменной типа STRING хранится в 1 байте, в кодировке Windows-1252, это значит, что переменные такого типа поддерживают только латинские символы. При объявлении переменной количество символов в переменной указывается в круглых или квадратных скобках. Если размер не указан, при объявлении по умолчанию он равен 80 символам. Для данных типа STRING количество содержащихся в переменной символов не ограниченно, но функции для обработки строк могут принять до 255 символов.
Объем памяти, необходимый для переменной STRING, всегда составляет 1 байт на символ +1 дополнительный байт, например, переменная объявленная как «STRING [80]» будет занимать 81 байт. Для присвоения константного значения переменной типа STRING присваемый текст необходимо заключить в одинарные кавычки.
Пример объявления строки на 35 символов:
sVar : STRING(35) := 'This is a String'; (*Пример объявления переменной типа STRING*)
WSTRING — этот тип данных схож с типом STRING, но использует по 2 байта на символ и кодировку Unicode. Это значит что переменные типа WSTRING поддерживают символы кириллицы. Для присвоения константного значения переменной типа WSTRING присваемый текст необходимо заключить в двойные кавычки.
Пример объявления переменной типа WSTRING:
wsVar : WSTRING := "This is a WString"; (*Пример объявления переменной типа WSTRING*)
Если значение, присваиваемое переменной STRING или WSTRING, содержит знак доллара ($), следующие два символа интерпретируются как шестнадцатеричный код в соответствии с кодировкой Windows-1252. Код также соответствует кодировке ASCII.
Код со знаком доллара | Его значение в переменной |
$<восьмибитное число> | Восьмибитное число интерпретируется как символ в кодировке ISO / IEC 8859-1 |
‘$41’ | A |
‘$9A’ | © |
‘$40’ | @ |
‘$0D’, ‘$R’, ‘$r’ | Разрыв строки |
‘$0A’, ‘$L’, ‘$l’, ‘$N’, ‘$n’ | Новая строка |
‘$P’, ‘$p’ | Конец страницы |
‘$T’, ‘$t’ | Табуляция |
‘$$’ | Знак доллара |
‘$’ ‘ | Одиночная кавычка |
Такое разнообразие кодировок связанно с тем, что у всех из них первые 128 символов соответствуют кодовой таблице ASCII, но в статье для каждого случая кодировка указывалась так же, как она указана в infosys.
Пример:
VAR CONSTANT
sConstA : STRING :='Hello world';
sConstB : STRING :='Hello world $21'; (*Пример объявления переменной типа STRING с спец символом*)
END_VAR
Типы данных времени
TIME — тип данных, предназначенный для хранения временных промежутков. Размер типа данных 32 бита. Этот тип данных интерпретируется в TwinCAT, как переменная типа DWORD, содержащая время в миллисекундах. Нижний допустимый предел 0 (0 мс), верхний предел 4 294 967 295 (49 дней, 17 часов, 2 минуты, 47 секунд, 295 миллисекунд). Для записи значений в переменные типа TIME используется префикс T# и суффиксы d: дни, h: часы, m: минуты, s: секунды, ms: миллисекунды, которые должны располагаться в порядке убывания.
Примеры корректного присваивания значения переменной типа TIME:
TIME1 : TIME := T#14ms;
TIME1 : TIME := T#100s12ms; // Допускается переполнение в старшем отрезке времени.
TIME1 : TIME := t#12h34m15s;
Примеры некорректного присваивания значения переменной типа TIME, при компиляции будет выдана ошибка:
TIME1 : TIME := t#5m68s; // Переполнение не в старшем отрезке времени недопустимо
TIME1 : TIME := 15ms; // Пропущен префикс T#
TIME1 : TIME := t#4ms13d; // Не соблюден порядок записи временных отрезок
LTIME — тип данных аналогичен TIME, но его размер составляет 64 бита, а временные отрезки хранятся в наносекундах. Нижний допустимый предел 0, верхний предел 213 503 дней, 23 часов, 34 минуты, 33 секунд, 709 миллисекунд, 551 микросекунд и 615 наносекунд. Для записи значений в переменные типа LTIME используется префикс LTIME#. Помимо суффиксов, используемых для записи типа TIME для LTIME, используются µs: микросекунды и ns: наносекунды.
Пример:
LTIME1 : LTIME := LTIME#1000d15h23m12s34ms2us44ns; (*Пример объявления переменной типа LTIME*)
TIME_OF_DAY (TOD) — тип данных для записи времени суток. Имеет размер 32 бита. Нижнее допустимое значение 0, верхнее допустимое значение 23 часа, 59 минут, 59 секунд, 999 миллисекунд. Для записи значений в переменные типа TOD используется префикс TIME_OF_DAY# или TOD#, значение записывается в виде <часы : минуты : секунды> . В остальном этот тип данных аналогичен типу TIME.
Пример:
TIME_OF_DAY#15:36:30.123
tod#00:00:00
Date — тип данных для записи даты. Имеет размер 32 бита. Нижнее допустимое значение 0 (01.01.1970), верхнее допустимое значение 4 294 967 295 (7 февраля 2106), да, здесь присутствует возможный компьютерный апокалипсис, но учитывая запас по верхнему пределу, эта проблема не слишком актуальна. Для записи значений в переменные типа TOD используется префикс DATE# или D#, значение записывается в виде <год — месяц — дата>. В остальном этот тип данных аналогичен типу TIME.
DATE#1996-05-06
d#1972-03-29
DATE_AND_TIME (DT) — тип данных для записи даты и времени. Имеет размер 32 бита. Нижнее допустимое значение 0 (01.01.1970), верхнее допустимое значение 4 294 967 295 (7 февраля 2106, 6:28:15). Для записи значений в переменные типа DT используется префикс DATE_AND_TIME # или DT#, значение записывается в виде <год — месяц — дата — час : минута : секунда>. В остальном этот тип данных аналогичен типу TIME.
DATE_AND_TIME#1996-05-06-15:36:30
dt#1972-03-29-00:00:00
На этом раз мы заканчиваем рассмотрение типов данных. Сейчас мы разобрали не все типы данных, остальные можно найти в infosys по пути TwinCAT 3 → TE1000 XAE → PLC → Reference Programming → Data types.
Следующая статья будет целиком состоять из практической работы, мы напишем калькулятор на языке LD.
stesl писал(а): ↑23 мар 2021, 10:37
Тип Word — это целочисленный беззнаковый тип данных, в два байта. Диапазон 0-65535. Используется везде, где оказывается нужным.
Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
Потому что:
Sergy6661 писал(а): ↑23 мар 2021, 12:54
Вот для упаковки-распаковки битовых переменных и используется в основном.
Но не в основном, а только для этого. Если конечно в конкретном ПЛК не срабатывает неявное преобразование, из-за которого кажется, что Word — это целое число.
Отправлено спустя 21 минуту 7 секунд:
Не, иначе объясню:
Word — это когда ты в 16 бит записал 16 булевых значений, каждый из которых что-то значит в смысле true/false. Например, при управлении сервоприводом или частотником.
Int16, UInt16 — это числа, отдельные биты не представляют интереса (хотя бывают редкие исключения).
Математические операции умеют работать с числами, то есть Add(), Sub(), Mul(), Div() работают с Int16/UInt16, а с Word работает подозрительно, подсвечивает типа «глянь, что за дрянь ты задумал?», но воспринимает как число 0-65535. Извините, правда, зачем вы складываете слово управления частотника с числом -85?
Зато сдвиговые операции и операции со словами типа ANDW(), ORW(), NOT(W), XORW() работают именно со словами и подозрительно с целыми числами.
Это разные типы данных, хотя все они 16 бит.
На занятии рассматриваются основные стандартные типы данных в Паскаль, понятие переменной и константы; объясняется, как работать с арифметическими операциями
Содержание:
- Типы данных в Паскале
- Целочисленные типы данных в Паскаль
- Комментарии в Паскале
- Вещественные типы данных в Паскаль
- Приведение типов
- Константы в Паскале
- «Красивый» вывод целых и вещественных чисел
- Арифметические операции в Паскале
- Порядок выполнения операций
- Стандартные арифметические процедуры и функции Pascal
Типы данных в Паскале
Паскаль — это типизированный язык программирования. Это означает, что переменные, в которых хранятся данные, имеют определенный тип данных. Т.е. программе напрямую надо указать, какие данные могут храниться в той или иной переменной: текстовые данные, числовые данные, если числовые — то целочисленные или дробные, и т.п. Это необходимо в первую очередь для того чтобы компьютер «знал», какие операции можно выполнять с этими переменными и как правильно их выполнять.
Например, сложение текстовых данных, или как это правильно называется в программировании — конкатенация — это обычное слияние строк, тогда как сложение числовых данных происходит поразрядно, кроме того, дробные и целые числа складываются тоже по-разному. То же самое касается и других операций.
Рассмотрим наиболее распространенные в Pascal типы данных.
Целочисленные типы данных в Паскаль
Тип | Диапазон | Требуемая память (байт) |
byte | 0..255 | 1 |
shortint | -128..127 | 1 |
integer | -32768.. 32767 | 2 |
word | 0..65535 | 2 |
longint | -2147483648..2147483647 | 4 |
Нужно иметь в виду, что при написании программ в паскале integer (в переводе с англ. целое) является наиболее часто используемым, так как диапазон значений наиболее востребуем. Если необходим более широкий диапазон, используется longint (long integer, в переводе с англ. длинное целое). Тип byte в Паскале используется, когда нет необходимости работать с отрицательными значениями, то же самое касается и типа word (только диапазон значений здесь значительно больше).
Примеры того, как описываются (объявляются) переменные в Паскале:
Pascal | PascalABC.NET | ||||
|
|
Результат: имя: Петр, возраст: 17
При использовании PascalABC.NET наиболее часто используются следующие целочисленные типы:
Тип | Длина, байт | Диапазон допустимых значений |
---|---|---|
integer | 4 | -2 147 483 648 .. 2 147 483 647 |
int64 | 8 | -9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807 |
BigInteger | переменная | неограниченный |
Комментарии в Паскале
Обратите внимание на то, как используются комментарии в Паскале. В примере комментарии, т.е. служебный текст, который «не видим» для компилятора, заключаются в фигурные скобки {}
. Обычно комментарии делаются программистами с целью пояснения фрагментов кода. Для однострочных комментариев можно использовать два слэша //
:
{Очень простая программа для вывода слова "Привет"} begin // вывод write('Привет'); end.
Задача 5. Население Москвы равняется а=9000000
жителей. Население Нью-Васюков равняется b=1000
жителей. Напишите программу, которая определяет разницу в числе жителей между двумя городами. Используйте переменные величины.
[Название файла: L1task5.pas
]
Вещественные типы данных в Паскаль
Вещественные числа в Паскале и вообще в программировании — это название дробных чисел.
Тип | Диапазон | Требуемая память (байт) |
real | 2.9 * 10E-39 .. 1.7 * 10E38 | 6 |
single | 1.5 * 10 E-45 .. 3.4 * 10E38 | 4 |
double | 5 * 10E-324 .. 1.7 * 10E308 | 8 |
extended | 1.9 * 10E-4951 .. 1.1 * 10E4932 | 10 |
Тип real
в Паскале — наиболее часто используемый из вещественных типов.
Выше были представлены простые типы данных в Паскаль, к которым относятся:
- Порядковые
- Целые
- Логические
- Символьные
- Перечисляемые
- Интервальные
- Вещественные
Для вывода значений переменных вещественного типа обычно используется форматированный вывод:
в формате используется либо одно число, означающее число позиций, отводимых на это число в экспоненциальной форме; p:=1234.6789; Writeln(p:12); {_1.2346E+004}либо два числа, первое из которых обозначает общий размер поля, отведенного под это число, второе — число знаков после запятой, т.е. точность. p:=1234.6789; Writeln(p:6:2); {1234.68}
Наряду с простыми типами в языке еще используются структурированные типы данных и указатели, которым будут посвящены последующие уроки по Паскалю.
Приведение типов
В pascalABC.Net в некоторых случаях можно значения одного типа присваивать переменным другого типа.
Значения типов данных, которые занимают меньше памяти, можно присвоить переменным типа данных с бОльшей емкостью. Так, возможны следующие приведения:
integer → int64 int64 → real integer → BigInteger
Пример использования операции приведения типов:
var a := 10; // integer var b := 123456789012345; // int64 var c := -3bi; // BigInteger var i := int64(a); // приведение integer → int64 var x := real(b); // приведение int64 → real var p := BigInteger(a); // приведение integer → BigInteger
Обратное приведение с помощью функций
Обратное приведение, т.е. чтобы присвоить значение большей ёмкости переменной типа данных меньшей емкости, следует использовать функции округления. Например:
real → integer
Пример:
## var x := Sqrt(3); // корень квадратный из 3, тип real var a := Trunc(x); // приведение к integer с отсечением дробной части. рез-т 1 var b := Round(x); // приведение к integer с округлением до ближайшего целого. рез-т 2
Константы в Паскале
Зачастую в программе заранее известно, что переменная будет принимать какое-то конкретное значение и не менять его на протяжении выполнения всей программы. В таком случае необходимо использовать константу.
Объявление константы в Паскале происходит до объявления переменных (до служебного слова var
) и выглядит следующим образом:
Пример описания константы в Паскале:
Pascal | PascalABC.NET | ||||
|
|
«Красивый» вывод целых и вещественных чисел
Для того чтобы после вывода значений переменных оставались отступы, чтобы значения не «сливались» друг с другом, принято через двоеточие указывать какое количество символов нужно предусмотреть для вывода значения:
Вывод целых чисел
Вывод вещественных чисел
Арифметические операции в Паскале
ДЕЙСТВИЕ | РЕЗУЛЬТАТ | СМЫСЛ |
---|---|---|
2 + 3 | 5 | плюс |
4 — 1 | 3 | минус |
2 * 3 | 6 | умножить |
10 / 5 | 2 | разделить |
10 ** 2 | 100 | возведение в степень с результатом типа real |
17 div 5 | 3 | целочисленное деление |
17 mod 5 | 2 | остаток от целочисленного деления |
Порядок выполнения операций
- вычисление выражений в скобках;
- умножение, деление, div, mod слева направо;
- сложение и вычитание слева направо.
Канонический способ:
var a: integer; b: real; begin a := 1; writeln('a := 1; a = ',a); a += 2; // Увеличение на 2 writeln('a += 2; a = ',a); a *= 3; // Умножение на 3 writeln('a *= 3; a = ',a); writeln; b := 6; writeln('b := 6; b = ',b); r /= 2; writeln('b /= 2; b = ',b); end.
Стандартные арифметические процедуры и функции Pascal
Здесь стоит более подробно остановиться на некоторых арифметических операциях.
- Операция
inc
в Паскале, произносимая как инкремент, это стандартная процедура pascal, которая обозначает увеличение на единицу. - Аналогично работает процедура
Dec
в Паскале:Dec(x)
— уменьшает x на 1 (декремент) илиDec(x,n)
— уменьшает x на n. - Оператор
abs
представляет собой модуль числа. Работает следующим образом: - Оператор
div
в паскале является часто используемым, так как целый ряд задач связан с действием деление нацело. -
Остаток от деления или оператор
mod
в pascal тоже незаменим при решении ряда задач. - Заслуживающей внимания является стандартная функция
odd
Паскаля, которая определяет, является ли целое число нечетным. Т. е. возвращаетtrue
(истина) для нечетных чисел,false
(ложь) для четных чисел. - Функция
exp
в паскале возвращает экспоненту параметра. Записывается какexp(x)
, где x типа real. - Квадрат числа в Паскале вычисляется при помощи процедуры
sqr
. - Операция возведение в степень в Паскале отсутствует как таковая. Но для того чтобы возвести в степень число можно использовать функцию
exp
. - Извлечь квадратный корень в Паскале можно при помощи процедуры
sqrt
.
Пример операции inc:
1 2 3 |
x:=1; inc(x); {Увеличивает x на 1, т.е. x=2} writeln (х) |
Более сложное использование процедуры inc:
Inc(x,n)
где x — порядкового типа, n — целого типа; процедура inc увеличивает x на n.
a:=-9; b:=abs(a); { b = 9}
Пример использования функции odd:
1 2 3 4 |
begin WriteLn(Odd(5)); {True} WriteLn(Odd(4)); {False} end. |
Пример использования процедуры sqr в Pascal:
1 2 3 4 5 |
var x:integer; begin x:=3; writeln(sqr(x)); {ответ 9} end. |
Формула такая: exp(ln(a)*n)
, где а
— число, n
— степень (а>0).
Однако в компиляторе pascal abc возведение в степень осуществляется значительно проще:
WriteLn(Power(2,3)); {ответ 8}
Пример использования процедуры sqrt в Pascal:
1 2 3 4 5 |
var x:integer; begin x:=9; writeln(sqrt(x)); {ответ 3} end. |
Задача 6. Известны размеры спичечной коробки: высота — 12.41 см., ширина — 8 см., толщина — 5 см. Вычислить площадь основания коробки и ее объем
(S=ширина * толщина, V=площадь*высота)
[Название файла: L1task6.pas
]
Задача 7. В зоопарке три слона и довольно много кроликов, причем количество кроликов часто меняется. Слону положено съедать в сутки сто морковок, а кролику — две. Каждое утро служитель зоопарка сообщает компьютеру количество кроликов. Компьютер в ответ на это должен сообщить служителю общее количество морковок, которые сегодня нужно скормить кроликам и слонам.
[Название файла: L1task7.pas
]
Задача 8. Известно, что x кг конфет стоит a рублей. Определите, сколько стоит y кг этих конфет, а также, сколько килограмм конфет можно купить на k рублей. Все значения вводит пользователь.
[Название файла: L1task8.pas
]
В приведенных ниже примерах все функции имеют аргументы. Аргументы
m
и n
имеют целочисленный тип,
a
и b
– тип real,
x
и y
– любой из этих типов.
Abs(x) – возвращает абсолютное значение аргумента x; Ceil(x) - возвращает ближайшее целое, не меньшее, чем х; Floor(x) - возвращает ближайшее целое, не превышающее х; Frac(x) - возвращает дробную часть аргумента x; Max(x, y, …) – возвращает максимальное из значений x, y, …; Min(x, y, …) – возвращает минимальное из значений x, y, … ; Random(m) – возвращает случайное число из интервала [0 ; m-1]; Random(a) – возвращает случайное число из интервала [0 ; a); Random(m, n) – возвращает случайное число из интервала [m ; n]; Random(a, b) – возвращает случайное число из интервала [a ; b); Random2(m) – возвращает кортеж из двух случайных чисел в интервале [0 ; m-1]; Random2(a) – возвращает кортеж из двух случайных чисел в интервале [0 ; a); Random2(m, n) – возвращает кортеж из двух случайных чисел в интервале [m ; n]; Random2(a, b) – возвращает кортеж из двух случайных чисел в интервале [a ; b); Random3(m) – возвращает кортеж из трех случайных чисел в интервале [0 ; m-1]; Random3(a, b) – возвращает кортеж из трех случайных чисел в интервале [a ; b); Round(x) - возвращает округленное до целых по правилам арифметики значение типа integer; Round(x, n) - возвращает значение х, округленное до n знаков в дробной части; Sign(x) – возвращает -1 при x < 0, 0 при x = 0 и 1 при x > 0; Sin(x) – возвращает sin(x) типа real; Sqr(a) – возвращает a2; Sqr(m) – возвращает m2 типа int64; Sqrt(x) – возвращает √x типа real; Trunc(a) – возвращает целую часть значения a того же типа
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
Bahasa Indonesia (id) │
italiano (it) │
русский (ru) │
Общее
На этой странице представлена подборка типов данных в Free Pascal.
Тип данных — это шаблон для поля данных.
Тип данных поля определяет, как компилятор и процессор интерпретируют его содержимое.
Видимость поля данных зависит от местоположения его объявления.
Целочисленные типы
Беззнаковые типы
Поля данных целых типов без знака могут содержать только «положительные» целые числа.
- UInt8 — Диапазон: (0 .. 255)
- Byte — Диапазон: (0 .. 255)
- UInt16 — Диапазон: (0 .. 65535)
- Word — Диапазон: (0 .. 65535)
- NativeUInt — Диапазон: зависит от типа процессора.
- DWord — эквивалентно Longword.
- Cardinal — эквивалентно Longword.
- UInt32 — Диапазон: (0 .. 4294967295)
- Longword — Диапазон: (0 .. 4294967295)
- UInt64 — Диапазон: (0 .. 18446744073709551615)
- QWord — Диапазон: (0 .. 18446744073709551615)
Типы со знаком
Поля данных целых типов со знаком могут содержать положительные и отрицательные целые числа.
- Int8 — Диапазон: (-128 .. 127)
- ShortInt — Диапазон: (-128 .. 127)
- Int16 — Диапазон: (-32768 .. 32767)
- SmallInt — Диапазон: (-32768 .. 32767)
- Integer — Диапазон: это эквивалент либо Smallint, либо Longint (для 16 или 32-разрядных процессоров соответственно).
- Int32 — Диапазон: (-2147483648 .. 2147483647)
- NativeInt — Диапазон: зависит от типа процессора.
- Longint — Диапазон: (-2147483648 .. 2147483647)
- Int64 — Диапазон: (-9223372036854775808 .. 9223372036854775807)
Типы с плавающей точкой
Поля данных типов с плавающей точкой могут содержать:
- положительные и отрицательные целые числа с возможными ошибками округления.
- положительные и отрицательные числа с плавающей точкой.
- Single — Диапазон: (1.5E-45 .. 3.4E38)
- Real — Диапазон: зависит от платформы.
- Real48 — Диапазон: 2.9E-39 .. 1.7E38
- Double — Диапазон: (5.0E-324 .. 1.7E308)
- Extended — Диапазон: зависит от платформы.
- Comp — Диапазон: (-2E64+1 .. 2E63-1)
- Currency — Диапазон: (-922337203685477.5808 .. 922337203685477.5807)
Логические(булевы) типы
Поля данных логического типа содержат значения истинности.
- Boolean — Диапазон: (True, False), 8 Bit
- ByteBool — Диапазон: (True, False), 8 Bit
- WordBool — Диапазон: (True, False), 16 Bit
- LongBool — Диапазон: (True, False), 32 Bit
Перечислимые типы
Поля данных перечислимого типа являются «списками» (перечислениями) целочисленных беззнаковых констант.
- Enum Type — Диапазон: (интегральные типы данных)
Символьные типы
Типы символов с однобайтовой кодировкой
- Char — Постоянная длина: 1 байт, представление: 1 символ.
- ShortString — Максимальная длина: 255 символов.
- String — Максимальная длина: Short String или Ansistring (зависит от используемого параметра компилятора).
- PChar — Указатель на строку с нулевым символом на конце без ограничения длины.
- AnsiString — Нет ограничений по длине.
- PAnsiChar — Указатель на строку с нулевым символом в конце без ограничения длины.
Смотрите обзор различных типов символов и строк.
Типы символов с многобайтовой кодировкой
Кодировка с 2 или 4 байтами зависит от [используемой операционной] системы.
- WideChar — Постоянная длина: 2 или 4 байта, представление: 1 символ.
- WideString — Нет ограничений по длине.
- PWideChar — Указатель на терминированную строку с нулевым символом на конце без ограничения длины.
- UnicodeChar — Постоянная длина: 2 или 4 байта, представление: 1 символ.
- UnicodeString — Нет ограничений по длине.
- PUnicodeChar — Указатель на терминированную Unicode-строку с нулевым символом на конце без ограничения длины.
Смотрите обзор различных типов символов и строк.
Вариантные типы
- Variant
- Olevariant
Константы
- Нетипизированные константы
- Const — Можно использовать только простые типы данных.
- Типизированные константы
- Const — Можно использовать простые типы данных, а также записи и массивы.
- Resource Strings
- Resourcestring — Используется для локализации (доступно не во всех режимах компиляции).
Структурные типы
- Array — Размер массива зависит от типа и количества элементов, которые он содержит.
- Record — Сочетание нескольких типов данных.
- Set — Набор элементов порядкового типа; размер зависит от количества элементов в нем.
Типы поддиапазонов
- Типы поддиапазонов являются подмножеством базового типа.
Указатель
- Указатель — Размер зависит от типа процессора.
Классы и объекты
- Object — Разработано под Turbo Pascal 5.5 для DOS и предшественников класса.
- Class — Разработано под Delphi 1.0 для Windows и наследников объекта.
Целые числа
Данные каким-либо образом необходимо представлять в памяти компьютера. Существует множество различных типов данных, простых и довольно сложных, имеющих большое число компонентов и свойств. Однако, для компьютера необходимо использовать некий унифицированный способ представления данных, некоторые элементарные составляющие, с помощью которых можно представить данные абсолютно любых типов. Этими составляющими являются числа, а вернее, цифры, из которых они состоят. С помощью цифр можно закодировать практически любую дискретную информацию. Поэтому такая информация часто называется цифровой (в отличие от аналоговой, непрерывной).
Первым делом необходимо выбрать систему счисления, наиболее подходящую для применения в конкретных устройствах. Для электронных устройств самой простой реализацией является двоичная система: есть ток — нет тока, или малый уровень тока — большой уровень тока. Хотя наиболее эффективной являлась бы троичная система. Наверное, выбор двоичной системы связан еще и с использование перфокарт, в которых она проявляется в виде наличия или отсутствия отверстия. Отсюда в качестве цифр для представления информации используются 0 и 1.
Таким образом данные в компьютере представляются в виде потока нулей и единиц. Один разряд этого потока называется битом. Однако в таком виде неудобно оперировать с данными вручную. Стандартом стало разделение всего потока на равные последовательные группы из 8 битов — байты или октеты. Далее несколько байтов могут составлять слово. Здесь следует разделять машинное слово и слово как тип данных. В первом случае его разрядность обычно равна разрядности процессора, т.к. машинное слово является наиболее эффективным элементом для его работы. В случае, когда слово трактуется как тип данных (word), его разрядность всегда равна 16 битам (два последовательных байта). Также как типы данных существую двойные слова (double word, dword, 32 бита), четверные слова (quad word, qword, 64 бита) и т.п.
Теперь мы вплотную подошли к представлению целых чисел в памяти. Т.к. у нас есть байты и различные слова, то можно создать целочисленные типы данных, которые будут соответствовать этим элементарным элементам: byte (8 бит), word (16 бит), dword (32 бита), qword (64 бита) и т.д. При этом любое число этих типов имеет обычное двоичное представление, дополненное нулями до соответствующей размерности. Можно заметить, что число меньшей размерности можно легко представить в виде числа большей размерности, дополнив его нулями, однако в обратном случае это не верно. Поэтому для представления числа большей размерности необходимо использовать несколько чисел меньшей размерности. Например:
- qword (64 бита) можно представить в виде 2 dword (32 бита) или 4 word (16 бит) или 8 byte (8 бит);
- dword (32 бита) можно представить в виде 2 word (16 бит) или 4 byte (8 бит);
- word (16 бит) можно представить в виде 2 byte (8 бит);
Если A — число, B1..Bk — части числа, N — разрядность числа, M — разрядность части, N = k*M, то:
Например:
- A = F1E2D3C4B5A69788 (qword)
- A = 232 * F1E2D3C4 (dword) + 20 * B5A69788 (dword)
- A = 248 * F1E2 (word) + 232 * D3C4 (word) + 216 * B5A6 (word) + 20 * 9788 (word)
- A = 256 * F1 (byte) + 248 * E2 (byte) + … + 28 * 97 (byte) + 20 * 88 (byte)
Существуют понятия младшая часть (low) и старшая часть (hi) числа. Старшая часть входит в число с коэффициентом 2N-M, а младшая с коэффициентом 20. Например:
Байты числа можно хранить в памяти в различном порядке. В настоящее время используются два способа расположения: в прямом порядке байт и в обратном порядке байт. В первом случае старший байт записывается в начале, затем последовательно записываются остальные байты, вплоть до младшего. Такой способ используется в процессорах Motorola и SPARC. Во втором случае, наоборот, сначала записывает младший байт, а затем последовательно остальные байты, вплоть до старшего. Такой способ используется в процессорах архитектуры x86 и x64. Далее приведен пример:
Используя подобные целочисленные типы можно представить большое количество неотрицательных чисел: от 0 до 2N-1, где N — разрядность типа. Однако, целочисленный тип подразумевает представление также и отрицательных чисел. Можно ввести отдельные типы для отрицательных чисел от -2N до -1, но тогда такие типы потеряют универсальность хранить и неотрицательные, и отрицательные числа. Поэтому для определения знака числа можно выделить один бит из двоичного представления. По соглашению, это старший бит. Остальная часть числа называется мантиссой.
Если старший бит равен нулю, то мантисса есть обычное представление числа от 0 до 2N-1-1. Если же старший бит равен 1, то число является отрицательным и мантисса представляет собой так называемый дополнительный код числа. Поясним на примере:
Как видно из рисунка, дополнительный код равен разнице между числом 2N-1 и модулем исходного отрицательного числа (127 (1111111) = 128 (10000000) — |-1| (0000001)). Из этого вытекает, что сумма основного и дополнительного кода одного и того же числа равна 2N-1.
Из вышеописанного получается, что можно использовать только целочисленные типы со знаком для описания чисел. Однако существует множество сущностей, которые не требуют отрицательных значений, а значит, место под знак можно включить в представление неотрицательного числа, удвоив количество различных неотрицательных значений. Как результат, в современных компьютерах используются как типы со знаком или знаковые типы, так и типы без знака или беззнаковые типы.
В итоге можно составить таблицу наиболее используемых целочисленных типов данных:
Общее название | Название в Pascal | Название в C++ | Описание | Диапазон значений |
unsigned byte | byte | unsigned char | беззнаковый 8 бит | 0..255 |
signed byte | shortint | char | знаковый 8 бит | -128..127 |
unsigned word | word | unsigned short | беззнаковый 16 бит | 0..65535 |
signed word | smallint | short | знаковый 16 бит | -32768..32767 |
unsigned double word | cardinal | unsigned int | беззнаковый 32 бита | 0..232-1 |
signed double word | integer | int | знаковый 32 бита | -231..231-1 |
unsigned quad word | uint64 | unsigned long long unsigned __int64_t (VC++) |
беззнаковый 64 бита | 0..264-1 |
signed quad word | int64 | long long __int64_t (VC++) |
знаковый 64 бита | -263..263-1 |
2.1.2. Типы данных
Тип. Классификация типов
Тип определяет множество значений, которые могут принимать объекты профаммы (константы и
переменные), а также совокупность операций, допустимых над этими значениями.
Например, значения 1 и 3 относятся к целочисленному типу, и над ними можно выполнять любые
арифметические операции. Значения ‘отличная’ и ‘учеба’ принадлежат к строковому типу и над ними можно выполнять
только одну операцию — склеивания, сцепления, или конкатенации текста (обозначается через +).
Все типы данных, используемые в Turbo Pascal, можно разделить на две большие группы: скалярные
(простые) и структурированные (составные) (см.рис. 2.1). Скалярные типы в свою очередь подразделяются на стандартные
и пользовательские (перечисляемый и интервальный). Стандартные типы предлагаются программисту разработчиками
Turbo Pascal. К ним относятся: целочисленные, вещественные, символьный (литерный), логический (булевский) и
указатели. Структурированные типы имеют в своей основе скалярные типы данных. К структурированным
относятся: строки, массивы, множества, записи и файлы.
Целочисленные типы, символьный, логический и пользовательские типы данных
(перечисляемый и интервальный) образуют группу так называемых порядковых типов, имеющих большое значение.
Тип данных очень важен при выделении памяти под переменные, поскольку каждому типу
соответствует строго определенный размер ячейки памяти. В любом случае этот размер ограничен, следовательно,
все типы данных имеют ограниченный диапазон значений (см. табл.2.1, 2.2, 2.3). Этот факт не согласуется с нашими
математическими представлениями о числовых множествах. Тем не менее, с ним приходится считаться.
Рис. 2.1. Структура типов данных
меню
вверх
Стандартные типы
Целые и вещественные типы предназначены для представления числовых данных.
В математике рассматривается бесконечное множество целых чисел. Целый тип в языке Turbo Pascal — это интервал
целых чисел (табл. 2.1). Операции над целыми числами определены лишь тогда, когда исходные данные (операнды)
и результат лежат в этом интервале. Иначе возникает ситуация, называемая переполнением. За исключением
переполнения все операции над аргументами целого типа выполняются точно.
Таблица 2.1. Целочисленные типы данных
Название целого типа | Диапазон возможных значений | Память, байт |
byte (байтовый) | 0 — 255 | 1 |
shortint (короткий целый) | -128 — 127 | 1 |
integer (целый) | -32 768 — 32 767 | 2 |
word (слово) | 0 — 65 535 | 2 |
longint (длинный целый) | -2 147 483 648 — 2 147 483 647 | 4 |
В математике вещественные числа — это бесконечное непрерывное множество чисел.
В вычислительных машинах вещественные числа представляются конечным множеством значений (табл. 2.2).
Например, внутреннее представление типа real может дать 248 = = 281 474 976 710 656
(более чем 1014) возможных комбинаций значащих разрядов в отведенных для него 6 байтах, или 48 битах.
Это очень большое число, но все же оно не сопоставимо с множеством вещественных чисел.
Таблица 2.2. Вещественные типы данных
Название вещественного типа | Диапазон возможных значений | Количество значащих цифр | память, байт |
single (с одинарной точностью) | 1,5е-45 — 3,4е38 | 7 — 8 | 4 |
real (вещественный) | 2,9е-39 — 1,7е38 | 11 — 12 | 6 |
double (с двойной точностью) | 5,0е-324 — 1,7е308 | 15 — 16 | 8 |
extended (с повышенной точностью) | 3,4е-4932 — 1,1е4932 | 19 — 20 | 10 |
соmр (сложный) | -2е63+1 — 2е63-1 | 19 — 20 | 8 |
Логический (булевский) тип имеет всего два значения: true (да — истина, 1) и false
(нет — ложь, 0), причем данные значения упорядочены, т. е. в операциях сравнения true > false (табл. 2.3).
Символьный (литерный) и строковый типы представляют данные, являющиеся символами
и их последовательностями — строками (см. табл. 2.3). В памяти компьютера символы хранятся в виде их числовых
кодов. Числовые коды преобразуются в буквы и другие символы лишь в момент их вывода на экран или принтер.
Соответствие между символом и его кодом задается при помощи кодовой таблицы, которая находится в памяти
компьютера и используется при выводе символов.
Таблица 2.3. Символьный и логический (булевский) типы данных
Тип | Диапазон возможных значений | Память, байт |
char (символьный, литерный) | Символы кодовой таблицы | 1 |
boolean (булевский) | true, false | 1 |
Переменные, описываемые любым из типов byte, shortint, integer, word, longint, принимают
только целые значения. Типы byte, word — беззнаковые.
Переменные, описываемые любым ИЗ ТИПОВ single, real, double, extended,
comp принимают только вещественные значения — положительные и отрицательные.
Наиболее часто в простейших профаммах используются типы integer
и real.
меню
вверх
Формы записи вещественных чисел
Вещественные числа могут записываться двумя способами — в общепринятой и экспоненциальной форме.
Общепринятая форма предполагает запись по обычным правилам арифметики. Целая часть от дробной отделяется
десятичной точкой, а не запятой, как в математике. Если точка отсутствует, число считается целым.
Запись вещественного числа в экспоненциальной форме (в форме с мантиссой и порядком)
использует степень десяти (например: 25*e-3) и удобна для записи очень больших и очень маленьких чисел. При этом
число изображается так: пишется мантисса, знак умножения опускается, вместо основания 10 пишется буква е,
а следом указывается порядок (показатель степени). Буква е, предшествующая порядку, читается как «умножить на 10 в степени».
Например, 123,456 или -11,9 — общепринятая форма, а 5.18е+02 (518) или 10е-03 (0,01) — экспоненциальная.
Примеры неправильной записи вещественных чисел:
123 — отсутствует десятичная точка;
1,23 — запятая вместо точки;
0.123-03 — отсутствует обозначение порядка е;
12.34е1.2 — порядок числа должен быть целым.
Любое вещественное число хранится в памяти компьютера в экспоненциальной форме: отдельно — мантисса и отдельно — порядок. При этом под мантиссу и порядок отводится строго определенное количество двоичных разрядов. Выбор такого представления имеет несколько следствий:
• существуют очень маленькие значения, которые не могут быть представлены. Попытки их использования обычно приводят к возникновению ошибок;
• каждое вещественное число будет иметь приблизительно одинаковое количество значащих цифр в его представлении.
Как следствие этого, ошибка для очень больших чисел будет больше по абсолютной величине;
• представители вещественных чисел неравномерно распределены внутри диапазона значений. Их плотность уменьшается с увеличением абсолютного значения числа.
Вещественные числа представлены приближенно, следовательно, арифметические действия над ними также выполняются приближенно.
Из изложенного следует несколько простых правил:
• вещественные числа нежелательно проверять на строгое равенство;
• необходимо проявлять осмотрительность при преобразовании вещественных чисел в целые и избегать вычитания почти равных чисел, т. к. могут возникнуть ошибки из-за потери многих значащих цифр;
• для уменьшения влияния ошибки округления при выполнении арифметических операций с вещественными
числами необходимо иметь в виду следующее. Если складывается много чисел, то их нужно разбить на группы чисел,
близких по абсолютному значению, произвести суммирование в группах, начиная с меньшего числа, после чего
полученные суммы сложить, опять-таки начиная с меньшей. По аналогии с предыдущим получаются оценки для других
арифметических операций и соответствующие практические рекомендации.
Вещественные числа в шестнадцатеричнои системе счисления записывать нельзя.
меню
вверх
Запись строк символов
Последовательность символов, заключенная в апострофы, является строкой и относится к
типу string. Причем сами апострофы не входят в состав строки, а лишь указывают на то, что все заключенные
в них символы следует рассматривать как единое целое — строковую константу. Если в состав
строки потребуется включить сам апостроф, достаточно написать его дважды подряд. В отличие от имен пользователя,
строчные и прописные буквы в составе строки различаются. Под длиной строки понимают общее число
символов в ней, включая символы пробела. Максимальная длина строки — 255 символов. Символы внутри строки
нумеруются от 1 до значения длины строки.
Например, ‘Язык программирования Turbo Pascal’, ‘12345’, ‘А+В1’. Более подробно строки
и действия над ними будут рассматриваться далее.
меню
вверх
Порядковые типы
Следующие типы данных — целые, символьный и логический имеют ограниченное количество значений,
идущих по порядку, поэтому эти типы принято называть порядковыми типами. Общим для них является то, что
в компьютере они представляются целым числом. Вещественные типы, как уже указывалось выше, тоже принимают
конечное число значений. Оно определяется форматом внутреннего представления вещественного числа в ЭВМ.
Однако количество возможных значений вещественных типов настолько велико, что в компьютере невозможно
сопоставить с каждым из них целое число (его номер). Все вещественные типы данных не являются порядковыми
В Turbo Pascal имеются два дополнительных пользовательских порядковых типа:
• интервальный (ограниченный) тип или диапазон;
• перечисляемый тип.
Они используются для того, чтобы еще больше ограничить количество значений, принимаемых переменными этого типа.
Интервальный тип задается своим минимальным и максимальным значениями и может быть определен на основе любого порядкового типа:
МинимальноеЗначение.. Максимальное значение
Например: 1..12 (номер месяца может принимать значения от 1 до 12) или ‘а’..’z’ (буквы латинского алфавита — от а до г).
Перечисляемый тип ограничен больше, он задается перечислением своих значений.
Например, в виде строковых констант: color=(red,blue,green,black).
В приведенном примере создается новый (нестандартный) тип данных color. Переменные этого
типа могут принимать всего 4 значения: red, blue, green и black. Такая возможность создания новых пользовательских типов данных имеется в языке Turbo Pascal и некоторых других языках (см. разд. 2.2.6).
предыдущая
меню
вверх
следующая
Новости
Программы
Turbo Pascal
Игры
Документация
«Странности»
FAQ
Ссылки
Гостевая
книга
Благодарности
От автора
ТИПЫ
ДАННЫХ
Любые данные, т.е. константы,
переменные, значения функций или выражения,
в Турбо Паскале характеризуются своими
типами. Тип
определяет множество допустимых значений,
которые может тот или иной объект, а также
множество допустимых операций, которые
применимы к нему. Кроме того, тип определяет
формат внутреннего представления данных в
памяти ПК.
Турбо Паскаль
характеризуется разветвлённой структурой
типов данных.
В
Турбо Паскале предусмотрен механизм
создания новых типов данных, благодаря чему
общее количество типов, используемых в
программе, может быть сколько угодно
большим.
ПРОСТЫЕ ТИПЫ
К простым типам относятся
порядковые и вещественные типы.
Порядковые типы отличаются тем, что каждый из них имеет
конечное число возможных значений. Эти
значения можно определённым образом
упорядочить (отсюда – название типов) и,
следовательно, с каждым из них можно
сопоставить некоторое целое число –
порядковый номер значения.
Вещественные типы тоже имеют конечное число значений,
которое определяется форматом внутреннего
представления вещественного числа. Однако
количество возможных значений
вещественных типов настолько велико, что
сопоставить с каждым из них целое число (его
номер) не представляется возможным.
ПОРЯДКОВЫЕ
ТИПЫ
К порядковым типам
относятся целые, логический, символьный,
перечисляемый и тип-диапазон.
Целые типы. Диапазон возможных значений целых
типов зависит от их внутреннего
представления, которое может занимать один,
два или четыре байта
ЦЕЛЫЕ
|
||
НАЗВАНИЕ
|
Длина,байт
|
Диапазон
|
Byte
|
1
|
0…255
|
ShortInt
|
1
|
-128…+127
|
Word
|
2
|
0…65535
|
Integer
|
2
|
-32768…+32767
|
LongInt
|
4
|
-2
|
При
использовании процедур и функций с
целочисленными параметрами следует
руководствоваться «вложенностью» типов, т.е.
везде, где может использоваться Word,
допускается использование Byte (но
не наоборот), в LongInt “входит” Integer,
который, в свою очередь, включает в себя ShortInt.
При
дейстйствии с целыми чмслами тип
результата будет соответствовать типу
операндов, ф если операнды относятся к
различным целым типам,- типу того операнда,
который имеет максимальную мощность (максимальный
диапазон значений). Возможное переполнение
никак не контролируется, что может привести
к недорозумениям.
Логический тип
ЛОГИЧЕСКИЕ
|
|||
Название
|
Длина,
|
OS
|
Значение
|
BOOLEAN
|
1
|
Linux,
|
False,
|
BYTEBOOL
|
1
|
Совместим
|
False,
|
WORDBOOL
|
2
|
Win
|
False,
|
LONGBOOL
|
4
|
Win
|
False,
|
. Значениями логического типа может
быть одна из предварительно объявленных
констант FALSE
(ложь) или TRUE (истина).
Поскольку
логический тип относится к порядковым
типам, его можно использовать в операторе
счётного типа.
Символьный тип. CHAR
– занимает 1 байт. Значением символьного
типа является множество всех символов ПК.
Каждому символу присваивается целое число
в диапозоне 0…255. Это число служит кодом
внутреннего представления символа.
Для
кодировки испоьзуется код ASCII (American
Standart
Code for Information
Interchange
– американский стандартный код для обмена
информацией). Это 7-битный код, т.е. с его
помощью можн озакодировать лишь 128 символов
в диапозоне от 0 до 127. В то же время в 8-битном
байте, отведенном для хранения символа в
Турбо Паскале, можно закодировать в два
раза больше символов в дапозоне от 0 до 255.
Первая половина символов ПК с кодами 0…127
соответствует стандарту ASCII.
Вторая половина символов с кодами 128ююю255 не
ограничена жёсткими рамками стандарта и
может менятся на ПК разных типов.
Символы
с кодами 0…31 относятся к слжебным кодам.
Если эти коды использовать в символьном
тексте программы, они считаются пробелами.
Перечисляемый тип. Перечисляемый тип задаётся
перечислением тех значений, которые он
может получать. Каждое значение именуется
некоторым идентификатором и рапологается в
списке, обрамлённом круглыми скобками,
напримерЖ
Type
Colors = (red, white, blue);
Применение
перечисляемых типов делает программы
нагляднее.
Соответствие
между значениями перечисляемого типа и
порядковыми номерами этих значений
устанавливается порядком перечисления:
первое значение списке получает порядковый
номер 0, второе – 1 и т.д. максимальная
мощность перечисляемого типа составляет
65536 значений, поэтому фактически
перечисляемый тип задаёт некоторое
подмножество целого типа WORD
и может рассматриваться как компактное
объявление сразу группы целочисленных
констант со значениями 0,1 и т.д.
Использование
перечисляемых типов повышает надёжность
программы, благодаря возможности контроля
тех значений, которые получают
соответствующие переменные.
Тип-диапазон. Тип-диапазон есть подмножество своего
базового типа, в качестве которого может
выступать любой порядковый тип, кроме типа-диапазона.
Тип-диапазон
задаётся границами своих значений внутри
базового типа:
<мин.знач.>..<макс.знач.>
Здесь
<мин.знач.> — минимальное значение типа-диапазона.
<макс.знач.>
— максимальное его значение.
Type
Digit = ‘0’ ..’9’;
Dig2 = 48 .. 57;
При определении типа-диапазона нужно
руководствоваться следующими правилами:
1.
два символа «..» рассматриваются как
один символ, поэтому между ними недопустимы
пробелы.
2.
левая
граница диапазона не должна превышать его
правую границу.
Тип-диапазон наследует все
свойства базового итпа, но с ограничениями,
связанными с его меньшей мощностью.
ВЕЩЕСТВЕННЫЕ ТИПЫ
В отличие от порядковых
типов, значения которых всегда
сопоставляются с рядом целых чисел и,
следовательно, представляется в ПК
абсолютно точно, значения вещественных
типов определяют произвольное число лишь с
некоторой конечной точностью, зависящей от
внутреннего формата вещественного числа.
Длина, байт
|
Название
|
Количество
|
Диапазон
|
6
|
Real
|
11…12
|
-39…+38
|
4
|
Single
|
7…8
|
-45…+38
|
8
|
Double
|
15…16
|
-324…+308
|
10
|
Extended
|
19…20
|
-4951…+4932
|
8
|
comp
|
19…20
|
-2*1063+1…+2*1063-1
|
СТРУКТУРИРОВАННЫЕ ТИПЫ
Любой из структурированных
типов характеризуется множественностью
образующих этот тип элементов, т.е.
переменная или сонстанта
структурированного типа всегда имеет
несколько компонентов. Каждый компонент, в
свою очередь, может принадлежать
структурированному типу, что позволяет
говорить о возможной вложености типов. В
Турбо Паскале допускается произвольная
глубина вложености типов, однако суммарная
длина любого из них во внутреннем
представлении не должна превышать 65520 байт.
МАССИВЫ
Массиывы
в Турбо Паскале во многом схожи с
аналогичными типами данных в других языках
програмирования. Отличительная
особенность массивов заключается в том, что
все их компоненты суть данные одного типа (возможно
структурированного). Эти компоненты можно
легко упорядочить и обеспечить доступ к
любому из них простым указанием
порядкового номера.
Описание массива задаётся
следующим образом:
<имя
типа> = array
[<сп.инд.типов>] of
<тип>
Здесь <имя типа> —
правильный индификатор;
Array,
of –
зарезирвированые слова (массив, из);
<спюиндютипов> — список
из одного или нескольких индексных типов,
разделённых запятыми; квадратные скобки,
обрамляющие список, — требование синтаксиса;
<тип> — любой тип Турбо
Паскаля.
В качестве индексных типов
в Турбо Паскале можно использовать любые
порядковые типы, кроме LongInt и типов-диапазонов с базовым
типом LongInt.
Глубина вложенности
структурированных типов вообще, а
следовательно, и массивов – произвольная,
поэтому количество элементов в списке
индексов типов (размерность массива) не
ограничено, однако суммарная длина
внутреннего представления любого массива
не может быть больше 65520 байт.
ЗАПИСИ
Запись –
это структура данных, состоящая из
фиксированного числа компонентов,
называемыхполями записи. В отличие от
массива, компоненты (поля) записи могут быть
различного типа. Чтобы можно было ссылаться
на тот или иной компонент записи, поля
именуются.
Структура объявления типа
записи такова:
<имя
типа> = RECORD <спюполей> END
Здесь
<имя типа> — правильный индификатор;
RECORD,
END –
зарезервированые слова (запись, конец);
<сп.полей> — список полей;
представляет собой последовательность
разделов записи, между которыми ставится
точка с запятой.
МНОЖЕСТВА
Множества
– это набор однотипных логическх
связанных друг с другом объектов. Характер
связей между объектами лишь
подразумевается програмистом и никак не
контролируется Турбо Паскалем.количество
элементов, входящих в множество, может
менятся в пределах от 0до 256 (множество, не
содержащее элементов, называется пустым).именно
непостоянством количества своих элементов
множества отличаются от массивов и записей.
Два множества считаются
эквивалентными тогда и только тогда, когда
все их элементы одинаковы, причём порядок
следования элементов множества
безразличен. Если все элементы одного
множества входят также и в другое, говорят о
включении первого множества во второе.
Описание типа множества
имеет вид:
<имя
типа> = SET OF <баз.тип>
Здесь <имя типа> — правильный
индификатор;
SET,
OF –
зарезирвированные слова (множество, из);
<баз.тип>
— базовый тип элементов множества, в
качестве которого может использоваться
любой порядковый тип, кроме WORD,
INTEGER и LONGINT.
Для
задания множества используется так
называемый конструктор множества: список
спецификаций элементов множества,
отделяемых друг от друга запятыми; список
обрамляется квадратными скобками.
Спецификациями элементов могут быть
константы или выражения базового типа, а
также – тип-диапазон того же базового типа.
СТРОКИ
Тип STRING
(строка) в Турбо Паскале широко
используется для обработки текстов. Он во
многом похож на одномерный массив символов ARRAY [0..N]
OF CHAR,
однако, в отличие от последнего, количество
символов в строке – переменной может
менятся от 0 до N,
где N –
максималльное количество символов в строке.
Значение N
определяется объявлением типа STRING[N]
N и может
быть любой константой порядкового типа, но
ен больше 255. Турбо Паскаль разрешает не
указывать N,
в том случае длина строки принимается
максимально возможной, а именно N=255.
Строка в Турбо Паскале
трактуется как цепочка символов. К любому
символу в строке можно обратиться точно так
же, как к элементу одномерного массива ARRAY
[0..N] OF
CHAR.
ФАЙЛЫ
Под файлом
понимается либо именованная область
внешней памяти ПК, либо логическое
устройство – потенциальный источник или
приёмник информации.
Любой файл имеет три
характерные особенности. Во-первых, у него
есть имя, что даёт возможность программе
работать одновременно с несколькими
файлами. Во-вторых, он содержит компоненты
одного типа. Типом компонентов может быть
любой тип Турбо Паскаля, кроме файлов. Иными
словами, недьзя создать «файл файлов». В-третьих,
длина вновь создаваемого файла никак не
оговаривается при его объявлении и
ограничивается только ёмкостью устройств
внешней памяти.
Файловый тип или переменную
файлового типа можно задать одним из трёх
способов:
<имя>=
FILE OF <тип>;
<имя>=TEXT;
<имя>
= FILE;
Здесь
<имя> — имя файлового типа (правильный
индификатор);
FILE,
OF –
зарезервированные слова (файл, из);
TEXT
– имя стандартного типа текстовых файлов;
<тип>
— любой тип Турбо Паскаля, кроме файлов.
В зависимости от способа
объявления можно выделить три вида файлов:
·
типизированные файлы (задаются
предложением FILE
OF…);
·
текстовые файлы (определяются типом
TEXT);
·
нетипизированные файлы (определяются
типом FILE).
ПРОЦЕДУРНЫЕ ТИПЫ
Процедурные
типы — это нововедение фирмы Borland (в стандартном Паскале таких
типов нет). Основное назначение этих типов
—дать програмисту гибкие средства
передачи функций и процедур в качестве
фактических параметров обращения к другим
процедурам и функциям.
Для объявления
процедурного типа используется заголовок
процедуры (функции), в котором опускается её
имя, наприме:
type
Proc
= procedure;
Proc1
= procedure(var X, Y: Integer);
StrProc
= procedure(S: String);
MathFunc
= function(X: Real): Real:
DeviceFunc
= function(var F: Text): Integer;
MaxFunc
= function(A, B: Real; F: MathFunc): Real;
Как видно из приведённых
примеров существует два вида процедурных
типов: тип-роцедура и тип-функция.
В программе могут быть
объявлены переменные процедурных типов,
например, так:
Var
P1 :
Proc1;
F1, f2 : MathFunc;
Ap : array
[1..N] of Proc1
Переменным процедурных
типов допускается присваивать в качестве
значений имена соответствующих
подпрограмм. После такого присваивания имя
переменной становится синонимом имени
подпрограммы.
ТИП ОБЪЕКТ
Тип объект — это структура,
состоящая из фиксированного числа
компонент. Каждая компонента — это или поле,
которое содержит данные определенного типа,
или метод, который производит операции над
объектом. Аналогично объявлению переменных,
объявление поля, указывает тип данных поля
и идентификатор имени этого поля; и
аналогично объявлению процедуры или
функции объявление метода указывает
заголовок процедуры, функции, констрактора
или дестрактора.
Тип объект может
наследовать компоненты от другого типа
объекта.
Сфера действия типа объекта
состоит из него самого и всех его
порожденных типов.
В отличие от других типов,
тип объект может быть объявлен в части
объявления типов в самой внешней части
программы или модуля.
Так, тип объекта не может
быть объявлен в части объявления
переменных или внутри процедуры, функции
или метода.
ТИП УКАЗАТЕЛЬ
Тип указатель (ссылочный
тип) определяет множество значений, которые
указывают на динамические переменные
определенного типа, называемого базовым
типом. Переменная с типом указатель
содержит адрес динамической переменной в
памяти.
Если базовый тип является
еще не описанным идентификатором, то он
должен быть описан в той же самой части
описания типов, что и тип указатель.
Переменной-указателю можно
присвоить значение с помощью процедуры New,
операции @ или функции Ptr.
Процедура New
отводит новую область памяти в динамически
распределяемой области для динамических
переменных и сохраняет адрес этой области в
переменной указателя. Операция @
ориентирует переменную указателя на
область памяти, содержащую существующую
переменную, включая и те переменные,
которые имеют идентификаторы. Функция Ptr
ориентирует переменную указателя на
определенный адрес в памяти.
Зарезервированное
слово nil
обозначает константу со значением
указателя, которая ни на что не указывает.
Встроенный указатель типа
обозначает нетипизованный указатель, то
есть указатель, который не указывает ни на
какой определенный тип. Переменные типа Pointer
могут быть разыменованы; указание символа ^
после такой переменной вызывает появление
ошибки. Как и значение, обозначаемое словом nil,
значения типа Pointer
совместимы со всеми другими типами
указателей.
В разделе «Указатели и
динамические переменные» в Главе4 вы
можете найти синтаксис ссылки на
динамические переменые, которые
указываются с помощью указателя-переменной.