
- •Основы программирования на языке Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскале 44
- •От автора
- •Часть 1. Основы языка Паскаль
- •1. Алгоритм и программа
- •1.1. Алгоритм
- •1.2. Свойства алгоритма
- •1.3. Формы записи алгоритма
- •1.4. Программа и программное обеспечение
- •1.5. Этапы разработки программы
- •2. Данные в языке Паскаль
- •2.1 Константы
- •2.2 Переменные и типы переменных
- •3. Арифметические выражения
- •4. Линейный вычислительный процесс
- •4.1 Оператор присваивания
- •4.2 Оператор ввода
- •4.3 Оператор вывода
- •4.4 Управление выводом данных
- •4.5 Вывод на печать
- •5. Структура простой программы на Паскале
- •6. Компилятор и оболочка Turbo Pascal
- •7. Разветвляющийся вычислительный процесс и условный оператор
- •7.4. Короткий условный оператор
- •If логическое_выражение then оператор1;
- •7.5. Полный условный оператор
- •If логическое_выражение then оператор1
- •7.7. Вложенные условные операторы
- •7.9. Примеры программ с условным оператором
- •8. Директивы компилятора и обработка ошибок ввода
- •9. Оператор цикла. Циклы с предусловием и постусловием
- •10. Цикл со счетчиком и досрочное завершение циклов
- •11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
- •11.1 Алгоритм табулирования
- •11.2 Алгоритм организации счетчика
- •11.3 Алгоритмы накопления суммы и произведения
- •12. Типовые алгоритмы поиска максимума и минимума
- •13. Решение учебных задач на циклы
- •14. Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале
- •15. Решение типовых задач на массивы
- •Часть 2. Элементы профессионального программирования на Паскале
- •16. Кратные циклы
- •16.1 Двойной цикл и типовые задачи на двойной цикл
- •16.2 Оператор безусловного перехода
- •17. Матрицы и типовые алгоритмы обработки матриц
- •18. Подпрограммы
- •18.1 Процедуры
- •18.2 Функции
- •18.3 Массивы в качестве параметров подпрограммы
- •18.4 Открытые массивы
- •19. Множества и перечислимые типы
- •20. Обработка символьных и строковых данных
- •20.1. Работа с символами
- •20.2 Работа со строками
- •21. Текстовые файлы
- •21.1 Общие операции
- •21.2 Примеры работы с файлами
- •21.3 Работа с параметрами командной строки
- •22. Записи. Бинарные файлы
- •23. Модули. Создание модулей
- •23.1. Назначение и структура модулей
- •23.2. Стандартные модули Паскаля
- •24. Модуль crt и создание простых интерфейсов
- •25. Модуль Graph и создание графики на Паскале
- •Приложение 1. Таблицы ascii-кодов символов для операционных систем dos и Windows
- •Приложение 2. Основные директивы компилятора Паскаля
- •Приложение 3. Основные сообщения об ошибках Паскаля
- •Приложение 4. Дополнительные листинги программ
- •Приложение 5. Расширенные коды клавиатуры
- •Ascii‑коды
- •Расширенные коды
- •Приложение 6. Правила хорошего кода
- •Приложение 7. Рекомендуемая литература
23. Модули. Создание модулей
Применение готовых и разработанных программистом модулей позволяет эффективно решать задачу повторного использования однажды написанного кода.
23.1. Назначение и структура модулей
Модулями называют заранее скомпилированные библиотеки подпрограмм, которые программист может использовать для создания новых программ. При программировании на Паскале модули подключаются из специальных библиотечных файлов, имеющих тип *.tpu (Turbo Pascal Unit). Модуль сам по себе не является выполняемой программой, но его подпрограммы используются другими программами.
Для того, чтобы создать модуль, нужно написать файл с расширением *.pas, соблюдающий описанную далее структуру модуля, затем в меню Compile оболочки Паскаля установить переключатель Destination в значение Disk (как мы помним, это же нужно сделать, если Вы собираетесь получить из своей программы на Паскале приложение *.exe), затем собрать модуль, выбрав в меню Compile пункт Build. После устранения ошибок компиляции готовый модуль (файл с расширением *.tpu) будет находиться в папке Паскаля.
Структура модуля такова (новые ключевые слова выделены жирным):
unit Имя; {Это заголовок модуля, именующий его. По этому имени модуль может быть подключен из программы оператором uses}
interface {Интерфейсная часть - здесь мы объявляем
константы, типы данных, переменные, процедуры и функции.
Тела общих процедур и функций находятся в разделе реализации.
Раздел интерфейса является общим. В нем можно определить то, что будет
видимо и доступно для любой другой программы (или модуля),
использующей данный модуль. В интерфейсной части может находиться раздел
Uses, если модуль подключает другие модули. В таком случае, слово Uses должно
следовать сразу за словом Interface}
implementation
{В разделе реализации (Implementation) модуля находятся тела процедур и функций,
объявленных в интерфейсной части.
Раздел реализации является частным. Все объявления, сделанные здесь могут быть
видимы только внутри данного раздела модуля.
Все константы, типы, переменные, процедуры и функции, объявленные в
интерфейсной части видимы в разделе реализации.
В разделе реализации могут находиться ее собственные дополнительные объявления,
невидимые любым программам, использующим модуль.
Раздел Uses может находиться в части реализации сразу после
зарезервированного слова Implementation.
Заголовок процедуры/функции в разделе реализации должен быть идентичен
объявлению в разделе интерфейса}
begin
{обычно "главная программа" модуля пуста. Здесь можно давать начальные
значения данным модуля, открывать используемые им файлы, если таковые есть,
и т.п.}
end.
Для работы с координатами точек на плоскости создадим простейший модуль и вызовем его подпрограммы его при написании новой программы:
unit Points;
interface
type point = array [1..2] of real;
procedure put (var p:point;x,y:real);
function distance (p1,p2:point):real;
function corner (p1:point):integer;
implementation
procedure put (var p:point;x,y:real);
begin
p[1]:=x; p[2]:=y;
end;
function distance (p1,p2:point):real;
begin
distance:=sqrt(sqr(p1[1]-p2[1])+sqr(p1[2]-p2[2]));
end;
function corner (p1:point):integer;
begin
if p1[1]>0 then begin
if p1[2]>0 then corner:=1
else if p1[2]<0 then corner:=4
else corner:=0;
end
else if p1[1]<0 then begin
if p1[2]>0 then corner:=2
else if p1[2]<0 then corner:=3
else corner:=0;
end
else corner:=0;
end;
begin
end.
Наш модуль определяет тип данных Point (точка) как массив из 2 вещественных чисел. Процедура put позволяет задать для точки значения x- и y-координаты, функция distance возвращает расстояние между двумя точками, а функция corner – номер координатной четверти, в которой находится точка, или 0, если точка лежит на одной из осей координат. Разумеется, реальные модули могут включать сотни функций, если предметная область, которую они моделируют, достаточно сложна. Теперь напишем маленькую тестовую программу, использующую наш модуль:
uses Points;
var a,b:Point;
begin
put (a,1,1);
put(b,0,0);
writeln ('Расстояние от A до B=',distance(a,b):8:3);
writeln ('Номер координатной четверти для A=',corner(a));
end.
Оператор uses, подключающий модуль, указан в первой строке программы. Во время компиляции этой программы в текущем каталоге должен присутствовать файл points.tpu, содержащий созданный ранее модуль Points.
При сборке сложной программы Паскаль ищет модули только в тех папках, которые перечислены в поле ввода Unit directories окна Directories верхнего меню Options, поэтому все готовые модули следует либо помещать в одну из этих папок, либо дописать в поле ввода нужные пути к папкам. В Приложении 4 приводится полный листинг модуля для работы с "мышью" из программы на Паскале и тесты для него.