Практически все сказанное о процедурах верно и для функций. Отличие функции от процедуры состоит в том, что функция не имеет выходных параметров, она возвращает единственное значение – это значение функции. Входные параметры называются еще аргументами функции.
1. Описание функции
Function <имя> (<список аргументов>): <тип значения функции>; { заголовок }
<блок описания локальных данных>
Begin { начало исполняемой части функции }
<тело функции (исполняемая часть)>
End; { конец описания функции }
В теле функции обязательно должна быть команда присваивания вида:
<имя функции> := <вычисленное значение>;
которая и позволит функции возвратить вычисленное значение.
Например, опишем функцию вычисления среднего арифметического двух целых чисел:
Function middle (a, b: integer): real;
Begin
Middle:= (a + b) / 2
End;
В данном примере тело функции – единственный оператор присваивания, который присваивает имени функции нужное значение.
Примеры решаемых задач
Пример 1. Составить программу, которая вычислит значение выражения
|
|
am+bn+(a-b)m+n.
Вычисление степени числа оформить в виде подпрограммы.
Пояснение. Составим и сравним две программы: с использованием процедуры и функции вычисления степени числа.
Программа:
program calc_proc;
uses crt;
var a, b, m, n, s1, s2, s3, s: integer;
procedure stepen (x, y: integer; var z: integer);
{процедура возводит число x в степень y, результат записывает в z }
{т.е. в процедуре описано правило вычисления z=xy }
var i: integer; { локальная переменная для организации цикла }
begin
z:= 1;
for i:= 1 to y do z:= z * x
end;
begin
clrscr;
write(‘Введите a, b, m, n ’);
readln(a, b, m, n);
{ три раза вызываем процедуру stepen для вычисления трех слагаемых }
stepen(a, m, s1); { вычислили s1 как am }
stepen(b, n, s2); { вычислили s2 как bn }
stepen(a-b, m+n, s3); { вычислили s3 как (a-b)m+n }
s:= s1 + s2 + s3; { вычислили сумму трех слагаемых }
writeln(‘Значение выражения ’, s);
readln
end.
program calc_func;
uses crt;
var a, b, m, n, s: integer;
function stepen (x, y: integer): integer;
{ функция возводит число x в степень y }
{ т.е. описано правило вычисления stepen = xy }
var i,z: integer; {локальные переменные:
i для организации цикла, z для вычисления произведения }
begin
z:= 1;
for i:= 1 to y do z:= z * x;
stepen:= z { присвоили имени функции вычисленное значение }
end;
begin
clrscr;
write(‘Введите a, b, m, n ’);
readln(a, b, m, n);
{ три раза вызываем функцию stepen для вычисления трех слагаемых }
s:= stepen(a, m) + stepen(b, n) + stepen(a-b, m+n, s3);
writeln(‘Значение выражения ’, s);
readln
end.
Контрольные задания
11.1. Составить программу, которая вычислит площадь треугольника, заданного координатами своих вершин. Использовать формулу Герона. Вычисление расстояния между двумя точками оформить в виде процедуры или функции.
11.2. Составить программу определения НОД трех чисел (по алгоритму Евклида) с использованием процедуры нахождения НОД двух чисел (по алгоритму Евклида).
|
|
11.3. Составить программу, проверяющую гипотезу Гольдбаха. Она состоит в том, что любое четное число, большее 2, можно представить в виде суммы двух простых слагаемых. Программа должна вводить четное положительное число и выводить все его возможные представления в виде суммы двух простых слагаемых. Для определения, является ли число простым, использовать подпрограмму.
11.4. Составить программу, которая изображает на экране:
a. лес
b. аллею
из елей и берез. Рисование ели и березки оформить в виде процедур.
11.5. «Диаграммы». Составить программу, которая вводит N числовых данных и интерпретирует их в виде столбиковой, круговой, линейной диаграмм. Программа должна в алфавитно-цифровом режиме предоставлять пользователю меню – список видов диаграмм, позволять выбрать (например, ввести номер) нужной диаграммы, после чего в графическом режиме построить нужную диаграмму. Каждый из режимов работы программы (ввод данных, построение каждого вида диаграмм) оформить в виде отдельной процедуры.