- •Тема 3. Объекты и средства программирования на языке.
- •1. Структура программы.
- •2. Данные как объекты работы программы.
- •3. Константы и их определение.
- •Идентификаторы и переменные.
- •Выражения.
- •Встроенные функции и процедуры.
- •Начальные сведения о вводе-выводе данных. Ввод данных.
- •Вывод данных.
- •Тема 5. Простые типы данных.
- •1. Классификация типов
- •Стандартные функции для работы с порядковыми типами данных
- •2. Характеристика простых типов данных
- •Характеристики целых типов данных
- •Характеристики вещественных типов данных
- •3. Совместимость и преобразование типов
- •Массивы и работа с ними
- •Действия над массивами.
- •Константы-массивы.
2. Характеристика простых типов данных
1. Целые типы.
Это целые числа со знаком или без него, записанные явно в десятичной или шестнадцатеричной системах счисления. В последнем случае перед значением обязательно ставится знак $ или ¤.
Пример:
+6312
-2
$AD
$4FC
¤B9EF
Целые числа определяют конкретные числовые значения в максимальном диапазоне:
от -2 147 483 648 до +2 147 483 647 в десятичном
представлении или
от $00000000 до $FFFFFFFF в шестнадцатеричном.
Всего в языке используется 5 целых типов:
Таблица 2.
Характеристики целых типов данных
Имя типа |
Название типа |
Длина в байтах |
Диапазон значений |
SHORTINT |
целый с коротким интервалом значений |
1 |
-128 .. +127 |
BYTE |
байтовый |
1 |
0 .. 255 |
WORD |
слово |
2 |
0 .. 65535 |
INTEGER |
целый |
2 |
-32768 .. +32767 |
LONGINT |
целый с длинным интервалом значений |
4 |
-2 147 483 648 .. +2 147 483 647 |
Замечания: 1. следует следить за возможным переполнением
результатов арифметических операций при работе с тем
или иным целым типом, т.к. может произойти
искажение или усечение этих результатов.
2. при использовании различных типов операндов
арифметических операций тип результата будет
сориентирован на тип операнда с большим диапазоном
значений.
2. Вещественные типы.
Для них характерна требуемая (а не абсолютная, как для целых) точность представляемого числа. Это достигается тем, что значения вещественного типа хранятся в формате числа с плавающей точкой:
<мантисса> Е[±]<порядок>
где: мантисса – целое число или число с фиксированной точкой со
знаком или без;
порядок – показатель степени (целое число);
Е – экспонента («умножить на 10 в степени …»).
В результате читается:
«мантисса, умноженная на 10 в степени, равной порядку».
Примеры:
28Е4 => 280 000
405.25E-3 => 0.40525
-879E-2 => - 8.79
В следующей таблице представлены 5 разновидностей вещественных типов данных:
Таблица 3.
Характеристики вещественных типов данных
Имя типа |
Разрядность мантиссы (кол-во значащих цифр) |
Длина в байтах |
Диапазон десятичного порядка |
SINGLE |
7..8 |
4 |
-45 .. +38 |
REAL |
11 .. 12 |
6 |
-39 .. + 38 |
DOUBLE |
15 .. 16 |
8 |
-324 .. +308 |
EXTENDED |
19 .. 20 |
10 |
-4932 .. +4932 |
COMP |
19 .. 20 |
8 |
-2**63+1 .. +2**63-1 |
Чтобы сделать доступными типы SINGLE, DOUBLE, EXTENDED, необходимо соответствующим образом настроить компилятор ( с помощью директивы {$N+}).
Тип COMP воспринимается как вещественное число без экспоненциальной и дробной частей, т.е. фактически как целое с большим количеством значащих цифр. Это делает весьма эффективным использование данного типа в денежных (бухгалтерских) расчетах, требующих высокой точности.
Кроме числа с плавающей точкой, вещественный тип может представляться и в удобной для восприятия форме числа с фиксированной точкой. В нем выделяются целая и, обязательно, дробная части, разделенные точкой. Числа с фиксированной точкой могут быть положительными или отрицательными.
Примеры:
75.05 -231.2 0.00789 -0.955
100.0
Но не 100 (!), т.к. это уже будет целый тип.
3. Логический тип - BOOLEAN.
В оперативной памяти занимает 1 байт и задается одним из значений:
TRUE – истина;
FALSE – ложь.
Причем TRUE> FALSE (порядковый номер TRUE=1, а FALSE=0).
Символьный тип – CHAR.
Его значением может быть один из символов расширенного
кодового набора ASCII (American Standard Code for Information Interchange), заключенный в апострофы. Сам апостроф удваивается при записи.
Примеры:
`T` `*` `!` `t` `+` ````
Отдельные символы набора ASCII имеют порядковые номера и упорядочены по ним от 0 до 255. Поэтому `A` < `B`, `D`<`F` и т.д.
В оперативной памяти значению символьного типа отводится 1 байт.
Перечисляемый и интервальный типы.
Язык Турбо-Паскаль дает возможность программисту работать с ограниченным множеством однородных данных, используя т.н. перечисляемый и интервальный типы данных. Число элементов в них – не > 256, каждому элементу отводится 1 байт памяти.
а). Перечисляемый тип.
Он относится к скалярным типам и определяет возможные значения некоторой переменной, задаваемой в виде упорядоченной последовательности идентификаторов, обозначающих эти значения.
Объявление перечисляемых типов данных приводится до описания переменных (в VAR) по следующему синтаксису:
TYPE <имя типа>=(<идентификатор>[,<идентификатор> …]);
где: <имя типа>::=<идентификатор>
Например:
TYPE PTK=(EIE,ET,ETB,ES);
GRUP=(EIS_111, EIS_112, EIS_211, EIS_212, EIS_311,
EIS_312, EIS_411, EIS_412, EIS_511, EIS_512);
NEDEL =(PND,VTR,SRD,CTV,PTN,SBT,VSK);
Отдельные элементы (значения) рассматриваемого типа являются самостоятельными объектами (не путать с константами), составляющими упорядоченный список в порядке перечисления. При этом первый элемент имеет номер 0, второй – 1 и т.д. Поэтому справедливо:
EIE < ET < ETB < ES
Замечание: каждый элемент из списка перечисляемого типа является
значением своего типа и не может принадлежать другому
типу в программе. Т.е , например, EIE из типа PTK не
может быть включен в тип GRUP.
Переменные, принадлежащие к типам, объявленным в разделе TYPE c помощью имен типов, должны быть описаны в разделе VAR:
VAR POTOK: PTK;
ST_GR: GRUP;
DAY: NEDEL;
Это означает, что скалярная переменная РОТОК может принимать одно, любое из перечисленных значений в объявлении типа РТК, т.е. EIE,ET,ETB,ES (и только!). Аналогично для ST_GR и ST_GR.
Т.е. допустимы присваивания:
POTOK:=EIE;
ST_GR:=EIE_111;
DAY := VSK;
Но недопустимо:
POTOK:=EIE_111; (разные типы!)
Переменные перечисляемого типа можно описывать и непосредственно в VAR:
VAR POTOK: (EIE,ET,ETB,ES);
К операндам перечисляемого типа применимы только операции сравнения. Поэтому они чаще всего используются в логических выражениях для управления логикой программы (в условных операторах и операторах цикла):
FOR ST_GR:=EIE_111 TO EIE_312 DO …
WHILE DAY <> SBT AND DAY <> VSK DO …
IF POTOK=EIS THEN …
Программа с использованием перечисляемых типов становится более наглядной, контролируемой и, поэтому, надежнее. Сравним, если бы было:
IF POTOK=1 THEN …
Что здесь понимать под 1? Ясно, что предыдущая форма записи точнее!
б). Интервальный тип (иначе, тип-диапазон, ограниченный тип, отрезки типов).
Такой тип задается двумя константами, разделенными двумя горизонтальными точками и определяющими допустимый интервал (диапазон) значений от минимального до максимального.
В качестве констант можно использовать значения любого простого порядкового типа, кроме интервального. Тип, на котором строится этот интервал, называется базовым. Фактически интервальный тип задает подмножество внутри допустимых значений базового типа и поэтому сохраняет все его свойства при проведении тех или иных операций.
Синтаксис объявления:
TYPE <имя типа>=<1-ая константа>..<2-ая константа>;
где: <имя типа>::=<идентификатор>;
«1-ая константа» задает нижнюю границу допустимых значений интервала, а «2-ая константа» - верхнюю. Причем «2-ая » > «1-ой»
Примеры:
TYPE SP1=1..100; {базовый тип BYTE }
SP2=-10000..+10000; { - « - « - INTEGER}
SP3=`A`..`Z`; { - « - « - CHAR }
RDN=PND..PTN; { - « - « - перечисляемый}
Переменные интервального типа должны быть объявлены в VAR:
VAR INT: SP1;
DIAP: SP2;
ALF: SP3;
RAB_DNI: RDN;
Допускается короткое описание переменных интервального типа, без TYPE:
VAR INT: 1..100;
DIAP: -10000..+10000;
ALF: `A`..`Z`;
RAB_DNI: PND..PTN;
Можно и так:
CONST MIN=-10000;
MAX=10000;
VAR DIAP: MIN..MAX;
В целом использование перечисляемых и интервальных типов:
- повышает восприятие программ;
- позволяет программными средствами контролировать данные на
допустимость их значений;
- облегчает отладку программ.
6. Строчный тип – STRING[(N)].
Он определяет строку из N символов (1<N<255), заключенных в апострофы. Если N опущено, то предполагается, что N=255. Полезные апострофы в строке удваиваются.
Например:
`группа ЭИЭ-112`, `кафедра ``ИСЭК`` МИИТа`,
`ОТЧЕТ ф.ЦО-12`
Объявляется строчный тип обычным образом:
TYPE GR=STRING(14);
KF=STRING(20);
VAR N_GR, OTCH: GR;
KAFDR: KF;
Или непосредственно в VAR:
VAR N_GR, OTCH: STRING(14);
KAFDR: STRING(20);
Строго говоря, строку можно воспринимать как единое целое, И тогда это простой тип. Однако фактически строка представляется цепочкой символов, каждый из которых имеет свой индекс от 1 до 255 с добавлением 0-ого (самый первый байт), где постоянно хранится текущая длина строки. Поэтому ее можно трактовать как массив (сложный, структурированный тип) и, соответственно, манипулировать отдельными ее элементами, обращаясь к ним путем точного указания индекса:
IF N_GR[14]=`2` THEN …
На каждый символ строки в оперативной памяти отводится 1 байт. «Плюс» 1 байт на текущую длину. Поэтому на строку `поезд` будет отведено 6 байт памяти (5 + 1).
Строки можно сцеплять с помощью знака «+»:
Например,
пусть А:=`компания `;
Тогда С:=А+`I`+`B`+M`;
или С:=А+`IBM`; дадут текст: `компания IBM`