Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

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. Ми згадували цей тип даних, але ще не працювали з ним. Зробимо це в наступному розділі.