Предопределенные типы


Программист может использовать готовые типы данных, входящие в состав языка программирования. Такие типы называются предопределенными. К ним относятся различные целые и дробные числа, символы, текстовые строки, логические типы, множества и т.п
Важно иметь представление об иерархии предопределенных типов. Все типы делятся на простые (скалярные) и составные.
Простые типы состоят из одного элемента, например – число или буква. Составные типы имеют структуру, т.е. состоят из нескольких простых элементов, например – строки или массивы.
Простые типы, в свою очередь, делятся на перечислимые (порядковые) и вещественные.
Программисты договорились считать, что множество значений у простого типа конечно, а у вещественного типа – бесконечно. На самом деле в памяти ЭВМ все данные представляются конечным сочетанием битов, и потому имеют конечное число значений.

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

^ Идентификаторы предопределенных перечислимых типов в языке Pascal: Shortlnt, Byte, Word, Integer, Longlnt, Char, Boolean.

Идентификаторы предопределенных действительных типов в языке Pascal: ^ Real, Single, Double, Extended, Comp.
Структурные типы состоят из нескольких элементов. К ним относятся:

String – текстовая строка, от 0 до 255 символов. Применяется для работы с текстами.

Array – массив – набор однотипных элементов, каждый из которых имеет свой порядковый номер – индекс. Задается размерностью и типом элементов. Применяется для представления наборов данных, расположенных в некоторой системе координат (во времени, в пространстве, в алфавитном порядке и т.п.). В качестве индекса может применяться константа любого перечислимого типа или интервал, ограниченный константами такого типа. Для многомерных массивов набор индексов и/или интервалов задается через запятую. В памяти все элементы массива располагаются последовательно. При этом быстрее всех изменяется самый правый индекс. В Turbo Pascal общий размер памяти под массив не может превышать 65535 байт.

Например,

type Rubic_Kub = array[1..6, 1..3, 1..3] of (red, orange, yellow, green, blue, white); (* 6 граней по 3 ряда с 3 квадратиками в каждом. Квадратик может быть окрашен в один из 6 цветов: красный, оранжевый, желтый, зеленый, синий или белый *)
type Chars_Count = array[char] of word; (* Массив для подсчета числа повторений букв в тексте. Для каждого символа – до 65535 вхождений в текст *)

Set – множество – неупорядоченный набор однотипных значений без повторений. Применяется для описания свойств объектов (у гриппа один набор симптомов, у ветрянки – другой, но все они из множества симптомов, присущих болезненному состоянию организма). В Pascal множество может содержать до 255 элементов, в Oberon – до 32.

Например:

Type Lage_Cyrillic = set of ’А’..’Я’; (*Множество заглавных букв русского алфавита. Применяется при проверке, является ли первая буква слова заглавной *)

^ File – файл. Описывает поток или расположение данных на внешних устройствах. Будет рассмотрена в следующих лекциях.

Record – структура (запись). Состоит из разнородных элементов (полей). Применяется для описания сложных сущностей. В Turbo Pascal общий размер памяти под структуру не может превышать 65535 байт.
Например:

Type Dot_On_Screen =

record

x:word; (* позиция точки в строке, слева направо *)

y:word; (* позиция строки на экране, сверху вниз *)

color: t_color;(* цвет точки, перечислимый тип t_color определен выше *)

free: boolean; (* истина, если эта точка не принадлежит изображению объекта, двигающегося по экрану (т.е. изображение фона) *)

end;

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

Procedure, Function – процедурный тип. Служит для описания переменных, которые могут представлять процедуры или функции с одинаковыми списками параметров.
^

Собственные типы


Можно ли писать программы, используя только предопределенные типы? В принципе, можно. Но понять такую программу и развивать ее в будущем – очень трудно. Почему? Потому что количество предопределенных типов сильно ограничено, а данные в программах, наоборот, весьма разнообразны. И лучший способ отразить это разнообразие – объявить для каждого вида данных свой тип. Например, тип «Ship_weight» описывает вес кораблей, а «Human_weight» – вес людей. Первый – в тоннах, второй – в килограммах. Хотя, на самом деле, и то и другое – действительные числа.

Большинство языков программирования позволяют программисту конструировать свои собственные типы. Для конструирования используются предопределенные типы и собственные типы, введенные ранее.

Собственные типы объявляются в разделе описания типов. Как это делается, показано далее. В объектно-ориентированных языках можно конструировать не только типы, но и операции над ними. Это – материал следующего курса.

^

Описание типа


В Паскале-подобных языках описание типа начинается со слова type, за которым следует имя типа и его определение через базовый тип, интервал, перечисление значений, структуру и т.п. Например:

type Human_weight = real; (* Вес человека в граммах*)

type T_Human_age = 0..365*115; (* Возраст человека в днях *)

type T_Color = (red, green, blue, white); (* Любимые цвета автомобилей *)

