Директива forward позволяют описать процедуру или функцию до описания операторов, составляющих ее тело. Это требуется, когда из одной процедуры происходит вызов другой, еще не определенной. Однако forward-процедура должна быть обязательно полностью определена в этом же блоке.

Невозможно обойтись без директивы forward при решении следующей задачи:

Задача 49. Дано множество поочередно вложенных друг в друга окружностей и равносторонних треугольников, начиная с окружности. Радиус первой окружности равен R, общее количество фигур - N. Вывести на экран площади каждой из N фигур.

Решение.

Попытаемся сконструировать наиболее общую информационную модель, которую легко в дальнейшем впишутся изменения условия задачи, не касающиеся основной геометрической структуры (например, можно предположить, что треугольник не равносторонний, а равнобедренный, или со сторонами, рассчитываемыми по определенной формуле). Создадим две процедуры. Первая из них будет рассчитывать и выводить на экран площадь окружности, радиус которой передан ей в качестве аргумента, а затем, если количество фигур не исчерпано, рассчитывать сторону вписанного треугольника и вызывать вторую процедуру. Вторая будет рассчитывать и выводить на экран площадь треугольника, сторона которого передана ей в качестве аргумента, а затем, если количество фигур не исчерпано, рассчитывать радиус вписанной окружности и вызывать первую процедуру. Как видно из метода решения, каждая из процедур должна быть определена до другой процедуры, что без применения директивы forward невозможно.

Площадь окружности вычисляется по формуле 1. Сторона вписанного в окружность равностороннего треугольника зависит от радиуса окружности по формуле image076.gif.

Площадь равностороннего треугольника вычисляется по формуле image078.gif. Радиус вписанной в равносторонний треугольник окружности image080.gif.

{-------опережающее объявление-------}

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 раза меньше радиуса предыдущей. Таким образом, решение данной конкретной задачи можно значительно упростить, что мы предлагаем читателю сделать самостоятельно.

<- Предыдущая страница | Следующая страница ->
Последнее изменение: Вторник 1 Март 2011, 16:45