При решении достаточно большой задачи её рекомендуется разбивать на отдель- ные смысловые части (подпрограммы), программировать их отдельно, а затем объеди- нять в единую программу. Использование подпрограмм считается хорошим стилем программирования. Подпрограмму можно выполнять в различных местах программы для различных исходных данных.
Любая программа может содержать несколько подпрограмм, каждая из которых может, в свою очередь, содержать обращения к другим подпрограммам. Для простоты изложения ограничимся подпрограммами, которые не содержат внутри себя обраще- ний к другим подпрограммам, и их вызов осуществляется из основной программы.
В языке программирования Pascal имеется два вида подпрограмм: процедуры (Procedure) и функции (Function).
Процедуры и функции – это относительно самостоятельные части программы, имеющие собственное имя. Они описываются перед основной программой, а вызыва- ются из основной программы.
Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя)
функции, заключенный в круглые скобки, необязательный список формальных пара-
метров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В целом структура функции, определенной пользователем имеет вид:
Function <имя_функции>(<формальные
параметры>) : <тип результата>; Label <метки>;
Const <константы>; раздел объявления меток, констант, типов данных,
Type <типы данных>; переменных (может отсутствовать)
Var <переменные>; Begin
<операторы, составляющие тело функции>; End;
Для того, чтобы значение функции было определено и передано в основную программу, в теле функции обязательно должен быть хотя бы один оператор присваи- вания вида:
<имя_функции>:=<значение>.
Вызов функции, определенной пользователем, осуществляется так же, как и лю- бой стандартной функции Паскаля. Каждый аргумент должен соответствовать фор- мальным параметрам, указанным в заголовке, и иметь тот же тип.
Функция возвращает результат через свое имя, поэтому имя функции ставится в правой части оператора присваивания.
Создать функцию нахождения максимального из двух чисел
Program Pr1;
Var
a,b,m:real;
Function Max(a,b:real):real; begin
end;
if a>b {если a больше b}
then Max:=a {то функция принимает значение a}
else Max:=b; {иначе функция принимает значение b}
BEGIN
write('a,b='); readln(a,b); {ввод исходных данных}
m:=Max(a,b); {вызов функции}
write('Max=',m:5:1); {вывод результата}
END.
a,b=14 9
Max= 14.0
Составить функцию для вычисления xn, где x,n – целые числа
Степень принимает отрицательное значение, если основание степени Х<0 и показа- тель степени –нечетное число.
Program Pr2; Var
x,n:integer;
Function stepen(x,n:integer):real; begin
if (n mod 2 <> 0) and (x<0) then stepen:=-exp(n*ln(abs(x)))
else stepen:=exp(n*ln(abs(x)));
end; BEGIN
write('x,n='); readln(x,n); {ввод исходных данных}
write('stepen=',stepen(x,n):6:2); {вызов функции и вывод ее значения}
END.
1 случай
x,n=2 3
stepen= 8.00
2 случай
x,n=-2 3
stepen= -8.00
3 случай
x,n=2 -2
stepen= 0.25
4 случай
x,n=-2 -2
stepen= 0.25
Создать функцию нахождения наибольшего общего делителя двух натуральных чисел.
Program Pr3; Var
a,b:integer;
Function NOD(a,b:integer):integer; begin
while a<>b do {пока числа не равны}
if a>b then a:=a-b {заменяем большее из них разностью большего и меньшего}
else b:=b-a;
NOD:=a;
end; BEGIN
write('a,b='); readln(a,b); {ввод исходных данных} write('NOD=', NOD(a,b)); {вызов функции и вывод ее значения} END.
a,b=24 16
NOD=8
Два
треугольника длинами своих сторон.
Определить, площадь какого из них больше
(создать функцию для вычисления площади треугольника по длинам его сто- рон).
Для решения задачи используем формулу Герона z – стороны треугольника, p – полупериметр)
S = , где x, y,
Program pr4; var
a1, b1, с1, s1, a2, b2, с2, s2: real;
{функция вычисления площади треугольника со сторонами x,y,z}
Function PlTr(x ,y, z: real): real; Var
p: real;
Begin
p:= (x + y + z)/2; {полупериметр треугольника}
PlTr:=Sqrt(p*(p-x)*(p-y)*(p-z)); End;
BEGIN {основная программа}
{ввод исходных данных}
Write('Cтороны 1-го треугольника:'); Readln(a1, b1, c1); Write('Cтороны 2-го треугольника:'); Readln(a2, b2, c2);
S1:=PlTr(a1, b1, c1);{вызов функции для нахождения площади 1-го треугольника} S2:=PlTr(a2, b2, c2);{вызов функции для нахождения площади 2-го треугольника} if S1>S2 then Writeln(‘S1>S2’)
else if S1<S2 then Writeln(‘S1<S2’)
else Writeln(‘S1=S2’);
END.
Cтороны 1-го треугольника:3 4 5
Cтороны 1-го треугольника:6 7 8 S1<S2
Вычислить, используя функцию нахождения знаменателя:
1 + 2 + 3 + ...(n слагаемых)
2! 3! 4!
Program pr5; Var s: real;
i, n: integer;
Function Fakt(x: integer): real; {функция вычисления факториала}
Var
i: integer; f: real;
begin
end;
f:=1;
for i:=1 to x do f:=f*i; Fakt:=f;
BEGIN
write('n= '); Readln(n); {вводим количество слагаемых суммы}
s:=0;
For i:=1 to n do {перебираем i от 1 до n}
s:=s+i/Fakt(i+1); {добавляем к сумме очередную дробь, вызывая}
{ функцию для вычисления знаменателя}
writeln('s=',s:6:4); {вывод результата}
END.
n=3 s=0.9583
Вычислить, используя функцию нахождения знаменателя:
5
1 + 2
10
+ 1 + 2 +
3
15
+ 1 + 2 +
3 + 4
+... (n слагаемых)
Program pr6; Var s: real;
i, n: integer;
{ функция вычисления суммы первых m натуральных чисел}
Function Sum(m:integer ):integer; Var
k, S: integer; begin
S:=0;
for k:=1 to m do
S:=S+k;
Sum:=S;
end;
BEGIN
write('n= '); Readln(n); {вводим количество слагаемых суммы}
s:=0;
for i:=1 to n do {перебираем i от 1 до n}
s:=s+i*5/sum(i+1); {добавляем к сумме очередную дробь, вызывая}
{ функцию для вычисления знаменателя}
writeln('s=',s:6:4) {вывод результата}
END.
n=3 s=4.8333
1. Структура функции, определенной пользователем.
2. Как осуществляется вызов функции из основной программы?
3. Каким образом функция передает результат в основную программу?
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.