49 Функции. Коды символов
Дата публикации: 18.03.2018 18:15:02
Обработка символов
Символы - это тип данных, состоящих из одного символа. На него отводится один байт памяти.
Описание символьного типа данных
Имя типа
Char
Размер в байтах
1
Диапазон
Все символы кодовой таблицы
В тексте программы значения переменных и констант символьного типа заключают в апострофы, например, ‘a’, ‘Ш’, ’9’, либо в специальных функциях указывают десятичный номера (ASCII-код) символа от 0 до 255, например #55. Если требуется записать сам символ апострофа как символьную константу, то апострофы просто удваиваются ''''.
Поскольку в байт можно записать только двоичные числа от 0 до 255, то приняты таблицы кодирования символов, в которых каждому символу сопоставлено число, которое называется кодом символа.
Все имеющиеся символы пронумерованы от 0 до 255, символы с кодами 0-го по 31-й - невидимые, как правило, они не отображаются на экране, 32-й символ - это пробел. Приведем также номера некоторых других символов (хотя помнить эти номера нет никакой необходимости):
'0'...'9' - 48...57,
'A'...'Z' - 65...90,
'a'...'z' - 97...122,
'А'...'Я' - 128...159,
'а'...'п' - 160...175,
'р'...'я' - 224...239.
Символы с кодами от 0 до 127 построены по стандарту ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информацией, читается "аски"). Вторая половина таблицы (коды 128 ... 255) содержит буквы национальных алфавитов (для нашей страны кириллицу) и символы псевдографики. Для того, чтобы определить по этим таблицам код того или иного символа, нужно сложить номер строки с номером столбца, в которых он расположен (рис. 7.1). Так, код цифры 5 равен 05+048 = 053.
Некоторые из невидимых символов могут оказаться вам полезны:
· символ #7 – выдает "звуковой сигнал", при выводе на экран он пищит;
· символ #10 - "конец строки", при выводе он перемещает текущую позицию вывода на одну строку вниз;
· символ #13 - "возврат каретки" - перемещает текущую позицию вывода в начало текущей строки. Запомните, что клавиша Enter генерирует два символа - #10 и #13, это может вам впоследствии пригодиться.
Рис. 7.1. Коды символов в таблице символов (в кодировке DOS)
Символьные данные можно вводить и выводить процедурами READ и WRITE при вводе и выводе символьные значения оформляются без апострофов. Для символьных величин определены следующие функции (см. таблицу 7.1).
Таблица 7.1. Функции обработки символов
Примеры программы на использовании функции Ord, Chr, Pred и Succ.
Определить код введенного символа.
program numb_symb1;
var b : char;
begin
write('Введите любой символ : '); read(b);
writeln(b, ' имеет номер (код) ', Ord(b)); { возвращает номер символа}
end.
Вывести символы кодовой таблицы с номера от 32 до 255
program nubm_symb2;
var i : integer;
begin
for i:=32 to 255 do
write(char(i), ‘ ‘); {выводим символы с номерами от 32 до 255}
end.
Вывести на экран символы, предыдущий и последующий к введенному символу.
program numb_symb3;
var b : char;
begin
write('Введите любой символ с клавиатуры '); read(b);
writeln('предыдущий символ ', Pred(b)); { возвращает символ с номером, меньшим на 1, аналог ord(b)+1 }
writeln('следующий символ ', Succ(b)); { возвращает символ с номером, большим на 1, аналог ord(b)-1 }
end.
Значение переменной символьного типа может быть задано несколькими способами:
sym:=’0’
sym:=#48 или
sym:=chr(48)
Символом в апострофах
Указанием кода символа
(в данном случае 48 – код нуля)
Т.к. одна переменная типа char хранит информацию об одном коде ASCII-символа, то это можно использовать, например, для отслеживания действий пользователя по нажатию клавиш. Приведем один полезный пример использования отслеживания нажатия клавиши в диалогах в пользовательских программах.
Program yes_no;
var ch:char;
begin
repeat
writeln;
write ('Продолжить? (Y/N)');
readln (ch);
if (ch='Y') or (ch='y') then
begin
{Здесь находиться основная часть программы }
end
else if (ch='N') or (ch='n') then halt
{Завершение программы}
else writeln ('Нажмите Y или N');
until false;
end.
В разделе описаний можно определить массив символов (строчку или матрицу). Например, так:
St : array[1..20] of char; // описание строки из 20 символов
Или удобнее воспользоваться специальным типом – String (строка).
Определение кода по символу и символа по коду
var c: char; code: integer;begin c := 'z'; code := Ord(c); writeln('Код символа ',c,' равен ',code); code := 35; c := Chr(code); writeln('Символ с кодом ',code,' - это ',c);end.
Преобразование цифрового символа в соответствующее однозначное число и обратно
var c: char; digit: integer;begin c := '5'; digit := Ord(c) - Ord('0'); writeln('Цифра, соответствующая символу ''',c,''' - это ',digit); digit := 7; c := Chr(digit + Ord('0')); writeln('Символ цифры ',digit,' - это ''',c,'''');end.
Преобразование числа в строку и обратно
var s: string; num: integer;begin s := '356'; num := StrToInt(s); writeln('Число, соответствующее строке ''',s,''' - это ',num); num := 563; s := IntToStr(num); writeln('Строка, соответствующая числу ',num,' - это ''',s,'''');end.
Формирование строки из n одинаковых символов
var c: char; s: string; n: integer;begin n := 10; c := 'z'; s := ''; for var i:=1 to n do s += c; writeln(s);end.
Замена всех маленьких английских букв в строке соответствующими большими
var s: string := 'Hello, World!';begin var dist := Ord('a')-Ord('A'); for var i:=1 to s.Length do if s[i] in ['a'..'z'] then s[i] := Chr(Ord(s[i])-dist); writeln(s);end.
Сумма записанных в строке чисел
var s: string := '1 2 4 8 16 32 64 128 256 512'; sum: integer; num,p: integer; numstr: string;begin sum := 0; while s.Length>0 do begin while s[1]=' ' do // Удаление лидирующих пробелов Delete(s,1,1); p := Pos(' ',s); // Поиск следующего пробела if p=0 then // Если он не найден, то до конца строки находится последнее число p := s.Length; numstr := Copy(s,1,p); Delete(s,1,p); num := StrToInt(numstr); sum += num; end; writeln('Сумма чисел строки равна ',sum);end.
Количество вхождений подстроки в строку
var s: string := 'this bra is abracadabra'; subs := 'bra'; count: integer;begin count := 0; var scopy := s; while s.Length>0 do begin var p := Pos(subs,s); // Поиск подстроки в строке if p=0 then break; count += 1; Delete(s,1,p+subs.Length); end; writelnFormat('Количество вхождений ''{0}'' в ''{1}'' равно {2}',subs,scopy,count);end.