Порядковый тип. Порядковые типы данных. Простые типы

К порядковым типам относятся (см. рис.4.1) целые, логический, символьный, перечисляемый и тип-диапазон. К любому из них применима функция ORD(X), которая возвращает порядковый номер значения выражения X. Для целых типов функция ORD(X) возвращает само значение X, т.е. ORD(X) = X для X, принадлежащего любому шелому типу. Применение ORD(X) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 155 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этого типа.

К порядковым типам можно также применять функции:

PRED (X) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ORD(X)- 1), т.е.

ORD(PRED(X)) = ORD(X) - 1;

SUCC (X) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ORD(X) +1, т.е.

ORD(SUCC(X)) = ORD(X) + 1.

Например, если в программе определена переменная

то функция PRED(C) вернет значение "4", а функция SUCC(C) - значение "6".

Если представить себе любой порядковый тип как упорядоченное множество значий, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция PRED(X) не определена для левого, a SUCC(X) - для правого конца этого отрезка.

Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта. В табл. 4.1 приводится название целых типов, длина их внутреннего представления в байтах и диапазон возможных значений.

Таблица 4.1

При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е. везде, где может использоваться WORD, допускается использование BYTE (но не наоборот), в LONGINT «входит» INTEGER, который, в свою очередь, включает в себя SHORTINT.

Перечень процедур и функций, применимых к целочисленным типам, приведен в табл.4.2. Буквами b, s, w, i, l обозначены выражения соответственно типа BYTE, SHORTINT, WORD, INTEGER и LONGINT, x - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.

Таблица 4.2

Стандартные процедуры и функции, применимые к целым типам
Обращение Тип результата Действие
abs (x) x Возвращает модуль х
chr(b) Char Возвращает символ по его коду
dec (vx[, i]) - Уменьшает значение vx на i, а при отсутствии i -на 1
inc(vx[, i]) - Увеличивает значение vx на i, а при отсутствии i - на 1
Hi(i) Byte Возвращает старший байт аргумента
Hi(w) To же То же
Lo(i) " Возвращает младший байт аргумента
Lo (w) " То же
odd(l) Boolean Возвращает True, если аргумент - нечетное число
Random (w) Как у параметра Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l)
sgr (x) X Возвращает квадрат аргумента
swap (i) Integer Меняет местами байты в слове
swap (w) Word

При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам, - типу того операнда, который имеет максимальную мощность (максимальный диапазон значений). Возможное переполнение результата никак не контролируется, что может привести к недоразумениям, например:

а:= 32767; {Максимально возможное значение типа INTEGER}

х:= а + 2; {Переполнение при вычислении этого выражения!}

у:= LongInt(а)+2; {Переполнения нет после приведения переменной к более мощному типу}

WriteLn(x:10:0, у:10:0)

В результате прогона программы получим

Логический тип . Значениями логического типа может быть одна из предварительно объявленных констант FALSE (ложь) или TRUE (истина). Для них справедливы правила:

False < True;

succ(False)= True;

pred(True) = False.

Поскольку логический тип относится к порядковым типам, его можно использовать в операторе счетного типа, например:

for 1:= False to True do ....

Символьный тип. Значением символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ORD.

Для кодировки используется код ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией). Это 7-битный код, т.е. с его помощью можно закодировать лишь 128 символов в диапазоне от 0 до 127. В то же время в 8-битном байте, отведенном для хранения символа в Турбо Паскале, можно закодировать в два раза больше символов в диапазоне от 0 до 255. Первая половина символов ПК с кодами 0...127 соответствует стандарту ASCII (табл. 4.3). Вторая половина символов с кодами 128...255 не ограничена жесткими рамками стандарта и может меняться на ПК разных типов (в прил.2 приведены некоторые распространенные варианты кодировки этих символов).

Таблица 4.3

Кодировка символов в соответствии со стандартом ASCII
Код Символ Код Символ Код Символ Код Символ
NUL BL ® "
ЗОН ! A a
STX " В b
ЕТХ # С с
EOT $ D d
ENQ % E e
АСК & F f
BEL " G g
BS ( H h
НТ ) I i
LF * J j
VT + k k
FF , L i
CR - M m
SO . N n
SI / О
DEL p P
DC1 Q q
DC2 R r
DC3 S s
DC4 T t
NAK U u
SYN V V
ETB w w
CAN X X
EM У У
SUB : z z
ESC / [ {
FS < \ l
GS = ] }
RS > ^ ~
US ? - n

Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами. При использовании их в операциях ввода-вывода они могут иметь следующее самостоятельное значение:

Символ Код Значение
BEL Звонок; вывод на экран этого символа сопровождается звуковым сигналом
НТ Горизонтальная табуляция; при выводе на экран смещает курсор в позицию, кратную 8, плюс 1 (9, 17, 25 и т.д.)
LF Перевод строки; при выводе его на экран все последующие символы будут выводиться, начиная с той же позиции, но на следующей строке
VT Вертикальная табуляция; при выводе на экран заменяется специальным знаком
FF Прогон страницы; при выводе на принтер формирует страницу, при выводе на экран заменяется специальным знаком
CR Возврат каретки; вводится нажатием на клавишу Enter (при вводе с помощью READ или READLN означает команду «Ввод» и в буфер ввода не помещается; при выводе означает команду «Продолжить вывод с начала текущей строки»)
SUB Конец файла; вводится с клавиатуры нажатием Ctrl-Z; при выводе заменяется специальным знаком
SSC Конец работы; вводится с клавиатуры нажатием на клавишу ESC; при выводе заменяется специальным знаком

К типу CHAR применимы операции отношения, а также встроенные функции: СНR(В) - функция типа CHAR; преобразует выражение В типа BYTE в символ и возвращает его своим значением;

UPCASE(CH) - функция типа CHAR; возвращает прописную букву, если СН -строчная латинская буква, в противном случае возвращает сам символ СН, например:

cl:= UpCase("s") ;

c2:= UpCase ("Ф") ;

WriteLn(cl," ",c2)

Так как функция UPCASE не обрабатывает кириллицу, в результате прогона этой

программы на экран будет выдано

Перечисляемый тип . Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:

colors =(red, white, blue);

Применение перечисляемых типов делает программы нагляднее. Если, например, в программе используются данные, связанные с месяцами года, то такой фрагмент программы:

ТипМесяц=(янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек);

месяц: ТипМесяц;

if месяц = авг then WriteLn("Хорошо бы поехать к морю!");

был бы, согласитесь, очень наглядным. Увы! В Турбо Паскале нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены писать так:

TypeMonth=(jan,feb,mar,may,jun,jul,aug,sep,oct,nov,dec);

month: TypeMonth;

if month = aug then WriteLn("Хорошо бы поехать к морю!");

Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа WORD и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями О, 1 и т.д.

Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисляемые типы:

colors = (black, red, white);

ordenal= (one, two, three);

days = (monday, tuesday, Wednesday);

С точки зрения мощности и внутреннего представления все три типа эквивалентны:

ord(black)=0, ..., ord(white)=2,

ord(one)=0, ...ord(three)=2,

ord(monday)=0, ...ord(Wednesday)=2.

Однако, если определены переменные

col:colors; num:ordenal;

то допустимы операторы

num:= succ(two);

day:= pred(tuesday);

но недопустимы

Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией ORD(X). В Турбо Паскале допускается и обратное преобразование: любое выражение типа WORD можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощное1™ перечисляемого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисляемого типа (см. п. 4.4). Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания:

col:= colors(0);

Разумеется, присваивание

будет недопустимым.

Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например:

col: (black, white, green);

Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа:

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

Здесь <мин.знач. > - минимальное значение типа-диапазона;

<макс.знач.> - максимальное его значение.

Например:

digit = "0".."9";

Тип-диапазон необязательно описывать в разделе TYPE, а можно указывать непосредственно при объявлении переменной, например:

