Char — символьный тип данных в Pascal
Обновлено: 18.04.2026
В языке программирования Pascal есть еще один тип данных, под переменные которого выделяется 1 байт памяти, — это символьный тип char.
Переменная этого типа может принимать одно из 256 значений. Только значения эти не числа, а символы. К ним относятся буквы, символы цифр, знаки препинания, управляющие символы (например, переход на новую строку) и некоторые другие.
var a, s, e, d: char; begin a := 'R'; s := ' '; e := '!'; d := '5'; writeln(a, s, e, s, d); end.
R ! 5
Напишите программу, которая запрашивает с клавиатуры два символа и выводит их в обратном порядке. При этом не вводите русские буквы, так как скорее всего получите некорректный вывод.
В битах символьного байта хранятся двоичные коды десятичных чисел, а сопоставление с символами идет на уровне языка программирования и операционной системы. Чтобы увидеть десятичное число, которое соответствует символу, надо воспользоваться стандартной функцией ord языка Pascal:
var a: char; b: byte; begin a := 'R'; b := ord(a); writeln(a, ' = ', b); writeln('r = ', ord('r')); writeln('9 = ', ord('9')); end.
R = 82 r = 114 9 = 57
С помощью функции chr выполняют обратный процесс, то есть по коду получают символ:
var a: char; b: byte; begin b := 100; a := chr(b); writeln(b, ' -> ', a); writeln('126 -> ', chr(126)); writeln('55 -> ', chr(50)); end.
100 -> d 126 -> ~ 55 -> 2
Напишите программу, которая запрашивает с клавиатуры символ и выводит его код. Какой код вы получите, если будете нажимать Enter без ввода символа?
Некоторых символов нет на клавиатуре (например, символ звука — #7) или их невозможно написать. Тогда мы можем использовать непосредственно числовой код символа, но делать это надо через знак решетки. В примере ниже 9 — это код табуляции, а 10 — перехода на новую строку:
var a: char; begin a := #9; writeln(1, a, 2, #10, 3); end.
1 2 3
Первые 128 значений символьного типа (в десятичной системе это числа от 0 до 127 включительно) сопоставляются кодам символов из таблицы ASCII (эски) — американский стандартный код для обмена информацией.
Первые символы в ASCII с кодами от 0 до 31, а также последний с кодом 127 называются управляющими или непечатаемыми символами. Они были разработаны не для отображения букв или цифр, а для передачи команд устройствам (например, принтерам или терминалам) и управления протоколами связи. Большинство из них сегодня считаются устаревшими.
Символ с кодом 32 — это пробел. Начиная от него и до символа с кодом 126 включительно, выведем сами символы и соответствующие им коды с помощью цикла for языка Pascal:
var i: byte; begin for i:=32 to 126 do writeln(i, '-', chr(i)); end.
Если выполнить эту программу, то получится очень длинный вывод в столбик. Если же поменять writeln на write, то будет одна очень длинная строка. Поэтому, чтобы вывод был более читаемым, его "оформляют" в виде таблицы. Для этого можно использовать условный оператор, который будет осуществлять переход на новую строку после каждого 10-го выведенного символа. Поскольку у нас первое значение i равно 32, то десятое после него — это 41. При делении на 10 получится остаток 1. Таким образом условием перехода на новую строку для всех остальных значений в данном случае тоже будет такой остаток:
var i: byte; begin for i:=32 to 126 do begin write(i:3, '-', chr(i), ' '); if i mod 10 = 1 then writeln; end; writeln; end.
32- 33-! 34-" 35-# 36-$ 37-% 38-& 39-' 40-( 41-)
42-* 43-+ 44-, 45-- 46-. 47-/ 48-0 49-1 50-2 51-3
52-4 53-5 54-6 55-7 56-8 57-9 58-: 59-; 60-< 61-=
62-> 63-? 64-@ 65-A 66-B 67-C 68-D 69-E 70-F 71-G
72-H 73-I 74-J 75-K 76-L 77-M 78-N 79-O 80-P 81-Q
82-R 83-S 84-T 85-U 86-V 87-W 88-X 89-Y 90-Z 91-[
92-\ 93-] 94-^ 95-_ 96-` 97-a 98-b 99-c 100-d 101-e
102-f 103-g 104-h 105-i 106-j 107-k 108-l 109-m 110-n 111-o
112-p 113-q 114-r 115-s 116-t 117-u 118-v 119-w 120-x 121-y
122-z 123-{ 124-| 125-} 126-~
При установке компилятора fpc, также устанавливаются различные его модули, среди которых есть crt. Он позволяет в том числе изменять цвет символов. Сначала проверьте, что такой модуль есть в вашей ОС. Для этого добавьте команду uses crt; в самом начале кода. Если скомпилировать программу удастся, значит модуль есть. В этом случае измените программу с выводом таблицы символов так, чтобы коды были одним цветом, а сами символы другим. Для этого используется процедура TextColor, в скобках которой передается название цвета. Цвета в crt — это константы с именами White, LightBlue, Cyan, Red, Blue, Green и другие.
Обратим внимание на то, что таблица ASCII заканчивается на коде 127. Однако максимальное значение однобайтового char — это 255. Поэтому коды, начиная с 128-го по 255-й включительно использовались под символы национальных алфавитов (в этот же диапазон помещались математические, валют и другие). Получались различные "расширенные таблицы ASCII". Каждая из них была уникальна, но у всех совпадали первые 128 символов. Позже широкое применение нашла таблица символов Unicode и способы кодирования символов под нее (например, UTF-8). В статье раздела "Информатика" рассказано подробнее о кодировании символов.
В результате, чтобы иметь возможность присваивать переменным char русские буквы, надо сохранять файл в одной из национальных кодировок, и использовать ее же в терминале, куда происходит вывод. Но на сегодняшний день по-умолчанию в большинстве случаев везде используется UTF-8. В этой кодировке под русские буквы отводится 2 байта, а не 1. Поэтому их невозможно сохранить в переменной типа char. Для решения этой проблемы в Pascal есть другие символьные типы, однако мы их рассматривать не будем. Хранить русские символы и слова можно в переменных типа string, с которым мы познакомимся позже.
Вернемся к таблице ASCII и заметим, что символы упорядочены в соответствии с их кодом. Это позволяет применять к ним операции сравнения:
var b, n: char; begin b := 'A'; n := '2'; writeln(b > 'W'); writeln(ord(b), ' > ', ord('W'), ' - это ложь'); writeln(n < b); writeln(ord(n), ' < ', ord(b), ' - это правда'); end.
FALSE 65 > 87 - это ложь TRUE 50 < 65 - это правда
Напишите программу, которая запрашивает с ввода два символа и сообщает, какой из них предшествует другому по таблице ASCII.
Таким образом, символьный тип относится к последовательностям как и целые числа. Это значит, что символы можно передавать в функции pred иsucc, процедуры inc и dec.
Задания для дополнительной или самостоятельной работы:
- В Паскале есть функция
upcase, которая преобразует строчную букву в заглавную (не работает с русскими буквами). Напишите код, который запрашивает с клавиатуры символ, применяет к немуupcase, результат выводит на экран. Что будет, если вводить любой знак препинания, символ процента, цифру? - Проверьте, можно ли применять оператор сложения к данным символьного типа, и что при этом получается.