- •Лабораторная работа № 6 Реализация программ, использующих процедуры и функции пользователя
- •Цель работы
- •2. Краткие сведения из теории
- •2.1 Общие сведения о подпрограммах
- •2.2 Глобальные, локальные блоки и объекты
- •2.3 Подпрограмма-процедура
- •2.4 Подпрограмма-функция
- •2.5 Рекурсивная подпрограмма
- •3 Содержание работы
- •4 Требования к отчету
- •5 Контрольные вопросы
- •Приложение а
- •Приложение в
- •Приложение в Задания для самостоятельного выполнения на процедуры и функции
2.5 Рекурсивная подпрограмма
Рекурсивной называется подпрограмма, в которой содержится обращение к самой себе. Возможность рекурсивного обращения связана с тем, что при каждом новом обращении к подпрограмме параметры, которые она использует, заносятся в память, причем параметры предыдущего обращения также сохраняются. Ясно, что для завершения вычислений каждая рекурсия должна содержать хотя бы одну нерекурсивную ветвь алгоритма, заканчивающуюся возвращением в вызывающую программу. В ряде случаев рекурсивное оформление подпрограммы может быть более компактным и эффективным, но не следует забывать о расходе времени на повторные вызовы функции и об опасности переполнения ячейки памяти.
Простой пример рекурсивной функции – вычисление факториала:
Пример 3. Вариант функции, рекурсивно вычисляющей факториал.
functicon Factorial(m : Byte) : Longint;
begin
if (m=0) or (m=1) then Factorial := 1
else Factorial := m * Factorial(m-1);
end;
3 Содержание работы
3.1 Реализовать следующую программу: Даны отрезки а, b, с. Если из этой тройки отрезков можно построить треугольник, то вычислить его площадь, в противном случае вывести на печать сообщение "нельзя построить треугольник".
Пример 1. Даны отрезки а, b, с. Если из этой тройки отрезков можно построить треугольник, то вычислить его площадь, в противном случае вывести на печать сообщение "нельзя построить треугольник".
Решение.
Program Square;
Var a,b,c,S : Real;
{процедура нахождения площади треугольника по формуле Герона}
Procedure Streug(x,y,z:Real;Var ss:Real);
Var p:Real;
Begin
p:=(x+y+z)/2;
ss:=sqrt(p*(p – x)*(p – y)*(p – z));
End;
Begin
Writeln('Введите длины 3-х отрезков');
Write('a='); Readln(a);
Write('b='); Readln(b);
Write('c='); Readln(c);
if (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a){контроль ввода}
Then Begin
Streug(a,b,c,S); {вызов процедуры}
Writeln('Площадь S = ', S) {вывод результата}
End
Else Writeln('нельзя построить треугольник');
End.
3.2 Выполнить свой вариант задания на функции из приложения А и Б.
3.3 Составить программу вычисления числа сочетаний , используя предложенную в примере 3 рекурсивную функцию вычисления факториала числа.
3.4 Выполнить задание для самостоятельной работы по вариантам из приложения В, оформив подпрограммы заполнения, подсчета нужного числового значения (по заданию) и вывода массива в виде отдельных функций. В основной программе произвести вызов нужных функций для двух матриц и выдать в качестве результата наибольшее из полученных значений.
Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Заполнение массивов следует производить с помощью датчика случайных чисел. Например, для заполнения матрицы случайными числами от -20 до 20 и вывода ее элементов на экран можно создать следующую функцию:
Procedure InMatr(Var x:TArray; row,col:Byte);
Var i,j:Byte; {Описание локальных переменных}
Begin {Формирование случайной матрицы и ее вывод на экран}
Randomize;
For i:=1 to row do Begin
For j:=1 to col do Begin
X[i,j]:=Random(41)-20; {x[i,j] формируется случайно}
Write(x[i,j]:7:2,' '); {X[i,j] выводится на экран}
End;
Writeln;
End;
End;
Тогда в основной программе вызов этой процедуры будет выглядеть следующим образом:
Program prog;
Type TArray=Array[1..10,1..10] of Real;
Var A: TArray; n,m : Byte;
{описание необходимых процедур и функций}
BEGIN {глобальный блок – основная программа}
Write('Введите число строк и столбцов матрицы А (не более 10) ');
Readln(n,m);
{вызов процедуры формирования и печати матрицы}
InMatr(A,n,m);
. . .
Процедура печати матрицы может выглядеть следующим образом:
Procedure Print(x:TArray; row,col:Byte);
Var i,j:Byte; {Описание локальных переменных}
Begin
For i:=1 to row do Begin
For j:=1 to col do Begin
Write(x[i,j]:7:2,' ');
End;
Writeln;
End;
End;
3.5 Сохранить все результаты в файлы и оформить отчет.