ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ

  • docx
  • 26.12.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л3-0025364.docx

ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ

 

Краткие теоретические сведения

 

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

Любая программа может содержать несколько подпрограмм, каждая из которых может, в свою очередь, содержать обращения к другим подпрограммам. Для простоты изложения ограничимся подпрограммами, которые не содержат внутри себя обраще- ний к другим подпрограммам, и их вызов осуществляется из основной программы.

В языке программирования Pascal имеется два вида подпрограмм: процедуры (Procedure) и функции (Function).

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

Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя)

функции, заключенный в круглые скобки, необязательный список формальных пара-

метров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В целом структура функции, определенной пользователем имеет вид:


Function <имя_функции>(<формальные параметры>) : <тип результата>; Label <метки>;

Const <константы>;     раздел объявления меток, констант, типов данных,

Type <типы данных>;   переменных (может отсутствовать)

Var <переменные>; Begin

<операторы, составляющие тело функции>; End;

Для того, чтобы значение функции было определено и передано в основную программу, в теле функции обязательно должен быть хотя бы один оператор присваи- вания вида:

<имя_функции>:=<значение>.

Вызов функции, определенной пользователем, осуществляется так же, как и лю- бой стандартной функции Паскаля. Каждый аргумент должен соответствовать фор- мальным параметрам, указанным в заголовке, и иметь тот же тип.

Функция возвращает результат через свое имя, поэтому имя функции ставится в правой части оператора присваивания.

 

Пример 1.

Создать функцию нахождения максимального из двух чисел

 

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

 

Пример 2.

Составить функцию для вычисления 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

 

 

Пример 3.

Создать функцию нахождения наибольшего общего делителя двух натуральных чисел.

 

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

 

Пример 4.

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


Для решения задачи используем формулу Герона 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

 

Пример 5.

Вычислить, используя функцию нахождения знаменателя:

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

 

Пример 6.

Вычислить, используя функцию нахождения знаменателя:


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.     Каким образом функция передает результат в основную программу?