Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_programmirovanija_v_srede_lazarus.pdf
Скачиваний:
181
Добавлен:
18.03.2015
Размер:
6.53 Mб
Скачать

3.3Обработка символьной информации в Паскале

____________________________________________________________________

Как уже отмечалось в 2.1.8. Lazarus представляет собой среду с графиче-

ским интерфейсом для быстрой разработки программ и базируется на ориги-

нальной кроссплатформенной библиотеке визуальных компонент LCL (Lazarus Component Library). Разработчиками Lazarus предложено использовать UTF-8 в LCL в качестве универсальной кодировки на всех платформах. Поэтому LCL

содержит, кроме визуальных компонентов, функции преобразования UTF-8 в

кодировку, с которой работает консоль на каждой из платформ. Функция

UTF8ToConsole() объявлена в модуле FileUtil, которая является частью LCL.

Вот почему мы должны были в наши консольные проекты добавлять библиоте-

ку LCL.

3.3.1.1. Тип Char

Для обозначения типа "символ" в Паскале используется зарезервированное слово char. Для хранения переменной типа "символ" требуется один байт па-

мяти, т.е. значением переменной типа char является один символ.

Напоминаю, что хотя компьютер обрабатывает символы, тем не менее, в

действительности он оперирует с числами, а точнее с кодами этих символов из кодовой таблицы. Таким образом, один символ может быть "больше", чем дру-

гой или "меньше". Это зависит от места расположения символов в таблице. На-

пример, символ (буква) 'B' "больше" буквы 'A', поскольку код 'B' (номер в кодовой таблице) равен 66, а код буквы 'A' равен 65 (буквы английского ал-

фавита, см. табл. 3.4.). В силу этого, над символьными переменными определе-

ны операции отношения: =, <, >, <>, <=, >=.

3.3.1.2. Функции для работы с символами

Для символьных переменных существуют следующие функции: chr(x) – возвращает значение символа по его коду;

ord(ch) – возвращает код символа ch;

170

Глава 3 Более сложные элементы языка

____________________________________________________________________

pred(ch) – возвращает предыдущий символ из кодовой таблицы; succ(ch) – возвращает следующий символ кодовой таблицы; upcase(ch) – преобразует строчную букву в заглавную. Работает только

для букв английского алфавита.

3.3.1.3. Тип String

Строкой называется некоторая последовательность символов: 'ААВВCC',

'Вася-это кот'.

Строка может состоять из нескольких символов, из одного символа, а мо-

жет быть совсем пустой. Максимальная длина строковой переменной зависит от директивы компилятора $H. Если включена директива {$H-}, то максималь-

ная длина строки 255 байтов, если же включена директива {$H+}, то длина строки практически неограниченна и может достигать до ~2 Гб.

Тип строковой переменной указывается зарезервированным словом string. Если заранее точно известна длина строки, например 30 символов,

то можно указать string[30].

Строковую переменную можно рассматривать как одно целое, а можно как массив символов, причем нумерация символов начинается с 0.

Пример описания строк и символов.

var Symbol: char;

Message: string;

Name: string[30];

Какие операции допустимы для строк и символов? Только операция сло-

жения. При этом в результате получается строка.

Пример:

program ch_str;

171

3.3Обработка символьной информации в Паскале

____________________________________________________________________

{$mode objfpc}{$H+} uses

CRT, FileUtil; var

Symbol: Char;

Mum, Str: string;

begin

Symbol:='A'; // это буква A латинского алфавита

Str:= 'Ш';

Str:= Str + Symbol;

Mum:= 'МАМА';

Mum:= Mum + Str;

{теперь Mum = 'МАМАШA '}

writeln(UTF8ToConsole(Mum));

Str:= ' ПАПАША = ПРЕДКИ';

Mum:= Mum + ' +' + Str;

{теперь Mum = 'МАМАШA + ПАПАША = ПРЕДКИ '}

writeln(UTF8ToConsole(Mum));

writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

Обратите внимание, если вы в операторе

Symbol:='A';

укажете русскую букву 'А', то компилятор выдаст ошибку!

Как уже отмечалось, в Lazarus и FPC используется кодировка UTF8. В этой кодировке для представления кириллических символов используются два бай-

та. Таким образом, переменной типа char нельзя присвоить значение кирил-

172

Глава 3 Более сложные элементы языка

____________________________________________________________________

лицы. Если вы все же хотите использовать символы кириллицы в символьных переменных, то используйте тип TUTF8Char, как в следующем примере.

Пример:

program ch_str; {$mode objfpc}{$H+} uses

CRT, FileUtil, LCLType; var

Symbol: TUTF8Char; // новый тип, введенный в FPC

Mum, Str: string; begin

Symbol:='А'; // это русская буква А, занимает в памяти два байта

Str:= 'Ш';

Str:= Str + Symbol;

Mum:= 'МАМА';

Mum:= Mum + Str;

{теперь Mum = 'МАМАШA '}

writeln(UTF8ToConsole(Mum));

Str:= ' ПАПАША = ПРЕДКИ';

Mum:= Mum + ' +' + Str;

{теперь Mum = 'МАМАШA + ПАПАША = ПРЕДКИ '}

writeln(UTF8ToConsole(Mum));

writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

Заметьте, что в строковых переменных (типа string) под символы латиницы

(коды которых меньше 128 в таблице ASCII) отводится один байт, а под симво-

лы кириллицы отводится два байта!

Следующая программа имитирует процесс авторизации пользователя для

173

3.3Обработка символьной информации в Паскале

____________________________________________________________________

входа в систему. Для этого пользователь должен ввести правильный пароль.

Если после трех попыток правильный пароль не будет введен, пользователю будет запрещен доступ в систему.

program password; {$mode objfpc}{$H+} uses

CRT, FileUtil, LConvEncoding; var

answ, passw: string; n: integer;

begin

passw:= 'абвг'; n:= 1;

repeat

writeln(UTF8ToConsole('Введите пароль')); readln(answ);

{$IFDEF WINDOWS}

answ:= CP866ToUTF8(answ); // преобразование введенной

// строки к UTF8

{$ENDIF}

if answ <> passw then begin

if n = 1 then begin

writeln(UTF8ToConsole('Вы не пользователь'));

inc(n);

end

else

174

Глава 3 Более сложные элементы языка

____________________________________________________________________

begin

if n = 3 then

begin

writeln(UTF8ToConsole('Вам отказано в доступе'));

break;

end

else

begin

writeln(UTF8ToConsole('Вы не пользователь')); writeln(UTF8ToConsole('Вы '), n, UTF8ToConsole('-раз ввели неправильный пароль')); writeln(UTF8ToConsole('После 3-й попытки вам ')); writeln(UTF8ToConsole('будет отказано в доступе'));

inc(n);

end

end

end

else

writeln(UTF8ToConsole('Здравствуйте, вы вошли в систему!'));

until answ = passw;

writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

В этой программе мы использовали функцию CP866ToUTF8() для пре-

образования введенной с клавиатуры строки к UTF-8. Разумеется, это касается только пользователей Windows, так как мы уже неоднократно отмечали, что в консоли Windows используется кодировка CP866. Функция CP866ToUTF8()

описана в модуле LConvEncoding.

Обратите внимание на директивы компилятора для условной компиляции

175

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