Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всё_о_Паскале.doc
Скачиваний:
7
Добавлен:
20.11.2018
Размер:
4.54 Mб
Скачать

20. Обработка символьных и строковых данных

Компьютер способен обрабатывать не только числовые данные. Задачи обработки символьных данных распространены не менее, а возможно и более, чем чисто арифметические расчеты. В этой главе мы изучим работу с символами и строками средствами Паскаля.

20.1. Работа с символами

Для работы с отдельными символами описываются переменные типа char:

Var ch:char;

{ . . . }

Ch:='Y';

Одна переменная типа char хранит информацию об одном коде ASCII-символа. Это можно использовать, например, для отслеживания действий пользователя по нажатию клавиш. Приведем пример одного из вариантов такой программы:

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, затем Enter!');

until false;

end.

Для работы с кодами символов существуют 2 основных функции:

Function Ord(X) : Char; - возвращает ASCII-код символа X

Function Chr(X : Byte) : Char; - возвращает символ с указанным ASCII-кодом X

Используем последнюю функцию для того, чтобы узнать, как вообще выглядит таблица символов:

var i,j:integer;

begin

Writeln;

Write ('ASCII-коды [32..255]');

for i:=2 to 15 do begin

writeln;

write (i*16:3,' ');

for j:=0 to 16 do write (Chr(i*16+j), ' ');

end;

Writeln;

Write ('ENTER для выхода...');

readln;

end.

Здесь печатаются только символы с кодами от 32 до 255 включительно, т.к. первые 32 символа с кодами от 0 до 31 – непечатаемые (такие, как табуляция или перевод строки).

Для определения того, попадает ли код символа в некоторый диапазон значений, удобно использовать оператор in, как это делает следующий фрагмент программы:

write ('Введите символ: '); readln (ch);

if ch in ['A'..'Z'] then write ('Большая латинская;')

else if ch in ['a'..'z'] then write ('Малая латинская;')

else if (ch in ['А'..'Я']) then write ('Большая русская;')

else if (ch in ['а'..'п']) or (ch in ['р'..'я']) then

write ('Малая русская;')

else if ch in ['0'..'9'] then write ('Цифра;')

else write ('Это не алфавитно-цифровой символ;');

write (' Код Вашего символа= ',Ord(ch));

Работая с алфавитными символами, приходится отдельно учитывать ввод строчных и прописных букв. Удобнее сначала преобразовать все символы к прописным с помощью функции Upcase:

var ch:char; i:integer;

begin

repeat

for i:=1 to random(72) do write ('*');

writeln;

write ('Продолжить? (Y/N)');

readln (ch);

until upcase(ch)='N';

end.

К сожалению, эта функция бесполезна при работе с символами русского и других национальных алфавитов, для ее замены напишем и протестируем собственную подпрограмму c названием upcase_ru:

procedure upcase_ru (var s:string);

var i,l,c:integer;

begin

l:=length(s);

for i:=1 to l do begin

c:=Ord(s[i]);

if (c>=Ord('а')) and (c<=Ord('п')) then c:=c-32

else if (c>=Ord('р')) and (c<=Ord('я')) then c:=c-80;

s[i]:=Upcase(Chr(c));

end;

end;

var s:string;

begin

writeln ('Введите строку текста:');

readln (s);

upcase_ru (s);

writeln ('Преобразованная строка:');

writeln (s);

end.

Программа учитывает, что в кодировке DOS не все символы кириллицы закодированы идущими подряд числами (см. Приложение 1).

Кроме того, в программе уже применяется массив символов, которому в Паскале соответствует тип данных String. Мы упоминали этот тип данных, но еще не работали с ним. Сделаем это в следующем разделе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]