Этот тип данных получил название перечисляемого, потому что он задается в виде перечисления некоторых значений. Эти значения образуют упорядоченное множество и являются константами. Для объявления переменной список возможных значений, разделенных запятой, указывается в круглых скобках.
Например,
Var month:(january, february, march,
april, may,june, july, august,
september, october, november,
december);
Порядок элементов перечисляемого типа определяется порядком их следования в описании. Левый имеет минимальное значение (значение функции Ord для него равно 0), а правый − максимальное.
К переменным перечисляемого типа можно применять операции сравнения. Так, например, february<november.
Использование перечисляемого типа данных повышает читабельность программы. Однако в языке Паскаль нельзя вводить и выводить элементы перечисляемого типа. Этот недостаток легко преодолевается, так как всегда можно ввести число, являющееся порядковым номером элемента перечисляемого типа, и вывести на экран значение переменной перечисляемого типа, используя, например, оператор выбора Case.
§26. Описание переменных, констант и типов
Раздел описания констант
Константа − это величина, которая не изменяет своего значения в процессе выполнения программы. С константами мы уже встречались, так как в общем случае константой является любое целое или вещественное число, символ, идентификаторы false и true, а также идентификаторы, обозначающие значения переменных перечисляемого типа. Но константа может быть обозначена и именем. В этом случае она должна быть объявлена в разделе описания констант. Раздел описания констант начинается словомConst (от англ. constancy − постоянство).
Например,
Const N=25; K=38; D=(N+K) Div 2;
Letter='f'; M=5E15;
Здесь N, К, D − целочисленные константы, Letter − константа символьного типа, а М − константа вещественного типа. Следует отметить, что константа D принимает свое значение после вычисления выражения. В разделе описания констант можно использовать лишь некоторые стандартные функции, такие, как Abs, Chr, Pred, Succ, Odd, Ord.
Именование констант делает программу более удобной для понимания и внесения исправлений. При изменении констант достаточно будет изменить соответствующие значения в разделе описания констант.
Наряду с переменными и константами имеются и так называемые типизированные константы. В описании типизированной константы присутствуют описание типа и одно из допустимых значений, например,
Const N: Integer=15; ch: Char=#87;
Типизированные константы являются, собственно говоря, переменными. В частности, они могут изменять свое значение в процессе выполнения программы. От обычных переменных они отличаются лишь тем, что инициализируются при запуске программы.
Раздел описания типов
В языке Паскаль все данные, используемые программой, должны принадлежать к какому−либо заранее известному типу данных.
Тип данных определяет:
• формат представления данных в памяти ЭВМ;
• множество допустимых значений;
• множество допустимых операций.
Примечание. Следует отметить, что все типы данных изучались по этой схеме.
Все простые типы языка Паскаль можно разделить на стандартные и пользовательские. К стандартным типам относятся типы: Integer, Real, Char, Boolean, а также некоторые другие.
Пользовательские типы объявляются в разделе описания типов, который открывается словомType.
Пример
Type
week=(sunday, monday, tuesday,
wednesday, thursday, friday,
saturday);
work_week=monday..friday;
day=l..31;
Обратите внимание на то, что при объявлении пользовательских типов между их именем и конструкцией, определяющей тип, ставится знак равенства.
После того, как тип объявлен, в разделе описания переменных можно пользоваться вновь введенным идентификатором.
Разделы описания констант, типов и переменных должны находиться перед основным блоком программы.
§27. Преобразование типов.
Совместимость типов
На предыдущих занятиях были рассмотрены основные типы Паскаля и действия, которые можно совершать с переменными этих типов. Одним из самых распространенных действий является присваивание.
Рассмотрим такую ситуацию. Пусть заданы типы Т1 и Т2, а также описаны переменные р1 и р2 следующим образом:
Var p1:T1; p2:T2;
Когда можно присвоить переменной р1 значения р2: р1:=р2? Чтобы ответить на этот вопрос, рассмотрим совместимость простых типов по присваиванию. Операция р1:=р2 является допустимой, если истинно одно из следующих утверждений:
• Т1 и Т2 − тождественные типы.
Типы являются тождественными, если они описаны одним и тем же идентификатором или происходят от одного и того же идентификатора.
Пример
TypeT1=Real; T2=Real; T3=T1;
T4=(red, green, blue, black, white);
T5=(red, green, blue, black,white);
T6=T4;
Здесь T1, Т2 и Т3 − тождественные типы, Т4, Т5 − не тождественные, поскольку (red, green, blue, black, white) не являются идентификаторами типа, Т4 и Т6 являются тождественными.
• Т2 является поддиапазоном типа Т1. Например, Type T1=Real; T2=Integer;
(множество целых чисел входит в диапазон вещественных чисел).
• T1 и Т2 являются отрезками одного и того же типа.
Например:
TypeT1=1..100; T2=-3..20;
week= (dl, d2, d3, d4, d5, d6, d7);
working_week=(d1..d5);
Совместимость по присваиванию станет более понятна, если вспомнить, что переменные в памяти занимают определенное число байт. Так, переменная типа Integer занимает 2 байта, типа Real − 6 байт. Переменной, которая занимает 6 байт, можно присвоить значение, занимающее 2 байта, а наоборот − не всегда.
Совместимость типов необходима также в выражениях и операциях сравнения.
Program Example_66;
Var a: Byte; b: Integer; c: Longint;
Begin
Writeln('Введите 2 числа:
Byte,Integer)');
Readln(a, b);
c:=a+b;
Writeln(c);
End.
Определить тип следующих выражений: a+b; a+b+c; a+b+c+x, если переменные описаны так:
Var a:Byte; b:Integer;
c:Longint; x:Real;
Выражение справа в операторе присваивания вычисляется независимо от размера или типа переменной слева. Число 32867 не входит в диапазон допустимых значений типа Integer, именно вследствие этого мы получаем неправильный результат. Чтобы этого не случилось, нужно преобразовать переменные к более "вместительному" типу.
Преобразование переменной к типу записывается следующим образом:
<идентификатор типа>(переменная).
Чтобы получить правильный результат, нужно записать следующий оператор:
c:=Longint(a)+Longint(b);
или:
c:=a+Longint(b);
Для преобразования типов используются также следующие функции:
Round(от англ. round − круглый, округлять) − округление числа до ближайшего целого
Trunc (от англ. truncate − урезать) − отбрасывание дробной части числа.
Int (от англ. integer – целый) − целая часть вещественного числа.
Frac(от англ. fraction − дробь) − дробная часть вещественного числа.
Low (от англ. low − низкий) − наименьшее значение данного порядкового или перечисляемого типа.
High (от англ. high − высокий, верх) − наибольшее значение данного порядкового или перечисляемого типа.
Пример 1
"Вечный календарь". Известно, что если дата лежит в диапазоне от 1582 до 4902 г., номер дня недели (номер воскресенья - 0, понедельника − 1,…, субботы − 6) равен остатку от деления на 7 значения выражения [2.6m-0.2]+d+y+[y/4]+[c/4]-2c
Здесь d − номер дня в месяце (1, 2, ...); m − номер месяца в году, нумерация начинается с марта (у марта − номер 1, у апреля − номер 2, ..., у декабря − номер 10, январь и февраль считаются месяцами с номерами 11 и 12 предыдущего года); у− две младшие цифры года; с − две старшие цифры года; [х] обозначает целую часть числа х.
Вычислить количество пятниц, приходящихся на 13−е число в XX столетии.