- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования 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.5. Модули в Паскале
Модуль это такая программная единица, которая может и, чаще всего,
компилируется отдельно и независимо от главной программы. В модуле могут содержаться определения и реализации часто используемых функций и проце-
дур, а также константы, переменные, объявленные типы. Это позволяет разде-
лить работу между программистами при разработке больших и сложных про-
грамм. Например, один программист может разрабатывать один модуль, второй программист – другой модуль, а третий главную программу.
Распределением работы, в том числе какие функции и процедуры должны содержаться в том или ином модуле, что они должны делать, какие результаты они должны выдавать, их интерфейс, т.е. список и типы формальных парамет-
ров, как правило, занимается руководитель проекта.
При этом каждый программист пишет и отлаживает свой модуль незави-
симо от других.
Текст модуля на языке программирования называется исходным модулем.
После компиляции создается так называемый объектный модуль. Объектный модуль это такой модуль, который уже переведен на внутренний машинный язык. На этапе компоновки (сборки) необходимые модули включаются в про-
грамму (компонуются) для обеспечения правильных вызовов функций и проце-
дур. Например, главная программа вызывает некую функцию из модуля А, в
модуле В происходит вызов процедуры из модуля С и т.д. Такой процесс назы-
вается разрешением связей. В итоге собирается исполняемая программа.
3.5.1 Структура модуля
Структура модуля имеет вид:
213
3.5 Модули в Паскале
____________________________________________________________________
unit <Имя модуля>; |
|
|
interface |
// |
раздел интерфейса |
<раздел открытых описаний> |
||
implementation |
// |
раздел реализации |
<раздел закрытых описаний> |
||
initialization |
// раздел инициализации |
|
finalization |
// раздел завершения |
|
end. |
|
|
Модуль начинается со служебного слова unit, за которым следует имя модуля. В случае если данный модуль использует другие модули, после слова interface необходимо поместить служебное слово uses и список исполь-
зуемых модулей.
Интерфейсный раздел модуля начинается со служебного слова interface. В этом разделе можно определять константы, типы данных, переменные,
процедуры и функции, которые доступны для всех программ и модулей, ис-
пользующих данный модуль. Глобальные переменные, помещенные в интер-
фейсной секции, могут быть использованы в основной программе.
Раздел реализации модуля начинается служебным словом implementation. В секции реализации могут находиться свои описания, не-
видимые для программ и модулей, использующих данный модуль. Описанные в секции интерфейса константы, типы данных, переменные, процедуры и функ-
ции являются видимыми в секции реализации.
Те процедуры и функции, которые описаны в интерфейсной секции, опи-
сываются еще раз в секции реализации, причем их заголовок должен быть точ-
но таким же, как тот, который указан в секции интерфейса.
В секции инициализации помещаются операторы, выполняющиеся только один раз при обращении к данному модулю основной программы. Эти операто-
214
Глава 3 Более сложные элементы языка
____________________________________________________________________
ры обычно используются для подготовительных операций. Например, в секции инициализации могут инициализироваться переменные, открываться нужные файлы. При выполнении программы, использующей некоторый модуль, секция инициализации этого модуля вызывается перед запуском основного тела про-
граммы. При использовании нескольких модулей, их секции инициализации вызываются в порядке, указанном в uses. Секция инициализации является не-
обязательной и может вообще отсутствовать.
Раздел finalization также является необязательным. В нем выполня-
ются различные действия перед закрытием программы, например закрытие файлов баз данных, освобождение динамически распределенной памяти и т.д.
С целью уменьшения размера основной программы, улучшения читабель-
ности готовые подпрограммы рекомендуется оформлять в виде модуля. Со временем у вас появится своя собственная библиотека модулей.
Имя библиотечного модуля должно совпадать с именем файла, под кото-
рым хранится текст модуля на диске. Исходный текст библиотечного модуля имеет расширение *.pas (<имя модуля>.pas).
В качестве примера оформим программу вычисления синуса из раздела
3.1.1.3 в виде модуля.
В меню Файл выберите пункт Создать модуль. В окне редактора исходного кода появится заготовка кода для модуля. Очистите окно редактора и введите текст модуля:
unit my_module;
interface
function No_standard_sin(x:real):real;
implementation
{повторяем заголовок функции точно таким
что и в разделе interface}
function No_standard_sin(x:real):real;
var eps,s,t: real;
215
3.5 Модули в Паскале
____________________________________________________________________
n: integer; begin
s:= x; t:= x; n:= 2; eps:= 1e-7; repeat
t:= -t * (sqr(x)/(n * (n + 1))); s:= s + t;
n:= n + 2; until abs(t)< eps;
No_standard_sin:= s; end;
end.
Сохраните модуль обязательно с тем же именем, что указан в заголовке модуля, т.е. my_module.pas в какой-нибудь папке. Откомпилируйте модуль на-
жав клавиши Ctrl+F9 или меню Запуск-> Собрать. Для каждого модуля созда-
ются два файла: двоичный файл описания модуля с расширением (.ppu) и объ-
ектный с расширением (.o). Таким образом, в вашей папке создадутся два файла my_module.ppu и my_module.o
Создайте консольное приложение и введите текст программы:
program project_with_my_module; {$mode objfpc}{$H+}
uses
CRT, FileUtil,SysUtils, my_module; // указываем имя модуля var x, y, dx: real;
begin x:= 0;
dx:= 0.1; while x <= 1 do
begin
216
Глава 3 Более сложные элементы языка
____________________________________________________________________
y:= No_standard_sin(x);
writeln('x= ', x:0:1, ' y= ', y:0:7,
' sin(x)= ', sin(x):0:7);
x:= x + dx;
end;
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Сохраните проект в той же папке, где вы сохранили модуль или скопируй-
те файлы my_module.ppu и my_module.o в папку с текущим проектом. Нажмите клавишу F9. Начнется компиляция и сборка (компоновка) программы. На этапе сборки ваш модуль будет автоматически добавлен в исполняемую программу.
После выполнения программы вы получите те же самые результаты, что и в разделе 3.1.1.3.
Если вы хотите, чтобы ваш модуль был доступен и в других программах,
то проще всего поступить следующим образом:
1.Создайте папку, например с именем my-units
2.Перенесите в эту папку файлы my_module.ppu и my_module.o;
3. Скопируйте саму папку my-units в системный каталог
"C:\lazarus\fpc\2.2.4\units\i386-win32" если вы работаете в Windows или в ката-
лог "/usr/lib/fpc/2.2.4/units/i386-linux", если вы работаете в Linux.
Теперь ваш модуль будет автоматически подключаться в ваши программы
(разумеется, надо прописать имена модулей в объявлении uses). Почему именно в этот каталог? Потому что компилятор если не найдет модуль в папке с вашим проектом, он будет искать его по умолчанию в этой системной папке.
Если же вы разместили папку my-units в другом месте, то вам придется прописывать путь к этой папке, либо в инспекторе проекта, либо непосредст-
венно в объявлении uses вот таким образом:
uses my_module in '<путь к папке с исходным кодом модуля>'
217