Поместим описание процедуры Triangle в модуль MyGraph.
Unit MyGraph;
// Заголовок модуля. Имя файла модуля должно совпадать
// с именем модуля! Т.е. в нашем случае оно должно быть
// MyGraph.pas, иначе главая программа его не найдет!
UsesGraphABC; // Модули могут использовать другие модули
Procedure Triangle(x1,y1,x2,y2,x3,y3:integer);
// Эта процедура находится в модуле MyGraph
begin
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
end;
end. // Этот оператор – завершение модуля.
Теперь главная программа будет выглядеть так:
ProgramUseProc;
UsesGraphABC, MyGraph; // Использование стандартного и собственного модуля
begin
SetWindowSize(500,500); // Эта процедура описана в GraphABC
Triangle (100,200,400,300,250,150); // Эта процедура описана в MyGraph
Triangle(10,20,30,40,50,10);
end.
Модули могут содержать неограниченное число процедур, функций, а также описаний глобальных переменных, констант (об этом позже).
Задание 10
2. Сформируйте модуль с вашими собственными графическими процедурами (5 баллов)
- 30 -
Тема №11. Способ передачи параметров
Параметры-значения и параметры-переменные
Каким образом подпрограмма может вернуть главной программе какую-либо информацию?
До сих пор это могла делать только подпрограмма-функция, возвращая через свое имя только одно значение. А как поступить, если надо вернуть из подпрограммы несколько значений?
Для примера напишем подпрограмму, которая должна вычислить длину окружности
( L = 2πr ) и площадь круга ( S = πr 2) по заданному радиусу.
ProgramProcUse;
UsesCRT;
// вычисление длины окружности и площади круга
Procedure Pr(R,L,S:real);
begin
L:=2*PI*R;
S:=PI*sqr(R);
end;
// ГЛАВНАЯ ПРОГРАММА
var rad, len, area : real;
begin
write('Введите радиус '); readln(rad);
Pr(rad, len, area);
writeln('Длина окружности ', len);
writeln('Площадь круга ', area);
end.
Попробуйте выполнить данную программу. Вы обнаружите странный результат: какое бы значение радиуса вы не вводили, результат будет один и тот же: длина окружности и площадь круга будут равны 0! В чем дело?
Оказывается тот способ передачи параметров подпрограмме, который мы использовали не подходит для решения нашей задачи. Используемый до сих пор способ называется передача параметров по значению. Суть его заключается в том, что подпрограмма создает копии параметров (в другой терминологии – локальные переменные подпрограммы), в которые помещаются значения, заданные в фактических параметрах в главной программе.
Т.е. по смыслу такие параметры являются входными, т.е. предназначенными для передачи информации из главной программы в подпрограмму, но не наоборот. Однако этот подход имеет тот плюс, что подпрограмма гарантирует, что она не изменит фактические параметры.
- 31 -
Второй способ называется передача параметров по ссылке. Изменим заголовок процедуры Pr на следующий:
Procedure Pr(R: real; var L,S:real);
Обратите внимание на появившееся ключевое слово var. Оно говорит о том, что два последних параметра процедуры будут являться изменяемыми. Для таких параметров используется другой способ сопоставления с фактическими (передаются на самом деле адреса параметров). В связи с этим необходимо запомнить, что в качестве формальных параметров, соответствующих параметрам переменным, могут использоваться только переменные, но не константы! Т.е. вызов Pr(5,6,7) ошибочен, возможно, лишь Pr(5,a,b), где a и b – вещественные переменные. Первый параметр мы оставили, как и раньше, обычным параметром, передаваемым по значению.
Выполним теперь программу. Работает!
Задание 11
1. Напишите процедуру с двумя целочисленными параметрами, которая бы меняла местами их значения. Проверьте ее работу.
(3 балла) 2. Напишите процедуру, аналогичную процедуре Pr, которая вычисляла бы периметр и площадь квадрата со стороной r и а также объем куба с тем же самым ребром r.
(2 балла)
- 32 -
Тема имеет исключительно важное значение
В практике программирования часто встречаются задачи, в которых требуется применение регулярных, пронумерованных данных: таблицы, результаты наблюдений, проекции векторов, числовые матрицы, каталоги библиотек и т.д. Для работы с такими данными практически во всех языках программирования существует понятие массива.
Читать дальше