type T_Name = string[10]; (* Имя, до 10 букв *)

type T_Num = set of 0..9; (* множество десятичных цифр *)

type T_Names = array[1..10] of T_Name; (* Массив имен *)

type T_Person = record (* Описание человека *)

Names: T_Names; (* до 10 имен и прозвищ*)

Age: T_Human_age;

Weight: Human_weight;

Car_color: T_Color;

end;

В этом примере использованы несколько базовых типов и структур, а также переменные и константы.

Константы здесь заданы своими значениями. Например, в типе T_Human_age использованы 3 константы: 0, 365 и 150. С помощью операции умножения «*» вычислено новое значение-константа, которое определяет, сколько дней (примерно) может прожить человек за 115 лет. Из этих значений с помощью конструкции «..» задан интервал значений. Поскольку все константы и операции над ними целочисленные, значит и тип T_Human_age будет разновидностью целочисленного типа.

Переменные


В Паскале-подобных языках переменные должны быть объявлены явно, с указанием их типа, в разделе описания переменных. Для этого используется слово var, за которым следует идентификатор (имя) переменной и, через двоеточие, ее тип. Переменным можно присваивать значения допустимых типов. Если тип переменной не совпадает с типом присваиваемого значения, то происходит «приведение» типа значения к типу переменной. Например, целый тип приводится к действительному, короткий – к длинному. Для явного приведения типов, имя типа указывается перед взятым в круглые скобки выражением, значение которого следует привести к этому типу.

^ Например n:=longint(x+12);

Чтобы получить значение элемента массива, следует после имени переменной (типа массив) указать индекс требуемого элемента.

Например x:=Screen[10,2];

Чтобы получить значение элемента структуры, следует после имени переменной (типа структура) указать через точку имя требуемого элемента.

Например x:=Car.Speed;

Простые типы данных.

Любые данные ТП характеризуются своими типами. Тип определяет:

1. Формат представления данных в памяти компьютера

2. Множество допустимых значений, принимаемое переменной или константой, принадлежащей к выбранному типу

3. Множество допустимых операций применимых к этому типу

Тип переменной определяется при ее декларации. Одна из базовых концепций Паскаля заключается в жесткой проверке соответствия типов в операциях присваивания.
Типы данных в языке ТП делятся на 5 основных классов:

1. Простые типы

2. Структурированные типы

3. Ссылочные типы

4. Процедурные типы

5. Объектные типы

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

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

2. Значения любого порядкового типа, за исключением целочисленного начинается с порядкового номера ноль (следующий порядковый номер 1, 2, 3…)

3. Порядковым номером значения целочисленного типа является само значение

4. В любом порядковом типе каждому значению кроме первого есть предыдущее и каждому значению кроме последнего есть последующее

К данным любого порядкового типа можно применить любую из пяти операций:

1. Стандартная операция Ord возвращает порядковый номер указанного значения. Значение указывается в скобках

2. Стандартная операция Pred возвращает значение, предшествующее указанному, если эта функция применяется к первому значению данного типа, то выдается сообщение об ошибке

3. Стандартная операция Succ возвращает следующее значение за указанным, если операция применяется к последнему элементу типа, то выдается сообщение об ошибке

4. Стандартная операция Low возвращает наименьшее значение в диапазоне порядкового типа, указанного данного

5. Стандартная операция High возвращает наибольшее значение в диапазоне порядкового типа, указанного данного

В TP имеется 5 предопределенных, целочисленных типов. Каждый тип обозначает определенное подмножество целых чисел:

Тип Диапазон Формат
Короткое целое shortint -128..127 8 бит со знаком
Целое integer -32768..32767 16 бит со знаком
Длинное целое longint -2147483648..2147483647 32 бита со знаком
Длиной в байт byte 0..255 8 бит без знака
Длиной в слово word 0..65535 16 бит без знака


Верхнее граничное значение и нижнее граничное значение целочисленных типов задаются как константы и имеют соответствующее имя.
В тексте программы данные целочисленных типов записываются в десятичном или шестнадцатеричном формате и не должны содержать десятичные точки.
Пример:
1 - целый тип
1.0 - не целый тип
100 - десятичный формат (100)
#100 - шестнадцатеричный формат (256)
Над целочисленными данными возможно выполнение операций сложения, вычитания и умножения, а также операций сравнения. Арифметические действия над операндами целочисленного типа предполагают восьмибитовую, 16-битовую или 32-битовую точность вычислений, в соответствии со следующими правилами:

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

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

3. Выражение справа в операторе присваивания вычисляется независимо от размера или типа переменной слева

4. Любые операнды размера в байт преобразуются в операнды размера слово