Ichr: "A".."Z";.

При определении типа-диапазона нужно руководствоваться следующими правилами:

  • два символа «..» рассматриваются как один символ, поэтому между ними недопустимы пробелы;
  • левая граница диапазона не должна превышать его правую границу. Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная

days = (mo,tu,we,th,fr,sa,su);

WeekEnd = sa .. su;

то ORD(W) вернет значение 5 , в то время как PRED(W) приведет к ошибке.

В стандартную библиотеку Турбо Паскаля включены две функции, поддерживающие работу с типами-диапазонами:

НIGН(Х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная X;

LOW(X) -возвращает минимальное значение типа-диапазона.

Следующая короткая программа выведет на экран строку

WriteLn(Low(k),"..",High(k))

Множество целых чисел бесконечно, но мы всегда можем подобрать такое число бит, чтобы представить любое целое число, возникающее при решении конкретной задачи. Множество действительных чисел не только бесконечно, но еще и непрерывно, поэтому, сколько бы мы не взяли бит, мы неизбежно столкнемся с числами, которые не имеют точного представления. Числа с плавающей запятой - один из возможных способов предсталения действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений.

Число с плавающей запятой состоит из набора отдельных разрядов, условно разделенных на знак, экспоненту порядок и мантиссу. Порядок и мантисса - целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:

Математически это записывается так:

(-1) s × M × B E , где s - знак, B-основание, E - порядок, а M - мантисса.

Основание определяет систему счисления разрядов. Математически доказано, что числа с плавающей запятой с базой B=2 (двоичное представление) наиболее устойчивы к ошибкам округления, поэтому на практике встречаются только базы 2 и, реже, 10. Для дальнейшего изложения будем всегда полагать B=2, и формула числа с плавающей запятой будет иметь вид:

(-1) s × M × 2 E

Что такое мантисса и порядок? Мантисса – это целое число фиксированной длины, которое представляет старшие разряды действительного числа. Допустим наша мантисса состоит из трех бит (|M|=3). Возьмем, например, число «5», которое в двоичной системе будет равно 101 2 . Старший бит соответствует 2 2 =4, средний (который у нас равен нулю) 2 1 =2, а младший 2 0 =1. Порядок – это степень базы (двойки) старшего разряда. В нашем случае E=2. Такие числа удобно записывать в так называемом «научном» стандартном виде, например «1.01e+2». Сразу видно, что мантисса состоит из трех знаков, а порядок равен двум.

Допустим мы хотим получить дробное число, используя те же 3 бита мантиссы. Мы можем это сделать, если возьмем, скажем, E=1. Тогда наше число будет равно

1.01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0,5=2,5

Очевидно, что таким образом одно и то же число можно представить по-разному. Рассмотрим пример с длиной мантиссы |M|=4. Число «2» можно представить в следующем виде:

2 = 10 (в двоичной системе) = 1.000e+1 = 0.100e+2 = 0.010e+3.

Поэтому уже в самых первых машинах числа представляли в так называемом нормализованном виде , когда первый бит мантиссы всегда подразумевался равным единице.

Это экономит один бит (так как неявную единицу не нужно хранить в памяти) и обеспечивает уникальность представления числа. В нашем примере «2» имеет единственное представление («1.000e+1»), а мантисса хранится в памяти как «000», т.к. старшая единица подразумевается неявно. Но в нормализованном представлении чисел возникает новая проблема - в такой форме невозможно представить ноль.

  • Анализ данных с помощью команд Подбор параметра и Поиск решения
  • Анализ и интерпретация данных экспериментально-психологического исследования.
  • Анализ исходных данных. Технические нормативы городской дороги.
  • АНАЛИЗ ПОЛУЧЕННЫХ ДАННЫХ. ПРИНЯТИЕ РЕШЕНИЯ О ДОСТАТОЧНОСТИ ИЛИ НЕДОСТАТОЧНОСТИ ХАРАКТЕРИСТИК ВОДОСНАБЖЕНИЯ ДЛЯ НУЖД СИСТЕМЫ ПОЛИВА.
  • Аппаратура линии связи: аппаратура передачи данных, оконечное оборудование, промежуточная аппаратура.

  • К простым типам относятся порядковые, вещественные типы и тип дата-время.

    Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда - название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения.

    Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.

    Тип дата-время предназначен для хранения даты и времени. Фактически для этих целей он использует вещественный формат.

    Порядковые типы

    К порядковым типам относятся (см. рис. 1.1) целые, логические, символьный, перечисляемый и тип-диапазон. К любому из них применима функция Ord(x), которая возвращает порядковый номер значения выражения X.

    Рис. 1.1

    Для целых типов функция ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ord(х) зависит от свойств этого типа.

    К порядковым типам можно также применять функции:

    pred(x) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ord (х) -1, т. е. оrd(рred(х)) = оrd(х) - 1;

    succ (х) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ord (х) +1, т. е. оrd(Succ(х)) = оrd(х) + 1.

    Например, если в программе определена переменная

    то функция PRED(с) вернет символ "4", а функция SUCC(с) - символ "6".

    Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция pred(x) не определена для левого, a succ (х) - для правого конца этого отрезка.

    Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байтов. В табл. 1.1 приводятся названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений.

    Таблица 1.1 - Целые типы

    Название

    Длина, байт

    Диапазон значений

    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

    Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип integer для этой версии занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.

    При использовании процедур и функций с целочисленными параметрами следует руководствоваться “вложенностью” типов, т.е. везде, где может использоваться word, допускается использование Byte (но не наоборот), в Longint “входит” Smallint, который, в свою очередь, включает в себя Shortint.

    Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 1.2. Буквами b, s, w, i, l обозначены выражения соответственно типа Byte, Shortint, Word, Integer и Longint,

    х - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.

    Таблица 1.2 - Стандартные процедуры и функции, применимые к целым типам

    Обращение

    Тип результата

    Действие

    Возвращает модуль x

    Возвращает символ по его коду

    Уменьшает значение vx на i, а при отсутствии i - на 1

    Увеличивает значение vx на i, а при отсутствии i -на 1

    Возвращает старший бант аргумента

    Возвращает третий по счету байт

    Возвращает младший байт аргумента

    Возвращает True, если аргумент-нечетное число

    Как у параметра

    Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l)

    Возвращает квадрат аргумента

    Меняет местами байты в слове

    При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с shortint и word общим будет тип integer. В стандартной настройке компилятор Delphi не вырабатывает код, осуществляющий контроль за возможной проверкой выхода значения из допустимого диапазона, что может привести к недоразумениям.

    Логические типы. К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина).

    Поскольку логический тип относится к порядковым типам, его можно использовать в операторе цикла счетного типа. В Delphi 32 для Boolean значение

    Ord (True) = +1, в то время как для других типов (Bool, WordBool и т.д.)

    Ord (True) = -1, поэтому такого рода операторы следует использовать с осторожностью! Например, для версии Delphi 6 исполняемый оператор showMessage (" --- ") в следующем цикле for не будет выполнен ни разу:

    for L:= False to True do

    ShowMessage ("--);

    Если заменить тип параметра цикла L в предыдущем примере на Boolean, цикл будет работать и сообщение дважды появится на экране. [Для Delphi версии 1 и 2 ord (True) =+1 для любого логического типа.]

    Символьный тип. Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.

    Для кодировки в Windows используется код ANSI (назван по имени American National Standard Institute - американского института стандартизации, предложившего этот код). Первая половина символов ПК с кодами 0... 127 соответствует таблице 1.3. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman для представления символов кириллицы (без букв “ё” и “Ё”) используют последние 64 кода (от 192 до 256): “А”... “Я” кодируются значениями 192..223, “а”... “я” - 224...255. Символы “Ё” и “ё” имеют соответственно коды 168 и 184.

    Таблица 1.3 - Кодировка символов в соответствии со стандартом ANSI

    Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.

    К типу char применимы операции отношения, а также встроенные функции:

    Сhаr (в) - функция типа char; преобразует выражение в типа Byte в символ и возвращает его своим значением;

    UpCase(CH) - функция типа char; возвращает прописную букву, если сн - строчная латинская буква, в противном случае возвращает сам символ сн (для кириллицы возвращает исходный символ).

    Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:

    colors = (red, white, blue);

    Применение перечисляемых типов делает программы нагляднее.

    Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.

    Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. В Object Pascal допускается обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисляемого типа.

    Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона.

    Тип-диапазон задается границами своих значений внутри базового типа:

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

    Здесь <мин. знач. > - минимальное значение типа-диапазона; <макс. знач. > - максимальное его значение.

    Тип-диапазон не обязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной.

    При определении типа-диапазона нужно руководствоваться следующими правилами:

    два символа “..” рассматриваются как один символ, поэтому между ними недопустимы пробелы; левая граница диапазона не должна превышать его правую границу.

    Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная.

    В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами:

    High(х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х;

    Low (х) - возвращает минимальное значение типа-диапазона.

    Вещественные типы

    В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.

    Таблица 1.4 - Вещественные типы

    В предыдущих версиях Delphi 1...3 тип Real занимал 6 байт и имел диапазон значений от 2,9*10-39 до 1,7*1038. В версиях 4 и 5 этот тип эквивалентен типу Double. Если требуется (в целях совместимости) использовать 6-байтных Real, нужно указать директиву компилятора {SREALCOMPATIBILITY ON}.

    Как видно из табл. 1.4, вещественное число в Object Pascal занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК.

    Здесь s - знаковый разряд числа; е - экспоненциальная часть; содержит двоичный порядок; m - мантисса числа.

    Мантисса m имеет длину от 23 (для single) до 63 (для Extended) двоичных разрядов, что и обеспечивает точность 7...8 для single и 19...20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).

    Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате Extended, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти.

    Особое положение в Object Pascal занимают типы comp и Currency, которые трактуются как вещественные числа с дробными частями фиксированной длины: в comp дробная часть имеет длину 0 разрядов, т. е. просто отсутствует, в currency длина дробной части -4 десятичных разряда. Фактически оба типа определяют большое целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении они занимают 8 смежных байт). В то же время в выражениях comp и currency полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т. д. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты.

    Порядковые типы

    Тема 3. Структура типов данных. Стандартные процедуры и функции, применимые к целым, вещественным числам. Логический, символьный, перечисляемый типы, тип-диапазон. Примеры.

    Типы данных

    Любые данные, т.е. константы, переменные, значения функций или выражения характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Кроме того, тип определяет также и формат внутреннего представления данных в памяти ПК.

    Турбо Паскаль характеризуется разветвлённой структурой типов данных.

    Простые типы

    1. Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определённым образом упорядочить и, следовательно, с каждым из них можно сопоставить некоторое число – порядковый номер значения.

    2. Вещественные типы, строго говоря, тоже имеет конечное число значений, которое определяется форматом внутреннего представления вещественного числа.

    Порядковые типы

    К порядковым типам относятся целые, логический, символьный, перечисляемый и тип – диапазон. Функция ORD(X) возвращает порядковый номер значения выражения X и применяется к любому порядковому типу. Для целых типов функция возвращает само значение X, т.е. ORD(X)=X для X, принадлежащего любому целому типу.

    ORD(X) для символьного типа даёт целое число в диапазоне от 0 до 255, для перечисляемое типа ORD(X) даёт число в диапазоне от 0 до 65535. Тип- диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этоготипа. К порядковым типам можно также применять функции:

    PRED (X)- возвращает предыдущее значение порядкового типа, т.е. ORD(PRED (X))= ORD(X)-1;

    SUCC(X)- возвращает следующее значение порядкового типа, (которое соответствует порядковому номеру ORD (X)+1), т.е.

    Простые типы

    Порядковые

    Вещественные

    Дата-время

    Логические

    Символьный

    Перечисляемый

    Тип-диапазон

    Рисунок 1 – Простые типы данных

    Порядковые типы

    Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить и, следовательно, сопоставить некоторое целое число – порядковый номер значения.

    Функции, предназначенные для работы с порядковыми типами, приведены в таблице 1.

    Таблица 1 – Функции для работы с порядковыми типами.

    Целые типы

    Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байт. В таблице 2 приведены основные целочисленные типы.

    Таблица 2 – Целочисленные типы

    Наименование

    Длина, байт

    Диапазон значений

    2147483648 … +2147483647

    0 … 2147483647

    0 … 4294967295

    263 … 263 -1

    Обратите внимание на то, чтоObject Pascal осуществляет автоматическое приведение типов. Например, там, где в качестве аргумента допустимо использовать переменную типа Word, допускается использовать переменную типа Byte, но не наоборот. Общее правило таково вместо одного типа целочисленной переменной можно использовать другой тип целочисленной переменной если их диапазоны значений вкладываются друг

    в друга.

    В таблице 3 приведены некоторые функции для работы с целочисленными переменными.

    Таблица 3 – Функции для работы с целыми числами

    При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам, – общему типу, который включает в себя оба операнда. Например, для типов ShortInt и Word общим типом будет Integer.

    По умолчанию компилятор не генерирует код проверки, осуществляющий контроль за возможным выходом значения из допустимого диапазона, что может привести к неправильной работе программы. Например, при выполнении программы из листинга 1 на экране появится ноль, а не 65536.

    Листинг 1

    {$IFDEF FPC} {$MODE DELPHI}

    {$APPTYPE CONSOLE} program InOutPrg; var x: Word; begin

    Для того чтобы включить контроль переполнения, необходимо указать директиву компилятора {$Q+} для отключения контроля – {$Q-}.

    Вместо {$Q+} можно использовать{$OVERFLOWCHECKS ON} , а вместо {$Q-} {$OVERFLOWCHECKS OFF}

    Измените программу, приведенную в листинге 1, поместив в нее директиву{$Q+} первой строкой. Запустите ее на выполнение, программа должна аварийно завершиться.

    Для целочисленных переменных безопаснее всего применять тип Integer, т. к. диапазон

    значений этого типа достаточно велик для широкого класса задач. Проверку выхода за диапазон в конечной версии программы лучше отключить, т. к. она снижает быстродействие программы.

    Логические типы

    Переменная логического типа может принимать только два значения True (истина) и False (ложь). Логические типы приведены в таблице 4.

    Таблица 4 – Логические типы

    Для работы с логическими типами используйте тип Boolean, остальные типы были добавлены в Object Pascal для совместимости с программами написанными на других языках программирования.

    Символьный тип

    Символьный тип, как следует из его названия, предназначен для хранения кода символа. Внутренняя структура типа совпадает с внутренней структурой беззнаковых целых чисел. Object Pascal поддерживает два символьных типаAnsiChar иWideChar. Характеристики этих типов приведены в таблице5.

    Таблица 5 – Символьные типы

    Описание

    Код символа в кодировке ANSI. Таблица символов этого стандарта

    состоит из 256 символов, причем первые 128 символов жестко

    определены стандартом, а остальные 128 могут содержать любые

    символы. Во вторую часть кодовой таблицы обычно помещают

    символы национальных алфавитов. Недостатком данного

    представления символов является то, что невозможно отображение

    сразу символов более

    чем 2-х алфавитов.

    Символ в формате UNICODE. Таблица символов содержит 65536

    символов. В данной таблице находятся символы всех алфавитов.

    Char1

    Является псевдонимом типа AnsiChar

    Для преобразования кода символа в символ следует применять следующую функцию

    function chr(X:byte):char

    Для обратного преобразования используется функция

    1 В Object Pascal тип Char является основным. В следующих версиях тип Char может стать псевдонимом для типа WideChar.

    function ord(X:char):byte;

    Константу символьного типа можно задать двумя способами. Задать символ в одинарных кавычках или указать код символа. Следующие две записи эквивалентны.

    ch:="A" ;

    ch:=#97; //97 – код символа "A".

    Например

    var ch:char; code: byte;

    begin ch:="A" ;

    ch:=chr(32); //32 - соответствует коду клавиши пробел

    end.

    Перечисляемый тип

    Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамлённом круглыми скобками.

    <имя типа> = (id, id, id,...);

    Здесь «имя типа» – идентификатор Object Pascal , «id» – идентификаторObject Pascal .

    Например, тип описывающий некоторый фиксированный набор цветов

    Применение перечисляемых типов делает программы более наглядными и повышает надежность программ. Пусть определены следующие типы:

    type TColors = (red, green, white, yellow);

    TDays=(monday, tuesday, wednesday);

    Определены переменные

    var col:TColors;

    то допустимы следующие операторы

    col:=Succ(green);

    day:=Pred(tuesday);

    но не допустимы

    Максимальное количество перечисляемых значений зависит от реализации. В настоящее время размер переменной перечисляемого типа равен 4 байта, что соответствует 232 различных значений, т. е. во внутреннем представлении перечисляемый тип представляет собой тип LongWord.

    Как говорилось выше , можно поместить определение типа сразу, после двоеточия, например

    var col: (red, green, white, yellow); day: (monday, tuesday, wednesday);

    Тип-диапазон

    Тип диапазон представляет собой подмножество некоторого базового порядкового типа. Типдиапазон задается границами своих значений.

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

    В языке Паскаль переменные характеризуются своим типом . Тип - это свойство переменой, по которому переменная может принимать множество значений, допустимых этим типом, и участвовать во множестве операций, допустимых над данным типом.

    Тип определяет множество допустимых значений, которое принимает переменная данного типа. Определяет так же множество допустимых операций от переменной данного типа и определяет представления данных в оперативной памяти компьютера.

    Например:

    n:integer;

    Паскаль - статический язык, из этого следует, что тип переменой определяется при ее описании и не может быть изменен. Язык Паскаль имеет развитую систему видов - все данные должны принадлежать заранее известному типу данных (либо стандартному типу, созданному при разработке языка или пользовательскому типу, который определяет программист). Программист может создавать свои типы произвольной структурой сложности на основе стандартных типов, либо уже определенных пользователем типов. Количество создаваемых типов неограниченно. Пользовательские типы в программе объявляется в разделе TYPE по формату:

    [имя] = [тип]

    Система стандартных типов имеет разветвленную, иерархическую структуру.

    Первичными в иерархии являются простые типы . Такие типы присутствуют в большинстве языков программирования и называются простыми, однако в языке Паскаль они имеют более сложную структуру.

    Структурированные типы строятся по определенным правилам из простых типов.

    Указатели формируются из простых видов и используются в программах для задания адресов.

    Процедурные типы являются нововведением языка Turbo Pascal, и они позволяют обращаться к подпрограммам, как к переменным.

    Объекты являются также нововведением, и они предназначены для использования языка, как объектно-ориентированного языка.

    В языке Паскаль целые типы бывают 5 видов. Каждый из них характеризует диапазон принимаемых значений и занимаемым местом их в памяти.

    При использовании целочисленных чисел следует руководствоваться вложенностью типов, т.е. типы с меньшим диапазоном могут быть вложены в типы с большим диапазоном. Тип Byte может быть вложен во все типы занимающие 2 и 4 байта. В тоже время тип Short Int, занимающий 1 байт не может быть вложен в тип Word, поскольку не имеет отрицательных значений.

    Можно выделить 5 вещественных типов:

    В компьютере абсолютно точно представляются целые типы. В отличие от целых типов значение вещественных типов определяет произвольное число лишь с некоторой конечной точность, зависящего от формата числа. Вещественные числа представляются в компьютере с фиксированной или с плавающей точкой.

    2358.8395

    0.23588395*10 4

    0.23588395*E 4

    Особое положение в Паскаль занимает тип Comp, фактически это большое целое число со знаком. Этот тип совместен со всеми вещественными типами и может быть использован для большого целого числа. При представлении вещественных чисел с плавающей запятой десятичная точка, всегда подразумевается перед левой или старшей мантиссой, но при действии с числом сдвигается влево или вправо.

    Порядковые типы

    Порядковые типы объединяют в себе несколько простых типов. К ним относятся:

    • все целые типы;
    • символьный тип;
    • логический тип;
    • тип-диапазон;
    • перечисляемый тип.

    Общими признаками для порядковых типов являются: каждый из типов имеет конечное число возможных значений; значение этих типов можно определенным образом упорядочить и с каждым числом сопоставить некоторое число, являющееся порядковым номером; соседние значения порядковых типов отличается на единицу.

    К значениям порядкового типа может быть применена функция ODD(x), которая возвращает порядковый номер аргумента x.

    Функция PRED(x) - возвращает предшествующее значение порядкового типа. PRED(A) = 5.

    Функция SUCC (x) - возвращает следующее значение порядкового типа. SUCC(A) = 5.

    Символьный тип

    Значениям символьного типа является 256 символов из множества допустимых кодовой таблицей используемого компьютера. Начальная область этого множества, то есть диапазон от 0 до 127 соответствует множеству кодов ASCII, куда загружаются символы алфавита, арабских чисел и специальных символов. Символы начальной области всегда присутствуют на клавиатуре ПК. Старшая область называется альтернативной, она содержит символы национальных алфавитов и различные специальные символы, и символы псевдографики, не соответствующие коду ASCII.

    Значение символьного типа занимает один байт в оперативной памяти. В программе значении заключаются в апострофы. Так же значения можно задавать в виде его ASCII-коде. В этом случае перед числом, обладающим код символа нужно поставить знак #.

    C:= ’A’

    Логический (булевский) тип

    Имеются два значения булевского типа: Истина (True) и Ложь (False). Переменные данного типа задаются служебным словом BOOLEAN. Значение булевского типа занимают один байт в оперативной памяти. Значениям Истина и Ложь соответствуют числовые значения 1 и 0.

    Тип-диапазон

    Есть подмножество своего базового типа в качестве, которого может выступать любой порядковый тип. Тип-диапазон задается границами внутри базового типа.

    [минимальное-значение]…[максимальное-значение]

    Тип-диапазон можно задавать в разделе Type, как определенный тип, а можно непосредственно в разделе Var.

    При определении тип-диапазона необходимо руководствоваться:

    • левая граница не должна превышать правую границу;
    • тип-диапазон наследует все свойства базового типа, но с ограничениями, связанными и с его меньшей мощностью.

    Перечисляемый тип

    Данный тип относится к порядковым типам и задается перечислением тех значений, которых он может перечислять. Каждое значение именуется неким идентификатором и располагается в списке обрамленным в круглых скобках. Перечисляемый тип задается в Type:

    Peoples = (men, women);

    Первое значение - 0, второе значение - 1 и т.д.

    Максимальная мощность 65535 значений.

    Строковый тип

    Строковый тип относится к группе структурированных типов и состоит из базового типа Char. Строковый тип не относится к порядковым типам. Он определяет множество символьных цепочек произвольной длины до 255 символов.

    В программе строковый тип объявляется, словом String. Поскольку String является базовым типом, он описан в языке и объявление переменной типа String осуществляется в Var. При объявлении переменной строкового типа за String в квадратных скобках целесообразно указывать длину строки. Для указания используется целое число от 0 до 255.

    Fam: String;

    Указание длины строки позволяет компилятору отвести под данную переменную указанное число байтов в ОЗУ. Если длина строки не указана, то в этом случае компилятор отведет под значение этой переменной максимальное возможное число байт (255).



    
    Top