- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
2.6. Модули
2.6.1. Общие сведения
Единственно возможное положение подпрограмм в стандартном Паскале – это раздел процедур и функций программы. Отсюда следует один из основных недостатков стандартной версии - невозможность раздельной компиляции подпрограмм и программы. Этот недостаток делает невозможным создание библиотеки алгоритмов в кодах ЭВМ. Процедуры можно хранить только как тексты на алгоритмическом языке, включать их в текст программы-блока и компилировать блок как единое целое.
Для обеспечения возможности компиляции программы по частям в реализациях Паскаля, начиная с Турбо Паскаля, введено новое средство языка - модули (Units).
Модуль - это автономно компилируемая программная единица, включающая в себя различные разделы описаний (типов, констант, переменных, процедур и функций) и, возможно, некоторые исполняемые операторы (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов).
При рассмотрении модулей следует остановиться на двух вопросах: как создавать (программировать) модули и как использовать готовые модули. Этому посвящены следующие параграфы.
2.6.2. Структура модуля
Схематично структуру модуля можно изобразить следующим образом:
UNITимя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[BEGIN
инициирующая_часть]
END.
Модуль начинается ключевым словом UNIT, после которого пишется имя модуля, и заканчивается словомЕND, после которого ставится точка.
Модуль состоит из трех частей19. Первая часть содержит описания, доступные другим программам или модулям. Часто ее называютвидимой(ее как бы "видят" другие программы) илиинтерфейсной(она начинается с ключевого словаINTERFACE, что в переводе с английского означает "внешние связи"). От процедур и функций в первую часть включаются только заголовки.
Вторая часть содержит описания подпрограмм, заголовки которых находятся в интерфейсной части. Она называется исполняемой, так как содержит исполняемые операторы подпрограмм, и начинается с ключевого слова IMPLEMENTATION, которое переводится с английского как "исполнение". Содержание второй части доступно только данному модулю и не может использоваться другими программными единицами, поэтому ее также называют невидимой(для других программных единиц). В частиIMPLEMENTATIONв заголовках подпрограмм могут отсутствовать списки формальных параметров, так как они имеются в частиINTERFACE.
Третья часть называется инициирующей. Она содержит операторы, выполняемые до передачи управления основной программе. Они подготавливают работу модуля. Обычно это операторы инициализации переменных, открытия файлов (см. §3.3) и т. д. Инициирующая часть начинается с ключевого словаBEGIN. Она может отсутствовать (вместе с открывающим ее словомBEGIN).
Пример
Ниже приведен модуль VECTOR, позволяющий осуществлять некоторые операции над векторами. Число компонент вектора не превышает 10. Смысл процедур поясняется в комментариях.
Unit VECTOR; {операции над векторами}
INTERFACE
Type AR=Array[1..10] of real;
Function Scpr(Var a,b:Ar;N:Integer):Real;
{вычисление скалярного произведения двух векторов}
Function Lngth(Var a:Ar; N:Integer):Real;
{вычисление длины вектора}
Function UngleRad(Var a,b:Ar; N:Integer):Real;
{вычисление угла между двумя векторами в радианах}
Function UngleGr(Var a,b:Ar;N:Integer):Real;
{вычисление угла между двумя векторами в градусах}
Procedure Sum(Var a,b,c:Ar;N:Integer);
{вычисление суммы двух векторов}
Procedure Inp(Var a:Ar; N:Integer);
{ввод координат вектора}
IMPLEMENTATION
Function Scpr;
Var I:Integer; S:Real;
Begin
S:=0;
For i:=1 To N Do
S:=S+a[i]*b[i];
Scpr:=S;
End;
Function Lngth;
Begin
Lngth:=Sqrt(Scpr(a,a,N));
End;
Function UngleRad;
Var x:Real;
Begin
x:=Scpr(a,b,N)/Lngth(a,N)/Lngth(B,N);
If x=0 then UngleRad:=pi/2
Else
UngleRad:=ArcTan(Sqrt(1-x*x)/x);
End;
Function UngleGr;
Begin
UngleGr:=UngleRad(a,b,3)/pi*180;
End;
Procedure Sum;
Var i:Integer;
Begin
For i:=1 to N Do
c[i]:=a[i]+b[i]
End;
Procedure Inp;
Var I:Integer;
Begin
For i:=1 To N Do
Read(a[i]);
Readln
End;
End.
В Объектном Паскале допустима рассмотренная структура модуля. Но можно также отмечать начало инициализирующей части ключевым словом INITIALIZATION(вместоBEGIN). Модуль Объекьного Паскаля может иметь завершающую часть, которая содержит операторы, выполняемые при завершении программы, и начинается со словаFINALIZATION.
Имя файла, содержащего исходный текст модуля, должно совпадать с именем модуля и иметь расширение .PAS(для примера предыдущего раздела VECTOR.pas). Результатом компиляции будет файл с тем же именем. Расширение откомпилированного файла .TPU(например,VECTOR.tpu) для средTurboиBorlandPascalи.DCUдляDelphi.