- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования Pascal
- •Основные элементы языка
- •Переменные. Стандартные типы.
- •Операции отношения
- •Раздел описаний переменных
- •Выражения. Порядок выполнения операций.
- •Константы
- •Комментарии в программе
- •Операторы
- •2.1.7.1. Оператор присваивания
- •2.1.7.2. Операторы ввода/вывода
- •2.1.7.3. Операторы инкремента и декремента
- •Среда разработки Lazarus
- •Русский язык в консольных приложениях
- •Первая программа
- •Открытие существующего проекта
- •Другие способы создания консольных приложений
- •Типовой пустой проект
- •Операции с целыми числами
- •Вместо лирического отступления 2
- •Стандартные функции с целыми аргументами
- •Операции с вещественными числами (тип real).
- •Форматирование вывода
- •Одновременное использование вещественных и целых чисел.
- •Другие стандартные функции с вещественными аргументами
- •Булевы переменные
- •Условные операторы.
- •2.1.22.1 Оператор if …. then
- •2.1.22.2. Оператор if …then ... else
- •Операторы цикла
- •2.1.23.1. Оператор цикла с предусловием
- •2.1.23.2. Оператор цикла с постусловием
- •2.1.23.3. Оператор цикла с параметром.
- •2.1.23.4. Второй вариант оператора цикла с параметром
- •Оператор выбора case
- •Организация простейшего контроля ввода данных.
- •Вычисление сумм сходящихся рядов
- •Реализация некоторых алгоритмов главы 1.
- •Программа решения задачи о поездах и мухе
- •Программа вычисления определенного интеграла
- •Более сложные элементы языка
- •Общая структура Паскаль – программы
- •Процедуры и функции
- •3.1.1.1 Структура процедуры
- •3.1.1.2. Структура функции
- •3.1.1.3 Глобальные и локальные переменные
- •3.1.1.4 Способы передачи параметров
- •3.1.1.5 Процедуры завершения
- •Еще раз о типах данных
- •Классификация типов данных
- •3.2.1.1 Целый тип
- •3.2.1.2. Интервальный тип
- •3.2.1.3. Перечислимый тип
- •3.2.1.4. Множества
- •3.2.1.5. Логический тип
- •3.2.1.6. Вещественный тип
- •3.2.1.7. Указатели
- •Обработка символьной информации в Паскале
- •Символьные и строковые типы данных.
- •3.3.1.1. Тип Char
- •3.3.1.2. Функции для работы с символами
- •3.3.1.3. Тип String
- •3.3.1.4. Строковые процедуры и функции
- •Массивы
- •Динамические массивы
- •Программа решения системы линейных алгебраических уравнений методом Гаусса
- •3.4.1.1. Вариант 1 – с goto
- •3.4.1.2. Вариант 2 – без goto
- •3.4.1.3. Вариант 3 – наилучшая реализация
- •Модули в Паскале
- •Структура модуля
- •Системные модули
- •3.5.2.1. Модуль CRT
- •Файлы
- •Тип данных – запись
- •Файловые типы
- •Процедуры для работы с файлами
- •3.6.3.1. Общие процедуры для работы с файлами всех типов
- •3.6.3.2. Процедуры для работы с текстовыми файлами
- •3.6.3.3. Процедуры для работы с типизированными файлами
- •3.6.3.4. Процедуры для работы с нетипизированными файлами
- •3.6.3.5. Организация контроля ввода/вывода при работе файлами
- •3.6.3.6. Создание простой базы данных с типизированными файлами.
- •Алгоритмы сортировки
- •Обменная сортировка (метод "пузырька")
- •Сортировка выбором
- •Сортировка вставками
- •Метод быстрой сортировки
- •Алгоритмы поиска
- •Поиск в массивах
- •Вставка и удаление элементов в упорядоченном массиве
- •Динамические структуры данных
- •Представление в памяти компьютера динамических структур.
- •Реализация стека с помощью массивов
- •Указатели
- •Стандартные операции с линейными списками
- •Реализация динамических структур линейными списками
- •4.3.6.1. Реализация стека
- •4.3.6.2. Реализация очереди с помощью линейного списка
- •4.3.6.3. Реализация двоичного дерева с помощью линейного списка
- •Сортировка и поиск с помощью двоичного дерева
- •Три источника и три составные части ООП.
- •Классы и объекты.
- •Обращение к членам класса.
- •Инкапсуляция
- •Спецификаторы доступа.
- •Свойства.
- •Наследование
- •Полиморфизм
- •Раннее связывание.
- •Позднее связывание.
- •Конструкторы и деструкторы.
- •Элементы графического интерфейса
- •Различия между консольными и графическими приложениями
- •Визуальное программирование в среде Lazarus
- •Создание графического приложения
- •Форма и ее основные свойства
- •Компоненты
- •Обработчики событий
- •Простейшие компоненты
- •6.3.5.1. Компонент TLabel
- •6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton
- •6.3.6.1. Компонент TEdit
- •6.3.6.2. Компонент TLabeledEdit
- •6.3.7.1. Компонент TMaskEdit
- •Специальные компоненты для ввода чисел
- •Тестирование и отладка программы
- •Компоненты отображения и выбора данных
- •6.3.10.1. Компонент TMemo
- •6.3.10.2. Компонент TStringGrid
- •6.3.10.3. Компоненты выбора
- •Компонент TListBox
- •Компонент TComboBox
- •Компоненты выбора – переключатели
- •6.3.10.4. Компоненты отображения структурированных данных
- •Компонент TTreeView
- •Компонент TListView
- •Организация меню. Механизм действий - Actions
- •6.3.11.1. Компонент TMainMenu
- •6.3.11.2. Компонент TToolBar
- •6.3.11.3. Компонент TActionList
- •6.3.11.4. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
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