- •2.2. Основные элементы и конструкции языка
- •2.2.2. Алфавит, слова, комментарии
- •Данные
- •Целочисленные типы
- •Логические типы
- •Вещественные типы
- •Массивы
- •Совместимость типов
- •Выражения и операции
- •Арифметические выражения и операции
- •Поразрядные операции
- •Логические операции и выражения
- •Операции со строками
- •Приоритеты операций
- •Операторы
- •Простые операторы
- •Операторы ввода и вывода.
- •Структурные операторы
- •Условные операторы
- •Операторы цикла
- •Структура Паскаль программы
- •Функции и процедуры
- •Процедуры
- •Функции
- •Параметры процедур и функций
- •Модули
- •Общая структура модуля
- •Компиляция и использование модулей
- •Стандартные модули
- •Работа с файлами
- •Общие правила работы с файлами.
- •Текстовые файлы
- •Примеры задач
Параметры процедур и функций
В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных параметров, является локальным по отношению к описываемой процедуре или функции и на него можно ссылаться по его идентификатору. Параметры в списке записываются в следующем формате:
параметр1, параметр2, ... :тип или var параметр1, параметр2, ... :тип.
Параметры в списке отделяются друг от друга символом точка с запятой. Существует два типа параметров: значение и переменная. Они характеризуются
следующим:
Группа параметров без предшествующего ключевого слова var является списком параметров-значений.
Группа параметров, перед которыми стоит ключевое слово var и за которыми следует тип, является списком параметров-переменных.
Параметры-значения. Изменения, которые претерпевает формальный параметрзначение при выполнении подпрограммы, не влияют на значение фактического параметра. При вызове подпрограммы, на место фактического параметра-значения могут быть подставлены константы, выражения и переменные. Фактический параметр должен иметь тип, совместимый по присваиванию с типом формального параметра-значения.
Параметры-переменные. Параметр-переменная используется, когда значение должно передаваться не только процедуре из вызывающей программы, но и из процедуры или функции в вызывающую программу. Соответствующий фактический параметр в операторе вызова процедуры или функции обязательно должен быть переменной. При вызове процедуры или функции формальный параметр-переменная замещается фактической переменной, любые изменения в значении формального параметрапеременной отражаются на фактическом параметре.
Внутри процедуры или функции любая ссылка на формальный параметрпеременную приводит к доступу к самому фактическому параметру. Тип фактического параметра должен совпадать с типом формального параметра-переменной.
Модули
Как отмечалось ранее, для часто используемых вычислительных методов разрабатываются подпрограммы (процедуры и функции) которые хранятся в библиотеках под уникальными именами. Из программы пользователя к библиотечным подпрограммам можно обратиться по их именам. В системе программирования Borland Pascal такого рода библиотеки называются модулями.
Результатом компиляции исходного текста модуля является файл с расширением tpu который хранится на жестком диске. Пользователь при выполнении своей программы обращается к модулю как к библиотеке.
Для использования подпрограмм пользователю в начале своей программы (после заголовочного оператора) необходимо указать имена модулей содержащих используемые в данной программе процедуры и функции. Для этого записывается ключевое слово uses и перечень имен модулей, разделенных запятыми с символом ; в конце списка. В тексте программы обращение к подпрограммам оговоренных модулей производится по именам процедур или функций.
Общая структура модуля
Текст модуля содержится в отдельном файле. Этот файл обязательно начинается с
62
заголовка модуля, который определяет имя модуля и имеет следующий формат:
unit идентификатор_модуля;
Имя модуля должно быть уникальным, так как два модуля с одним именем не могут использоваться одновременно.
Имя исходного файла модуля и двоичного файла должны совпадать с идентификатором модуля. Если это не так, то компилятор не сможет найти исходный и/или двоичный файл при компиляции, использующей этот модуль программы.
Общая структура модуля может быть представлена следующей схемой: unit идентификатор_модуля;
interfaсe {интерфейсная секция} uses
{перечисление модулей} const
{раздел описания глобальных констант} type
{раздел описания глобальных типов переменных} var
{раздел описания глобальных переменных} {раздел заголовков процедур и функций} procedure имя_глобальной_процедуры(параметры); function имя_глобальной_функции(параметры):тип;
implementation {Секция реализации} uses
{перечисление модулей} const
{раздел описания локальных констант} type
{раздел описания локальных типов переменных} var
{раздел описания локальных переменных} {раздел реализации процедур и функций} procedure имя_локальной_процедуры(параметры); begin
{операторы реализации локальной процедуры} end;
function имя_глобальной_функции(параметры):тип; begin
{операторы реализации глобальной функции } end;
procedure имя_глобальной_процедуры(параметры); begin
{операторы реализации глобальной процедуры} end;
{секция инициализации} begin
end.
Интерфейсная секция. В интерфейсной секции описываются те константы, типы, переменные, процедуры и функции, которые являются глобальными, то есть доступными основной программе (программе или модулю, которые используют данный
63
модуль). Следует особо отметить, что в этой секции приводятся только заголовки процедур и функций, полный текст которых приводится в секции реализации.
Секция реализации. В секции реализации определяются тексты всех процедур или функций модуля. Эти процедуры и функции могут быть расположены в любой последовательности. Описания процедур и функций должны совпадать с их объявлениями в секции реализации, иначе компилятор выдаст сообщение об ошибке.
Здесь также описываются константы, переменные, процедуры и функции, являющиеся локальными, то есть недоступными основной программе.
Пример модуля:
unit Myunit; {myunit - имя модуля} interface {раздел интерфейса} const
Mmax=10; type
Mas1 = array[1..Mmax] of Integer;
{описан новый тип переменной,который теперь может быть использован в программе ользователя}
procedure Vvod(St: string; var Kk:Mas1; N:Integer);
{заголовок процедуры vvod предназначенной для ввода "n" данных в массив "kk" с названием “St”, которая может быть использова- на в программе пользователя}
procedure Sum(var M:Mas1; N:Integer; var Su:Integer); {заголовок процедуры sum позволяющей находить суммы "n" элементов массива "m", которая может быть использована в программе пользователя}
implementation {раздел реализации} var
N, I: Integer; {описание скрытых переменных}
Proc: String; {эти переменные: N,I, Proc видны (доступны) только в разделе реализации}
procedure Error(S:String);
{скрытая процедура, служит для вывода сообщения об ошибке; может вызываться только процедурами описанными в разделе реализации: Vvod и Sum}
begin
Writeln(Proc); {вывод значения скрытой переменной proc; эту переменную могут использовать только процедуры, описанные внутри раздела реализации}
Writeln('N= ',N,' ошибка: ',S); end; {конец процедуры Error }
procedure Vvod(St: string; var Kk:Mas1; N:Integer); {определение (реализация) процедуры Vvod}
begin
Proc:='ошибка в процедуре Vvod'; if N<= Mmax then begin
{если количество вводимых элементов укладывается в массив} for i:=1 to n do begin
Write(St,’[‘,I:2,’] = ’); Readln(Kk[I]);
end;
end else begin
Error('N > Mmax');
64
{если при вводе данных значение n> Mmax, то вызывается процедура Error, выводящая сообщение об ошибке}
end;
end; {конец процедуры Vvod}
procedure Sum(var M:Mas1; N:Integer; var Su:Integer); {определение (реализация) процедуры Error}
begin
Proc:='Ошибка в процедуре Sum'; Su:=0;
if N<=Mmax then for I:=1 to N do
Su:= Su + M[I]; else
Error('N > Mmax');
{если значение n>10,то вызывается процедура error выводящая сообщение об ошибке}
end; {конец процедуры Sum} end. {конец модуля}
Компиляция и использование модулей
Модуль компилируется таким же образом, как и обычные подпрограммы. Однако, поскольку модуль не является непосредственно выполняемой программной единицей, то в результате на магнитном диске компилятором создается не exe-модуль (готовая к выполнению программа), а дисковый файл с расширением "tpu" (Turbo Pascal Unit). Имя такого файла будет совпадать с именем файла, содержащего исходный текст этого модуля.
Для того, чтобы получить доступ к интерфейсным объектам модуля, необходимо в вызывающей программе указать имя нужного tpu-файла в форме:
uses имя1, имя2,..., имяN>;
где uses - служебное слово, за которым следует список используемых модулей.
Если модуль "подключен" указанным выше образом, то к его интерфейсным объектам можно обращаться из программы точно также, как если бы эти объекты были описаны в самой программе. Например:
program Primer;
uses Myunit; {подключение модуля myunit} var
Aa,Bb : Mas1;
Sss ,I : Integer; begin
Write('Введите количество элементов в массивах I= '); Readln(I);
Vvod(‘AA’,Aa,I);
{ввод данных в массив Aa с помощью процедуры Vvod модуля
Myunit}
Vvod(‘BB’,Bb,I);
Sum(Aa,I,Sss);
{нахождение величины суммы sss i элементов массива aa c помощью процедуры sum модуля myunit}
Writeln('Сумма ',I,' элементов массива AA равна ',Sss); Writeln('Макс. колич. элементов массива AA Mmax= ',Mmax);
{значение Mmax определено в интерфейсном разделе} Sum(Bb,100,Sss);
{при подсчете суммы sss элементов массива bb будет обнаружено,
65