
- Обучение
- Поступление в ЗФТШ
- О ЗФТШ
- Учителям
- Лекторий
-
Курсы
- Заочное отделение
- Очное отделение
- Факультативы
Теперь применим полученные знания о представлении текстовой информации на практике. В языке программирования Паскаль для работы с текстовой информацией есть специальный символьный тип переменных, который называется 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:
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.
Дана последовательность символов, заканчивающаяся точкой. Подсчитайте сумму цифр, входящих в эту последовательность.
Эта задача демонстрирует очень важную вещь – как превратить символ-цифру в целое число. Это осуществляется следующим образом: необходимо вычислить код интересующего нас символа (например, код единицы `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.
Дана непустая последовательность слов, состоящих из заглавных и строчных латинских букв в любом порядке. Между соседними словами запятая, за последним словом – точка. Никакие другие символы в последовательность не входят. Определить количество слов, которые начинаются на букву `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.