- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования 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. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
2.1 Основные элементы языка
____________________________________________________________________
end.
Как мы видим, при использовании оператора for запись цикла становится короче. Поэтому, если заранее точно известно число повторений цикла или его можно вычислить перед выполнением цикла, то предпочтительней использо-
вать цикл for.
2.1.24 Оператор выбора case
Для программирования разветвлений в алгоритме чаще всего используется условный оператор if…then или if…then…else. Однако если путей выбора много, то запись алгоритма с помощью условного оператора становится гро-
моздкой и труднообозримой. В таких случаях намного удобнее использовать оператор выбора case. Этот оператор имеет следующий синтаксис:
case <выражение> of
значение 1: оператор 1;
значение 2: оператор 2;
………………………………………
значение n: оператор n;
else
оператор;
end;
В этой конструкции операторы могут быть составными, <выражение>
должно быть порядкового типа, т.е. integer, char, boolean, перечислимого или интервального типа. Более подробно о типах данных мы поговорим в 3.2.
Тип <значение> должен совпадать с типом <выражение>, может быть одно или несколько, разделенных запятыми, а также может представлять собой не-
который диапазон значений. Вся конструкция должна завершаться ключевым словом end.
Ветвь else вместе с оператором может отсутствовать.
124
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Оператор работает следующим образом:
1.вычисляется значение <выражения>.
2.выполняется оператор, метка которого <значение> совпадает со значе-
нием <выражение>.
3. Если ни одно<значение> не совпадает со значением <выражение>, вы-
полняется оператор после else.
Рассмотрим применение оператора выбора case на примере создания меню в консольных приложениях.
Пример.
program case_menu; |
|
{$mode objfpc}{$H+} |
|
uses |
|
CRT, FileUtil; |
|
var |
|
choose: integer; |
|
begin |
|
{Формирование меню} |
|
writeln(UTF8ToConsole('Выберите нужный режим работы |
:')); |
writeln(UTF8ToConsole('Создание файла |
1')); |
writeln(UTF8ToConsole('Вывод содержимого файла |
2')); |
writeln(UTF8ToConsole('Поиск записей по заданным полям |
3')); |
writeln(UTF8ToConsole('Добавление записей в файл |
4')); |
writeln(UTF8ToConsole('Удаление записей из файла |
5')); |
writeln(UTF8ToConsole('Корректировка записей в файле |
6')); |
writeln(UTF8ToConsole('Выход из программы |
7')); |
repeat |
|
125
2.1 Основные элементы языка
____________________________________________________________________
readln(choose);
case choose of
{choose - значение для выбора режима работы}
1:writeln(UTF8ToConsole('Вы выбрали пункт меню 1'));
2:writeln(UTF8ToConsole('Вы выбрали пункт меню 2'));
3:writeln(UTF8ToConsole('Вы выбрали пункт меню 3'));
4:writeln(UTF8ToConsole('Вы выбрали пункт меню 4'));
5:writeln(UTF8ToConsole('Вы выбрали пункт меню 5'));
6:writeln(UTF8ToConsole('Вы выбрали пункт меню 6'));
7:writeln(UTF8ToConsole('Вы выбрали пункт меню 7' ));
else
writeln(UTF8ToConsole('Такого режима нет')); end; { end of case }
until choose = 7;
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
2.1.25 Организация простейшего контроля ввода данных.
Вернемся, теперь, к примеру, разобранному в разделе 2.1.14. "Операции с целыми числами", где мы обсуждали вопрос о контроле за вводимыми пользо-
вателем данных. Сейчас у нас уже достаточно знаний, чтобы организовать про-
стейший контроль вводимых данных. Для этого необходимо организовать цикл и, в случае ввода ошибочных данных, дать возможность пользователю повтор-
но ввести необходимые данные. Программа в этом случае будет иметь вид:
program int_operations_control;
{$mode objfpc}{$H+}
126
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
uses Crt, FileUtil;
var
A, B, C: integer;
zero: boolean;
begin
zero:= true;
writeln(UTF8ToConsole('Введите два числа'));
readln(A);
repeat
readln(B);
{Проверка введенного числа B на ноль}
if B = 0 then begin
writeln(UTF8ToConsole('Второе число не может равняться 0')); writeln(UTF8ToConsole('Введите другое число не равное 0'));
end else
zero:= false; until not zero;
writeln('A= ',A,' B= ',B); C:= A + B;
writeln(UTF8ToConsole('Демонстрация сложения, C= '),C);
C:= A * B;
writeln(UTF8ToConsole('Демонстрация умножения, C= '),C);
C:= A div B;
writeln(UTF8ToConsole('Демонстрация деления нацело, C= '),C);
C:= A mod B;
writeln(UTF8ToConsole('Остаток от деления, C= '),C);
C:= A - B;
127
2.1 Основные элементы языка
____________________________________________________________________
writeln(UTF8ToConsole('Демонстрация вычитания, C= '),C); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Иногда при выполнении цикла бывает необходимо принудительно завер-
шить цикл, даже если условие выхода из цикла не приняло нужного значения
(для циклов while…do и repeat…until) или параметр цикла не достиг нужной величины (для цикла for). Для этого используют инструкцию
break;
Также достаточно часто встречаются ситуации, когда необходимо начать цикл с начала, даже если не все операторы тела цикла выполнены. В этом слу-
чае используют оператор
continue;
Усовершенствуем нашу программу. Дело в том, что пользователь может в качестве второго числа ввести не только число 0, а вообще ввести недопусти-
мые символы. Например, знаки + и - для целых чисел допустимы, а остальные символы, в том числе и точка, недопустимы. То же самое относится и для пер-
вого вводимого числа.
Для организации контроля за вводом воспользуемся специальной функци-
ей IOResult. Для этого нужно директивой компилятора отключить стандарт-
ный контроль ввода/вывода. Эта директива имеет вид {$I-}. Для восстанов-
ления стандартного режима контроля ввода/вывода необходимо использовать директиву {$I+}.
128
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Функция IOResult возвращает 0, если операция ввода/вывода заверши-
лась успешно. Программа теперь будет иметь вид:
program int_operations; {$mode objfpc}{$H+}
{$i-} // отключение стандартного режима контроля ввода uses
CRT, FileUtil; var
A, B, C: integer;
error: boolean; {булевая переменная для контроля ошибок ввода} begin
error:= false; {ошибок при вводе первого числа нет} writeln(UTF8ToConsole('Введите два числа'));
{Проверка на ошибочный ввод числа А}
repeat
readln(A);
error:= (IOResult <> 0);
if error then { если error= true, значит произошла ошибка при вво-
де}
writeln(UTF8ToConsole('Ошибка! Введите целое число'));
until not error;
error:= false; {ошибок при вводе второго числа нет } {Проверка на ошибочный ввод числа B}
repeat
readln(B);
error:= (IOResult <> 0);
if error then
begin
129
2.1 Основные элементы языка
____________________________________________________________________
writeln(UTF8ToConsole('Ошибка! Введите целое число')); continue; { при выполнении этого оператора последующая проверка числа на ноль произведена не будет, выполнение цикла начнется с начала, т.е. с оператора readln(B) }
end;
if B = 0 then
begin
writeln(UTF8ToConsole('Второе число не может равняться 0')); writeln(UTF8ToConsole('Введите другое число не равное 0'));
end
until (B <> 0) and (not error);
{$+} { восстановление стандартного режима контроля ввода/вывода }
writeln('A= ',A,' B= ', B);
C:= A + B;
writeln(UTF8ToConsole('Демонстрация сложения, C= '), C);
C:= A * B;
writeln(UTF8ToConsole('Демонстрация умножения, C= '), C);
C:= A div B;
writeln(UTF8ToConsole('Демонстрация деления нацело, C= '), C);
C:= A mod B;
writeln(UTF8ToConsole('Остаток от деления, C= '), C);
C:= A - B;
writeln(UTF8ToConsole('Демонстрация вычитания, C= '),C); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Разумеется, рассмотренный метод контроля ввода/вывода не является единственным. Существуют более надежные и общие методы контроля, о кото-
130