2.8. Упорядоченные типы
Тип относится к упорядоченному, если все его элементы могут быть пронумерованы. Это означает, что для каждого элемента (кроме крайних) можно указать предшествующий и последующий. Математическим аналогом понятия "упорядоченный тип" является счетное множество.
К упорядоченным типам относятся:
- целый;
- булевский;
- символьный;
- перечислимый (см.п.2.9).
Данные целого типа нумеруются своими значениями, булевского: FALSE - 0, TRUE - 1, символьного - в соответсвии с кодом ASCII.
К данным упорядоченных типов применимы следующие стандартные функции:
- Ord(x) - порядковый номер значения x в типе;
- Pred(x) - предшествующее значению x в типе;
- Succ(x) - следующее за x значение в типе.
Например, выражения Ord(5)=5; Pred(5)=4; Succ(5)=6; Pred(TRUE)=FALSE; Pred('d')='c'; Succ('x')='y'; Ord(TRUE)=1 имеют значение TRUE (т.е.истинны).
Пример 2.8.1. Ввести 3 символа. Подсчитать, сколько среди них символов # . PROGRAM Kos; VAR a,b,c : char; k : integer; BEGIN Write('3 символа :'); ReadLn(a,b,c); k:=Ord(a='#') + Ord(b='#') + Ord(c='#'); WriteLn('Количество "#" = ', k) END. Здесь использован тот факт, что Ord(FALSE)=0, Ord(TRUE)=1. Зна-чение функции Ord(a='#') будет равно 0 или 1 в зависимости от того, ложно или истинно выражение в скобках.
Задачи
2.8.1. Ввести 3 символа. Подсчитать, сколько среди них: а) прописных букв латинского алфавита; б) букв латинского алфавита.
2.8.2. Ввести две пары символов. Определить количество пар, в которых оба символа соседние в наборе ASCII.
2.8.3. Ввести символ. Напечатать два следующих за ним символа.
2.8.4. Ввести 2 числа. Определить: 1) наибольшее из них; 2) сумму отрицательных; 3) количество отрицательных.
2.9. Перечислимый тип
Перечислимый тип задает упорядоченное множество значений путем перечисления имен, обозначающих эти значения.
Например, тип day - 7 дней недели от понедельника - можно опре-делить следующим образом:
TYPE day = (mon,tue,wed,thu,fri,sat,sun).
Перечислимый тип относится к упорядоченным, следовательно, к нему применимы функции Pred, Succ, Ord .
Пример 2.9.1. Приведем программу, содержащую несколько возмож-ных операторов с данными перечислимого типа. PROGRAM Week; TYPE day = (mon, tue, wed, thu, fri, sat, sun);
VAR a : day;
n : integer;
BEGIN
a:=wed;
a:=Succ(fri);
n:=Ord(sun)-Ord(mon)+1; {Количество значений в типе}
IF a>mon THEN a:=Pred(a);
WHILE a<>sat DO a:=Succ(a);
CASE a OF
mon : WriteLn('Понедельник');
tue..fri : WriteLn('Вторник-пятница');
sat,sun : WriteLn('Выходной')
END; END.
Данные перечислимого типа предназначены обычно для "внутреннего" потребления программы, поэтому в языке Паскаль не предусмотрен их ввод/вывод. Если же потребность в этом имеется, то программист должен сам позаботиться о методе реализации.
2.10. Ограниченный тип (тип "диапазон")
Ограниченный тип определяется путем наложения ограничения на значения любого упорядоченного типа, называемого базовым. Иными словами, указывается диапазон значений базового типа, например:
TYPE chi = 8..125; sm = 'd'..'k'; VAR z,a : chi; kl : sm; b : 'm'..'z'; Здесь определены два ограниченных типа: chi имеет базовый тип целый, а sm - символьный.
Переменные a,z , в соответствии с описанием, могут принимать зна-чения из диапазона 8 .. 125, а переменная kl - из диапазона 'd'..'k'.
Для переменной b указан диапазон непосредственно в разделе описа-ний переменных, что тоже допустимо.
Применение ограниченного типа в ряде случаев позволяет повысить наглядность программы, а также проводить контроль присваиваний во время выполнения программы.