Решение задачи с использованием подпрограмм

Задача: треугольник задан координатами своих вершин. Составить программу вычисления его площади.

Решение этой задачи удобно представить в виде следующих этапов:

1. Ввод последовательно координат трех вершин: x1, y1, x2, y2, x3, y3.

2. Вычисление длины первой стороны

3. Вычисление длины второй стороны

4. Вычисление длины третьей стороны

5. Вычисление площади по формуле Герона

6. Вывод на экран полученного значения площади.

Из приведенного выше плана решения задачи видно, что в пунктах 2-4 будут выполняться одни и те же действия только с разными координатами вершин. Удобно оформить эти вычисления в виде подпрограммы. Так как длина стороны – это вещественное число, то ее можно вычислять с помощью подпрограммы-функции. При этом для начала можно продумать лишь название функции, ее параметры и тип результата, а детали реализации записать чуть позже. Иначе говоря, следует пока написать «пустую» функцию, чтобы понять для начала ход решения основной задачи.

Итак, пусть наша функция называется storona. Для вычисления стороны треугольника нужно передать в подпрограмму координаты двух вершин. Пусть формальные параметры называются a1, b1, a2, b2 и имеют вещественный тип (real). Тип результата функции также будет вещественным.

Тогда начальный вариант программы будет выглядеть следующим образом:

Program treugolnik;

Var

S, a, b, c, p: real; {описываем переменные для вычисления площади
(S), сторон (a, b, c), периметра (p)}

X1, y1, x2, y2, x3, y3: real; {описываем переменные – координаты
вершин}

Function storona (a1, b1, a2, b2: real): real; {заголовок функции, в
которой будет вычисляться длина стороны треугольника}

Begin

End; {конец функции. Пока тело функции пусто, детали вычислений
запишем чуть позже. Зато к этой функции уже можно
обращаться из основной программы}

Begin {начало основной программы}

Writeln (‘Введите координаты первой вершины’);

Readln (x1, y1);

Writeln (‘Введите координаты второй вершины’);

Readln (x2, y2);

Writeln (‘Введите координаты третьей вершины’);

Readln (x3, y3);

A:= storona (x1, y1, x2, y2); {вычисляем длину первой стороны}

B:= storona (x2, y2, x3, y3); {вычисляем длину второй стороны}

C:= storona (x3, y3, x1, y1); {вычисляем длину третьей стороны}

P:= a+ b+ c; {вычисляем периметр}

S:= sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));

Writeln (‘площадь треугольника равна:’, s);

End.

После того, как в основной программе выделены подзадачи, продуман план решения, решен основной вопрос, какие данные передаются в подпрограмму и что должно быть получено в результате ее работы, можно детально продумать алгоритм работы подпрограммы.

Для вычисления длины стороны в функции можно описать локальную (определенную только внутри функции) переменную вещественного типа, пусть она называется d.

Function storona (a1, b1, a2, b2: real): real;

Var d: real; {описание переменной, которая будет использоваться
исключительно внутри функции}

Begin

D:= sqrt(sqr(a1- a2) +sqr(b1-b2));

Storona:= d; {обязательный в теле функции оператор присваивания,
когда с именем функции связывается вычисленное значение}

End;

Вот теперь наша задача полностью решена.

Эту же задачу можно решить с использованием подпрограммы-процедуры. Начинать решение задачи рекомендуется так же, как и в предыдущем случае. Сначала определить название процедуры, передаваемые в нее параметры, способ получения результата из процедуры. Тело процедуры пока можно сделать пустым. Затем написать основную программу, в которой определить точки обращения к процедуре и значения фактических параметров.

Пусть наша процедура называется dlina. Для вычисления длины стороны треугольника в процедуру необходимо передать значения координат двух вершин, поэтому в списке формальных параметров в заголовке процедуры нужно описать 4 параметра-значения вещественного типа: a1, b1, a2, b2. Для передачи полученного значения в основную программу нужно описать в заголовке параметр-переменную, принимающий ссылку, назовем этот параметр d (необходимо помнить, что в заголовке процедуры перед этим параметром ставится служебное слово var).

Тогда начальный вариант программы будет выглядеть следующим образом:

Program treugolnik;

Var

S, a, b, c, p: real; {описываем переменные для вычисления площади
(S), сторон (a, b, c), периметра (p)}

X1, y1, x2, y2, x3, y3: real; {описываем переменные – координаты
вершин}

Procedure dlina (a1, b1, a2, b2: real; var d: real); {заголовок процедуры,
в которой будет вычисляться длина стороны треугольника}

Begin

End; {конец процедуры. Пока тело процедуры пусто, детали
вычислений запишем чуть позже. Зато к этой процедуре уже
можно обращаться из основной программы}

Begin {начало основной программы}

Writeln (‘Введите координаты первой вершины’);

Readln (x1, y1);

Writeln (‘Введите координаты второй вершины’);

Readln (x2, y2);

Writeln (‘Введите координаты третьей вершины’);

Readln (x3, y3);

dlina (x1, y1, x2, y2, a); {вычисляем длину первой стороны, при этом
x1, y1, x2, y2 будут передавать копии своих
значений в процедуру, а переменная a будет
принимать полученный результат}

dlina (x2, y2, x3, y3, b); {вычисляем длину второй стороны, при этом
x2, y2, x3, y3 будут передавать копии своих
значений в процедуру, а переменная b будет
принимать полученный результат }

dlina (x3, y3, x1, y1, c); {вычисляем длину третьей стороны, при этом
x3, y3, x1, y1 будут передавать копии своих
значений в процедуру, а переменная c будет
принимать полученный результат}

P:= a+ b+ c; {вычисляем периметр}

S:= sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));

Writeln (‘площадь треугольника равна:’, s);

End.

Обратите еще раз внимание на различие в вызове подпрограммы-функции и подпрограммы-процедуры. Обращение к функции использовалось в операторе присваивания как выражение, а обращение к процедуре – это оператор.

Теперь можно наполнить содержанием саму процедуру:

Procedure dlina (a1, b1, a2, b2: real; var d: real);

Begin

D:= sqrt(sqr(a1- a2) +sqr(b1-b2));

End;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: