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.