Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Подпрограммы.doc
Скачиваний:
25
Добавлен:
09.02.2015
Размер:
369.15 Кб
Скачать

Функции Объявление функции

Заголовок функции

Обращение к функции

Отличие функции от процедуры состоит в том, что

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

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

  • в объявлении функции её имя (а не обращение к ней, делающее подпрограмму рекурсивной) не должно встречаться в правой части операторов присваивания или в выражениях,

  • в объявлении функции должен быть хотя бы один оператор, присваивающий её имени, или объявленной по умолчанию локальной (известной только внутри функции) переменной Resultтого же типа, что и тип функции, результат вычислений,

  • в отличие от имени функции, переменную Result можно использовать в правых частях операторов присваивания и в выражениях как дополнительную переменную, представляющую результат вычислений.

Обращение к функции можно так же, как и обращение к процедуре, записывать как отдельный оператор в режиме расширенного синтаксиса, используемом в Delphi по умолчанию. Обращение к функции отдельным оператором может иметь смысл, когда интересующий нас результат представлен параметрами, а не именем функции. Отключить режим расширенного синтаксисаможно директивой {$X-} или {$EXTENDEDSYNTAX OFF}, но тогда не будет объявлена по умолчанию локальная переменная Result, и при попытке её использования компилятор сообщит об ошибке.

Пример 1. Составить и использовать функцию, возвращающую максимальный из первых Nэлементов массива X(N), N≤100.

  1. type

  2. tMas=array[1..100] of Real;

  3. . . . . .

  4. function MaxMas(N:Integer; const X:tMas):Real;

  5. var

  6. i:Integer;

  7. begin

  8. Result:=X[i];

  9. for i:=2 to N do

  10. if X[i]>Result then

  11. Result:=X[i];

  12. end;

  13. . . . . .

  14. var

  15. Y:tMas;

  16. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  17. . . . . .

  18. //Вызов функции в операторе вывода

  19. WriteLn('Максимальный из сорока элементов массива Y = '

  20. ,MaxMas(40, Y));

  21. . . . . .

  22. end.

Если отключить режим расширенного синтаксиса, то в объявлении функции пришлось бы отказаться от использования переменной Result и объявить дополнительную переменную для поиска максимального значения в массиве. В результате получили бы следующее объявление функции.

  1. function MaxMas(N:Integer; const X:tMas):Real;

  2. var

  3. i:Integer;

  4. R:Real;//Дополнительная переменная

  5. begin

  6. R:=X[1];

  7. for i:=2 to N do

  8. if X[i]>R then

  9. R:=X[i];

  10. //Чтобы функция возвратила вычисленное значение,

  11. //оно должно быть присвоено её имени

  12. MaxMas:=R;

  13. end;

Использование функций позволяет не только сделать текст программы более удобным для понимания её алгоритма, но и уменьшить его при необходимости повторных вычислений в разных частях программы.

Пример 2. Составить программу поиска приближенных значений корней уравнения

и их уточнённых значений методом половинного деления.

  1. program Project1;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. //Функция, вычисляющая выражение, входящее в уравнение

  6. function F_PX(const P,X:Real):Real;

  7. var

  8. PX:Real;

  9. begin

  10. PX:=P*X;

  11. F_PX:=X*Cos(3*PX)/P/12-Sin(3*PX)/Sqr(P)/36

  12. -3*X*Cos(PX)/P/4 +3*Sin(PX)/Sqr(P)/4;

  13. end;

  14. //функция, уточняющая значение корня

  15. function KorenF_PX(P,X0,X1,Eps:Real):Real;

  16. var

  17. F0,F,F1,X:Real;

  18. begin

  19. F0:=F_PX(P,X0);

  20. repeat

  21. X:=(X0+X1)/2;

  22. F:=F_PX(P,X);

  23. if F0*F>0 then

  24. X0:=X

  25. else

  26. X1:=X;

  27. until Abs(X1-X0)<Eps;

  28. KorenF_PX:=X;

  29. end;

  30. var

  31. P,X, A, B, dX, F0, F1,Eps,Koren:Real;

  32. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  33. Write('Введите границы интервала и шаг аргумента:');

  34. ReadLn(A,B,dX);

  35. Write('Введите параметр выражения P: ');ReadLn(P);

  36. Write('Введите требуемую точность корня: ');ReadLn(Eps);

  37. F0:=F_PX(P,A);

  38. dX:=0.01;

  39. X:=A+dX;

  40. while X<B+0.005 do

  41. begin

  42. F1:=F_PX(P,X);

  43. if F0*F1<0 then

  44. begin

  45. //Найдены приближенные значения корня

  46. //X-dX - приближение, меньшее корня

  47. //X - приближение, большее корня

  48. WriteLn(X-dX,' = левое приближение корня');

  49. //Поиск приближения с точностью Eps

  50. Koren := KorenF_PX(P,X-dX,X,Eps);

  51. //Вывод результатов

  52. WriteLn(Koren,' = корень с точностью ',Eps);

  53. WriteLn(F_PX(P,Koren),' = значение функции в корне');

  54. WriteLn;

  55. end;

  56. F0:=F1;

  57. X:=X+dX;

  58. end;

  59. ReadLn;

  60. end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]