Таблица порядковых типов
Встроенный порядковый тип
Встроенный порядковый тип определяет все порядковые типы, свойства которых (диапазон значений, определение и т.д.) четко зафиксированы и не могут быть изменены программистом.
Целочисленный тип
Под целочисленными понимаются собственно целочисленные, а также неотрицательные типы, отличающиеся друг от друга диапазоном значением и объемом занимаемой памяти.
Таблица свойств целочисленных типов данных:
Целочисленный тип |
Диапазон возможных значений |
Объем занимаемой памяти |
Целочисленные типы |
||
Shortint |
-128 .. 127 |
1 байт |
Integer |
-32768 .. 32768 |
2 байта |
Longint |
-2147483648 .. 2147483647 |
4 байта |
Неотрицательные типы |
||
Byte |
0 .. 255 |
1 байт |
Word |
0 .. 65535 |
2 байта |
С помощью функции ODD можно определить, является ли целочисленное значение четным или нет. Функция возвращает True, если значение, переданное ей, нечетно.
function Odd(X: Longint): Boolean;.
Например:
Begin
Writeln(odd(10));
Writeln(odd(15));
End.
В результате работы этой программы на экране появится:
FALSE
TRUE
Логический тип
Логический тип определяется зарезервированным словом boolean и имеет только 2 значения - TRUE(истина) и FALSE(ложь). Переменные логического типа - основа булевой алгебры, и все законы преобразований на основе логических операций (см. приложение и параграф 1.4.3.2) верны и в Турбо-Паскале. С их помощью можно легко, например, заменить цикл с предусловием на цикл с постусловием (если конечно предусловие не является определяющей причиной использования цикла While) и наоборот, сократить логическое выражение и т.д.
Например:
1) Используя правило де Моргана (см. приложение), цикл
while not(d>5)or not (x<d) do …;
можно заменить на цикл
repeat … until (d>5)and (x<d);
2) Значение логического выражения (x>5)or(x=5) and (not (x>=5)) равно false вне зависимости от значения x.
Переменным логического типа можно присваивать произвольные логические выражения.
Например:
var a, b: boolean;
x, y: integer;
begin
…
a:=(x>7)or not(y<x) and (y<>0);
b:=a or (x=y);
a:=b and a;
…
end.
При переводе логического значения в целочисленное, для false мы получим число 0, для true - 1. При обратном переводе значение 0 преобразуется в false, любое другое значение - в true. Для значений логического типа всегда верно условие: TRUE>FALSE.
Например: процедура writeln(true<=false) выведет на экран слово FALSE.
Символьный тип
Любая переменная символьного типа может содержать в себе один из 256 символов набора ASCII. Объем памяти, занимаемый переменными этого типа, составляет 1 байт. Правила построения констант символьного типа соответствуют правилу построения строковых констант (см. параграф 1.3.2.7) с одним символом. Все операции, допустимые для строк, могут быть использованы и для типа Char.
Специально для символьного типа существует функция Chr, которая осуществляет перевод однобайтового значения в тип Char.
function Chr(X: Byte): Char;
Таким образом можно легко получить символьное представление любого числа.
Пример:
Var a:byte;
begin
repeat
readln(A);
writeln(chr(A));
until a=0;
end.
С помощью этой программы можно определить символ по его коду. Однако следует учесть, что многие символы обладают специальными функциями и не имеют поэтому визуального отображения. Например, попытка вывести на экран символ с кодом 7 закончится гудком встроенного динамика компьютера, символ с кодом 13 означает переход на следующую строку, а с кодом 10 - в начало строки и т.д.
С помощью функции Ord можно создать программу, которая будет выводить на экран код введенного символа. При этом вместо процедуры Readln удобно воспользоваться функцией ReadKey (см. параграф 1.5.2).
Uses crt; {подключение модуля, который содержит
функцию readkey}
Var c:char;
begin
repeat
c:=readkey;
writeln(ord(c));
until c=#27;
end.
Выполнение программы закончится, когда пользователь нажмет на клавишу ESC (код 27). Запустив и немного поэкспериментировав с программой, можно заметить, что некоторые клавиши (например - клавиши курсора) имеют двухбайтовый код. Этот нюанс следует учитывать, разрабатывая программы, которые основаны на анализе вводимой с клавиатуры информации.
Перечислимый тип
Перечислимый тип и тип поддиапазона, в отличии от встроенных порядковых типов, не задаются каким либо зарезервированным словом. Диапазон значений этих типов и размер памяти, выделяемый для них, изменяется в зависимости от конкретного определения.
Перечислимый тип используется в случаях, когда диапазон значений некоторой переменной заранее известен, немногочисленнен и может быть символически описан.
Перечислимый_тип::= "(" ИД {"," ИД} ")"
Например: тип week (неделя) может быть описан с помощью семи значений: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Определяем тип Week:
type Week=(monday, tuesday, wednesday, thursday, friday, saturday, sunday);
Идентификаторы, с помощью которых определяется перечислимый тип, понимаются как константы внутри блока, в котором они определены.
Согласно этому правилу monday является константой типа Week.
Размер памяти, отводимый для перечислимого типа, зависит от количества констант, определяющих данный тип, и может быть 1, 2 или (что совершенно невероятно!) 4 байта.
Создавая, например, на ТП компилятор или интерпретатор какого-либо алгоритмического языка, часто определяют перечислимый тип, в качестве имен констант которого служат аббревиатуры зарезервированных слов языка. Естественно, что таких слов может быть более 256, и тогда под переменную данного типа будет выделяться 2 байта оперативной памяти. Однако ситуация, когда количество констант начнет превышать число 65536 (то есть под переменную будет отведено не 2, а 4 байта) практически невозможна.
Тип поддиапазона
Тип поддиапазона используется, когда программисту для решения задачи требуется не весь диапазон значений какого-либо порядкового типа, а только его часть. Таким образом, тип поддиапазона определяется как диапазон значений некоторого порядкового типа (главного типа), причем определение поддиапазона включает наименьшее и наибольшее значения из этого типа.
Тип_поддиапазона::=константа .. константа.
Например:
0 .. 100
-139 .. 34
0 .. 24
Tuesday .. Saturday
Объем памяти, выделяемый для типа поддиапазона может быть 1, 2 или 4 байта в зависимости размера диапазона.
Чаще всего тип поддиапазона применяется при объявлении массивов (см. параграф 1.7.2.1).
Свойства порядковых типов
Порядковый тип обладает некоторыми специфическими свойствами, которые реализуются с помощью следующего набора процедур и функций.
Получение порядкового номера |
function Ord(X): Longint; |
Значение порядкового типа характеризуется порядковым номером. Первое значение любого порядкового типа, кроме целочисленных, имеет порядковый номер 0, следующее - 1, и т.д. Порядковый номер значения целочисленного типа равен самому этому значению. Функция Ord осуществляет перевод значения любого порядкового типа в его порядковый номер. |
Получение предыдущего и последующего значений |
function Pred(X: порядковый_тип): тот_же_тип; |
Функция Pred возвращает предыдущее значение аргумента. Если X - первое значение порядкового типа (нижняя граница), то выдается сообщение об ошибке. |
function Succ(X: порядковый_тип): тот_же_тип; |
Функция Pred возвращает последующее значение аргумента. Если X - последнее значение порядкового типа (верхняя граница), то выдается сообщение об ошибке. |
Увеличение и уменьшение значений переменных |
procedure Inc(var X [ ; N: Longint ]); |
Процедура Inc увеличивает переданное ей значение X на N. Если N отсутствует, то X увеличивается на 1 (т.о. Inc(x,n) эквивалентно x:=x+n, а Inc(x) эквивалентно x:=x+1). |
procedure Dec(var X [ ; N: Longint ]); |
Процедура Dec уменьшает переданное ей значение X на N. Если N отсутствует, то X уменьшается на 1 (т.о. Dec(x,n) эквивалентно x:=x-n, а Dec(x) эквивалентно x:=x-1). |
Пример использования функции Ord:
1) begin Writeln(ord(true),' ',ord(false)); End.
В результате выполнения программы на экране появятся числа 1 и 0.
2) При рассмотрении перечислимого типа мы определили тип Week:
type Week=(monday, tuesday, wednesday, thursday, friday, saturday, sunday);
Функция ord(monday) возвратит 0, ord(tuesday) - 1 и т.д.
Задача 23. Определить сумму цифр натурального числа.
var N,i,s:integer;
begin
readln;{вводим натуральное число}
s:=0; {первоначальное значение суммы}
while n<>0 do begin {пока число не обратилось в 0}
i:=n mod 10; {находим последнюю цифру числа}
inc(s,i);{увеличиваем сумму на эту цифру}
n:=n div 10; {уменьшаем число в 10 раз, чтобы добраться до следующей цифры}
end;
writeln(s);
readln;
end.