Директива forward позволяют описать процедуру или функцию до описания операторов, составляющих ее тело. Это требуется, когда из одной процедуры происходит вызов другой, еще не определенной. Однако forward-процедура должна быть обязательно полностью определена в этом же блоке.
Невозможно обойтись без директивы forward при решении следующей задачи:
Задача 49. Дано множество поочередно вложенных друг в друга окружностей и равносторонних треугольников, начиная с окружности. Радиус первой окружности равен R, общее количество фигур - N. Вывести на экран площади каждой из N фигур.
Решение.
Попытаемся сконструировать наиболее общую информационную модель, которую легко в дальнейшем впишутся изменения условия задачи, не касающиеся основной геометрической структуры (например, можно предположить, что треугольник не равносторонний, а равнобедренный, или со сторонами, рассчитываемыми по определенной формуле). Создадим две процедуры. Первая из них будет рассчитывать и выводить на экран площадь окружности, радиус которой передан ей в качестве аргумента, а затем, если количество фигур не исчерпано, рассчитывать сторону вписанного треугольника и вызывать вторую процедуру. Вторая будет рассчитывать и выводить на экран площадь треугольника, сторона которого передана ей в качестве аргумента, а затем, если количество фигур не исчерпано, рассчитывать радиус вписанной окружности и вызывать первую процедуру. Как видно из метода решения, каждая из процедур должна быть определена до другой процедуры, что без применения директивы forward невозможно.
Площадь окружности вычисляется по формуле . Сторона вписанного в окружность равностороннего треугольника зависит от радиуса окружности по формуле
.
Площадь равностороннего треугольника вычисляется по формуле . Радиус вписанной в равносторонний треугольник окружности
.
{-------опережающее объявление-------}
procedure AreaOfTriangle(a:real; Number:word);forward;
{-------процедура нахождения площади окружности---------}
procedure AreaOfCircle(R:real; Number:word);
{R - радиус окружности, Number - количество оставшихся фигур}
begin
writeln('Площадь окружности с радиусом ',R:5:2,
' равна ',pi*sqr(R):5:2);
if Number<>0 then {если количество фигур не исчерпано, то рассчитываем площадь треугольника, уменьшая при этом количество фигур}
AreaOfTriangle(sqrt(3)*R,Number-1);
end;
{-------процедура нахождения площади треугольника---------}
procedure AreaOfTriangle(a:real; Number:word);
{ a - сторона треугольника,
Number - количество оставшихся фигур}
begin
writeln('Площадь равностороннего треугольника со стороной ',
a:5:2,' равна ',sqrt(3)*sqr(a)/4:5:2);
if Number<>0 then {если количество фигур не исчерпано, то рассчитываем площадь окружности, уменьшая при этом количество фигур}
AreaOfCircle(a/(2*sqrt(3)),Number-1);
end;
{---------------основная программа-----------------}
var FirstR:real;
Number:word;
begin
write('Введите радиус первой окружности '); readln(FirstR);
write('Введите количество фигур '); readln(Number);
AreaOfCircle(FirstR,Number);
readln;
end.
Выполнение данной программы покажет то, что можно было рассчитать при чуть более глубоком анализе математической модели: Сторона каждого последующего треугольника в 2 раза меньше стороны предыдущего. Аналогично, радиус каждой последующей окружности в 2 раза меньше радиуса предыдущей. Таким образом, решение данной конкретной задачи можно значительно упростить, что мы предлагаем читателю сделать самостоятельно.