§5. Символьный тип данных в языке Паскаль

Теперь применим полученные знания о представлении текстовой информации на практике. В языке программирования Паскаль для работы с текстовой информацией есть специальный символьный тип переменных, который называется char (от английского character). Переменные этого типа занимают в оперативной памяти по `1` байту и, соответственно, могут принимать `256` различных значений. Значениями переменных этого типа являются элементы какой-либо однобайтовой кодовой таблицы (например, KOI-`8` или Windows-`1251`). Какие именно символы являются значениями данного типа, зависит от того, какая кодовая таблица используется в момент выполнения (а не написания) программы. То есть одна и та же программа, например, печатающая изображение всех символов кодовой таблицы, на компьютерах с различными текущими кодировками будет иметь различные результаты работы.


Переменным символьного типа можно присваивать значения при помощи оператора присваивания. При этом есть два способа записи символьных констант. Первый способ – записать явное изображение символа, заключив его в апострофы. Пусть, например, переменная C имеет тип char. Присвоим ей значение: C:= 'a'; Описанный способ записи символьных значений удобно применять практически всегда. Единственный недостаток этого способа заключается в том, что так невозможно представить служебные символы, которые не имеют явных изображений (в кодовой таблице это первые `32` символа). Поэтому существует ещё один способ записи символьных констант – сначала указать спецсимвол решётку (#), а потом код интересующего нас символа. Например, C:=#13; Недостаток этого способа заключается в том, что нужно помнить коды всех символов, поэтому обычно его применяют только для записи символов без явного изображения.


Переменные типа char можно выводить на экран при помощи оператора вывода и вводить с клавиатуры. Апострофы при вводе набирать не нужно (каждый апостроф также будет считаться отдельным символом). Служебные символы вводятся следующим образом: нужно зажать alt и на правой цифровой клавиатуре набрать код символа (например, 13).


К переменным типа char можно применять операции сравнения (> , < , >= , <= , = , <>). При этом сравниваются коды символов и большим признаётся символ, имеющий больший код (то есть символ, находящийся дальше от нулевого). Результатом операции сравнения является логическое значение – true или false.


Существует `5` стандартных функций для работы с переменными символьного типа:

Функция

Действие

Тип

аргумента

Тип

результата

Ord(c)

Выдаёт код символа

Char

Integer

Chr(x)

Выдаёт символ по коду

Integer

Char

Succ(c)

Выдаёт следующий символ кодовой таблицы. Не определена для последнего символа

Char

Char

Pred(c)

Выдаёт предыдущий символ кодовой таблицы. Не определена для нулевого символа

Char

Char

Upcase(c)

Если аргумент является строчной латинской буквой, превращает его в соответствующую заглавную. Иначе ничего не делает

Char

Char


Тип char является порядковым, то есть для каждого символа можно назвать его порядковый номер в типе, а также следующий и предшествующий элементы типа. Например, символ '1' имеет код `49`, следующий символ – это '2', а предыдущий – '0'. Благодаря этому свойству переменные типа char могут использоваться в качестве счётчиков в цикле for. Например, распечатать все заглавные латинские буквы можно следующим образом:


For  c:= 'A' to 'Z' do write (c);


где переменная c имеет тип char.


Если в цикле for используется слово to, то на каждом шаге цикла счётчик будет принимать следующее значение в типе, в случае же downto – предыдущее значение в типе.


Рассмотрим несколько примеров задач на символьные переменные.


Задача 1

Вывести на экран все символы кодовой таблицы.

Решение

Эту задачу можно решать двумя способами: перебрать все символы или все их коды – разница только в типе счётчика цикла.

Способ 1:

  var c:char;

  begin

     for c:=#0 to #255 do

        write(ord(c),'-',c,' ');

      readln

end.

Способ 2:

var i:integer;

begin

   for i:=0 to 255 do

      write(i, '-',chr(i), ' ');           

   readln

end.



Задача 2

Дана последовательность символов, заканчивающаяся точкой. Подсчитайте сумму цифр, входящих в эту последовательность.

Решение

Эта задача демонстрирует очень важную вещь – как превратить символ-цифру в целое число. Это осуществляется следующим образом: необходимо вычислить код интересующего нас символа (например, код единицы `49`) и вычесть из него код символа «ноль». В любой кодировочной таблице символы-цифры идут подряд, поэтому, выполнив указанные действия, мы гарантированно получим числовое значение символа-цифры. Приведём полный текст решения.

var c: char; s: integer;

begin

   s :=0;

   read (c);

   while c <> '.' do

     begin

     if (c >= '0')and(c <= '9')

       then s:= s+ord(c)–ord('0');

         read (c);

       end;

   writeln ('s=',s);

   readln

  end.


Задача 3

Дана непустая последовательность слов, состоящих из заглавных и строчных латинских букв в любом порядке. Между соседними словами запятая, за последним словом – точка. Никакие другие символы в последовательность не входят. Определить количество слов, которые начинаются на букву `Z`.

Решение

Это ещё один классический тип задач на обработку последовательностей символов. При её решении у нас возникнет конструкция из вложенных циклов: внутренний цикл анализирует слово, а внешний перебирает слова. Приведём полный текст решения.

var c:char; s:integer;

begin

   s:=0;

   repeat

     read(c);

     if c='Z' then s:=s+1;

     repeat

       read(c)

     until (c=',')or(c='.') 

   until c='.'; 

   writeln('s=',s);

   readln

end.