К логическим типам относятся данные типов Boolean, ByteBool, WordBool, LongBool.
Значением каждого данного логического типа могут являться 2 значения: TRUE (1) и FALSE (0).
Для данных логического типа применимы только две операции сравнения: равно и не равно.
Переменные типа Boolean и ByteBool занимают один байт; переменная WordBool - 2 байта; LongBool - 4 байта.
Boolean - это предпочтительный тип, использующий меньше памяти. Остальные типы обеспечивают совместимость с другими языками и средой Windows.
Предполагается, что тип Boolean имеет порядковые значения 0 и 1, а другие типы могут иметь другие порядковые значения. Когда выражение типа ByteBool, WordBool илиLongBool равно 1, то его значение истинно, когда 0 - ложь; любое другое значение преобразуется к единице и считается истинным.
Символьный тип (char) представляет собой тип данных, предназначенный для хранения одного символа (буквы, знака или кода). В переменную этого типа может быть помещен любой из 256 символов расширенного кода ASCII.
Переменная типа char занимает один байт памяти. Значения типа char задаются в апострофах. Кроме того можно задавать значения используя код из таблицы ASCII. Над данными символьного типа можно выполнять операции сравнения.
Перечисляемый тип определяется как упорядоченный набор идентификаторов, заданный путем их перечисления. При этом список идентификаторов разделенных запятой указывается в круглых скобках. Задается перечисляемый тип в разделе type.
Пример:
type A=(2, 4, 1, 7);
B=('c', 'L', '3', '|');
Значения переменных перечисляемого типа не могут вводиться с клавиатуры и выводиться на экран.
Интервальный тип данных определяется посредством задания подмножества значений одного из ранее определенных типов. Можно использовать все простые типы, за исключением вещественного. При задании диапазона указывается наименьшее и наибольшее значения, разделенные двумя точками. При этом оба значения обязательно одного типа.
К вещественному типу относится подмножество вещественных чисел, представленных в формате с плавающей точкой и фиксированным числом цифр.
В ТП имеется 5 видов вещественных типов:

Тип Диапазон Точность Формат
Real (вещественное) 2.9*10-39..1.7*1038 11-12 знаков 6 байт
Single (с одинарной точностью) 1.5*10-45..3.4*1038 7-8 знаков 4 байта
Double (с двойной точностью) 5.0*10-324..1.7*10308 15-16 знаков 8 байт
Extended (с повышенной точностью) 3.4*10-4932..1.1*104932 19-20 знаков 10 байт
Comp (сложное) -9.2*1018..9.2*1018 19-20 знаков 8 байт


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


2.5. Константы, переменные и оператор присваивания.

Константа - это идентификатор отмечающий значение, которое не может изменяться. Идентификатор константы не может быть включен в свое собственное описание. Константы должны объявляться в декларационной части программы до момента их использования в вычислениях. Эта декларационная часть начинается с зарезервированного слова const. При декларации указывается имя константы, символ равенства и значение этой константы. В ТП применяется 5 видов констант простых типов:

1. Целочисленные константы. В качестве значений может использоваться любое целочисленное данное в десятичном или шестнадцатеричном формате (year=2003)

2. Вещественные константы определяются числами, записанными в десятичном формате данных (time=0.2e+4, yyy=304.0)

3. Символьные константы могут быть определены только посредством символов таблицы ASCII. При этом сам символ заключается в апострофы (var1='A')

4. Строковые константы определяются произвольной последовательностью символов, заключенных в апострофы (stroke='IBM')

5. Типизированные константы (переменные с начальным значением). Каждой типизированной константе ставится в соответствие имя, тип, начальное значение (year1:integer =1995)

Переменной называется элемент программы, который предназначен для хранения, коррекции и передачи данных внутри программы.
Раздел описания переменных начинается с зарезервированного слова var.
Для объявления переменной необходимо указать имя переменной и ее тип. Однотипные переменные могут перечисляться через запятую перед указанием их типа.
Пример:
a: integer;
b: boolean;
c, b: real;
e: integer;
Все переменные делятся на глобальные и локальные. Глобальными являются переменные, объявленные вне процедур и функций, а локальными - объявленные внутри процедур и функций.
ТП накладывает ряд ограничений на использование переменных:

1. Среди глобальных переменных не может быть двух с одинаковыми идентификаторами;

2. Среди локальных переменных в пределах одной процедуры или функции не может быть двух с одинаковыми идентификаторами;

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

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

Имя функции Математическое значение Тип результата
a mod b Остаток деления a на b Целое
a div b Целая часть деления a на b Целое
abs (a) |a| Совпадает с типом аргумента
sqr (a) a2 Совпадает с типом аргумента
sqrt (a) Вещественное
sin (a) sin a Вещественное
cos (a) cos a Вещественное
arctan (a) arctg a Вещественное
ln (a) ln a Вещественное
exp (a) ea Вещественное


При составлении сложных выражений осуществляется приоритет выполнения операций:

1. not, @

2. *, /, div, mod, and, shl, shr

3. +, -, or, xor

4. =, <>, <=, >=, >, <, in



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: