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

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

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

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

Иконка файла материала Л2-00225.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


 

Посмотрите также