Подпрограммы.
Процедуры с параметрами
Использование рассмотренных нами на предыдущих занятиях процедур без параметров оправдано только в том случае, если в них не используется обращение к глобальным (объявленным во внешней программе) параметрам. Связано это с тем, что использование таких подпрограмм будет ограничено той программой, для которой они были написаны, и затруднено для других программ. Рассмотрим уже предлагавшийся вам пример процедуры рисования цветного треугольника:
procedure TRG2;
{процедура рисования треугольника цвета i}
begin
setcolor(i); {обращение к глобальной (внешней) переменной}
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
В этой процедуре производится обращение к глобальной переменной i, которая обязательно должна быть объявлена во внешней программе и иметь определённое значение. Если Вы пожелаете использовать процедуру TRG2 в другой программе, то естественно Вы должны будете позаботиться о том, чтобы в ней тоже присутствовала переменная, предназначенная для хранения номера текущего цвета рисования треугольника и обязательно под именем i. Для того, чтобы созданные пользователем подпрограммы были более универсальными, чтобы их использование в других программах было не таким сложным, во многих языках программирования применяются более совершенные механизмы передачи (обмена) информацией (данными) между программой и её подпрограммами. Полное описание возможных механизмов передачи информации, применяемых в современных алгоритмических языках составляет основу концепции современного структурного программирования, и обладает функциональной избыточностью. Это значит, что задача обмена информацией может быть решена с помощью только некоторой части из всех возможных способов обмена данными. Поэтому все механизмы в полном объёме не применяется ни в одном алгоритмическом языке программирования. Мы детально рассмотрим только те механизмы которые применяются в системе программирования Turbo Pascal 7.0. Так как описание и правила применения стандартных (встроенных) процедур ничем не отличаются от описания и правил применения созданных пользователем процедур, мы изучим основные понятия и определения используя уже знакомые Вам и неоднократно применяемые стандартные процедуры. Полное их описание Вы можете найти в своих конспектах, в системе контекстной информационной помощи Turbo Pascal 7.0, или в специальной литературе.
ClrScr; ClrEol;
Типичные примеры процедур без параметров. Обращение к глобальным параметрам отсутствует. Если подпрограмма предполагает обмен информацией (данными) с программой, то в её описании, после имени подпрограммы должны быть описаны специальные параметры, с помощью которых и осуществляется предполагаемый информационный обмен. Например:
SetColor(i: byte);
Процедура с параметром.
Параметры, которые записываются в скобках после имени описываемой процедуры называются ФОРМАЛЬНЫМИ ПАРАМЕТРАМИ. После имени формального параметра обязательно указывается его тип.
Указанные после имени процедуры параметры указывают на то, что для выполнения данной процедуры необходимы дополнительные данные.
Для выполнения процедуры в программе необходимо осуществить её ВЫЗОВ. Вызов процедуры с параметрами должен быть сопровождён передачей дополнительных данных, необходимых для работы этой процедуры. Таким образом, во время вызова процедуры ФОРМАЛЬНЫЕ (просто занимающие место) параметры должны быть заменены ФАКТИЧЕСКИМИ (реально существующими) параметрами (дополнительными данными). Например:
SetColor(5);
Параметры, передаваемые процедуре во время её вызова в программе называются ФАКТИЧЕСКИМИ ПАРАМЕТРАМИ. Фактическими параметрами могут быть как непосредственные значения, так и переменные в которых хранятся требуемые значения. Например:
SetColor(t);
В одной процедуре могут использоваться несколько параметров как одного типа данных
Window(X1, Y1, X2, Y2: byte);
так и нескольких переменных различных типов данных
Bar3D(X1, Y1, X2, Y2: integer; Depth: word; Top: boolean).
По способу передачи данных параметры можно разделить на несколько категорий:
Категории параметров
Параметры-значения
Используются для передачи данных из программы в подпрограмму.
Из программы в подпрограмму передаётся копия параметра.
В подпрограмме допустимо любое изменение этой копии. Оригинал, оставшийся в программе, остаётся без изменения. Таким образом обратная передача информации с помощью параметров-значений невозможна.
Для создания копии параметра в памяти компьютера, во время работы процедуры, выделяется дополнительная ячейка памяти, поэтому передача большого количества параметров-значений, или параметров-значений большого объёма может в значительной степени загрузить память компьютера, замедлить работу программы и даже привести к аварийной ситуации.
Формальный параметр-значение записывается в скобках после имени процедуры своим именем с указанием типа. Например:
Length(s: string);
LineTo(X, Y: integer);
Line(X1, Y1, X2, Y2: integer);
Параметры-переменные
Используются для передачи данных как из программы в подпрограмму так и из подпрограммы в программу.
Из программы в подпрограмму передаётся адрес фактического параметра, то-есть, та ячейка памяти которая его содержит.
В подпрограмме допустимо любое изменение этого параметра. Таким образом все изенения, которые произошли с параметром-переменной в подпрограмме, тут же передаются в главную программу, - возможна обратная передача информации.
При передаче параметров-переменных дополнительных ячеек памяти не выделяется.
Формальные параметры-переменные указываются в заголовке подпрограмме аналогично параметрам-значениям, только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой. Например:
Delete (var s: string; i, n: integer);
В этой процедуре указаны формальные параметры-значения i, n и параметр переменная s.
Insert (p: string; var s: string; i: integer);
p, i - параметры-значения;
s - параметр-переменная.
Параметры-константы
Используется для передачи данных из программы в подпрограмму.
Из программы в подпрограмму передаётся адрес фактического параметра, - та ячейка памяти, которая его содержит.
В подпрограмме изменение параметра-константы недопустимо, поэтому передача данных в обратном направлении невозможна.
При передаче параметров-констант дополнительных ячеек памяти не выделяется.
Формальные параметры-константы указываются в заголовке подпрограммы. Перед именем параметра-константы записывается служебное слово const. Действие слова const распространяется до ближайшей точки с запятой.
Группы параметров
При описании подпрограммы формальные параметры различных категорий как правило объединяются в группы. Внутри группы параметры отделяются друг от друга запятыми. Группы разделяются точкой с запятой. При вызове подпрограммы все фактические переменные отделяются друг от друга только запятыми, даже если они не принадлежат одной группе.
Рассмотрим конкретные примеры процедур с параметрами:
Пример 1.
---------
procedure TRG3 (i: integer);
{Процедура рисования треугольника цвета i}
begin
setcolor(i); {обращение к параметру-значению}
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
Пример 2.
---------
PROGRAM EX_26_2;
{Программа рисования 6-ти различных прямоугольников}
USES Graph, Crt;
LABEL Out;
VAR Gd,Gm: integer;
Procedure Sq(x, y, a, b: integer);
{----------------------------------------------------
Sq - процедура рисования прямоугольника. Для её
выполнения необходимы дополнительные данные, которые
передаются в процедуру с помощью параметров-значений:
x,y - координаты левого нижнего угла прямоугольника;
a,b - высота и ширина прямоугольника.
-----------------------------------------------------}
Begin
MoveTo(x,y);
LineRel(a,0); LineRel(0,b);
LineRel(-a,0); LineRel(0,-b);
End;
BEGIN
Gd:=Detect;
InitGraph(Gd,Gm,);
If GraphResult<>0 then Goto Out;
Sq(10,60,110,120);
Sq(120,70,120,130);
Sq(130,80,130,140);
Sq(40,90,140,150);
Sq(150,100,150,160);
Sq(60,110,130,140);
Repeat Until Keypressed;
CloseGraph;
Out:
END.
Пример 3.
---------
PROGRAM EX_26_3;
{Программа преобразования угла из градусной меры в радианную}
USES Crt;
VAR
ch: char;
x: real;
a: real;
PROCEDURE Rad(const alfa: real; var betta: real);
{Процедура преобразования угла из градусной меры в радианную.
Параметр-константа alfa предназначена для передачи из
программы в процедуру угла в градусах. Параметр-переменная
betta предназначена для передачи из процедуры в программу
угла в радианах}
BEGIN
betta:=pi*alfa/180;
END;
BEGIN
Repeat
ClrScr;
Writeln(Преобразования угла из градусной меры в радианную);
Write(Введите угол в градусах: );
Readln(x); Rad(x,a);
Writeln(Ему равен угол в радианах = ,a:6:4);
Writeln(Продолжить вычисления? Enter - да, Пробел - нет);
ch:=ReadKey;
Until ch<>#13;
END.
Подпрограммы. Процедуры с параметрами (Turbo Pascal 7.0)
Лекции по предмету «Программирование»