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.

Задания для дополнительной или самостоятельной работы:

  1. В Паскале есть функция upcase, которая преобразует строчную букву в заглавную (не работает с русскими буквами). Напишите код, который запрашивает с клавиатуры символ, применяет к нему upcase, результат выводит на экран. Что будет, если вводить любой знак препинания, символ процента, цифру?
  2. Проверьте, можно ли применять оператор сложения к данным символьного типа, и что при этом получается.