АВТИ информатика по паскалю / Metod1_2010 / LABOR5указ
.doc
Тема 10. Процедуры (Лекция 12, 31.10.2006)
10.1. Основные определения
10.2. Процедуры без параметров
10.3. Процедуры с параметрами. Правила подстановки параметров.
10.4. Способ подстановки параметра по значению.
10.5. Способ подстановки параметра по переменной.
10.6. Способ подстановки параметра по имени.
f(x)
xl=a xs xr=b
Суть метода состоит
в стягивании отрезка к точке
Пусть - левая, а - правая части
отрезка. На концах отрезка функция
имеет разные знаки. Отрезок делится
пополам точкой и выбирается та половина,
на концах которого функция имеет разные
знаки.
Процесс деления
отрезка повторяется до тех пор, пока
не выполнится условие
│xr-xl│<
eps и│f(x)│<eps
Метод бисекции (деления пополам).
Оформим этот метод в виде процедуры Bisec:
a, b, f(x) x
Мы будем стремиться разрабатывать чистые процедуры, в которых все входные и выходные данные передаются через параметры. Чистая процедура – это универсальная процедура, текст которой не меняется при изменения в/в данных.
Как передавать a, b (по значению) и х (по переменной)мы знаем.
Как передать функцию f(x)?
-
Если описать функцию(в виде, например, выражения) в теле процедуры
Bisec, то она будет годиться только для решения одного конкретного уравнения.
-
Если описать функцию вне процедуры, а в теле процедуры к ней только
обращаться, то при использовании этой процедуры для решения другого уравнения, потребуется заменить в ее тексте старое обращение на новое.
-
Если же описать имя функции, как формальный параметр процедуры Bisec,
то процедура станет универсальной относительно этой функции: просто вместо формального имени надо подставить имя фактической функции.
Такие процедуры называются с “нестандартными внешними функциями”, которые должны для процедуры описываться пользователем.
Рассмотрим пример.
1. Задача. Найти корни уравнений
-
fa(x) = x – p√ x + 1 = 0 на отрезке [p2 ; p2 + 1] и
b) fb(x) = x3 + 3x – 3 = 0 на отрезке [0; 1] с точность eps.
2.Входные данные: вещ eps –точность; p - параметр
3.Выходные данные: вещ xa, xb – корни уравнений fa, fb.
4.Метод бисекции (деления пополам).
Интерфейс процедуры Bisec
{Входные: eps - точность, a, b – границы отрезка, f – формальное имя нестандартной функции; Выходные: x -корень}
Параметр f определяет способ подстановки по имени.
Язык Турбо-Паскаль имеет отличие от стандартного Паскаля в использовании параметра-имени.
Заголовок процедуры в стандартном Паскале имеет вид:
procedure Bisec (eps, a, b : real; function f(x:integer):real) ,
где параметр-имя представляет собой заголовок функции-параметра.
В Турбо-Паскале добавлен новый - процедурный тип ( по аналогии с языком Модула-2). Если имя процедурного типа задать в виде func, то описание этого типа для функции f имеет вид:
type
func = function(x:integer):real .
Заголовок процедуры в Турбо-Паскале будет иметь вид
procedure Bisec (eps, a, b : real; f : func):real
Запишем на языке Турбо-Паскаль программу . Следует обратить внимание , что при использование процедуры или функции в качестве параметра процедуры, следует установить опцию компилятора.
OPTIONS \ COMPILE \ FORCE FAR (так называемая дальняя модель памя-
ти), поэтому в программу должна быть вставлена директива компилятора
{$F+}. В таком режиме должны компилироваться любые процедуры (функ-
ции), которые будут передаваться в качестве фактических параметров вызова.
При описании процедуры Bisec вычисляется абстрактная функция f. Для того , чтобы вместо функции f можно было подставлять имена конкретных функций fa, fb, эти функции должны быть описаны в главной программе. Эти описания относятся к интерфейсу программы..
Программа Root вычисляет оба корня с помощью процедуры Bisec, которая не
зависит от вида этих функций.
Проект (программа)
{Корни
уравнений f(x)
= 0}
program
Root;
{$F+}{установление
дальней модели памяти}
type func
= function(x:integer):real
var eps,
p: real; {входные}
xa,
xb:
real;
{выходные}
{Описание функции
fa} function
fa (x : real):real; begin
fa := x – sqrt (x + 1) end;
{Описание
функции
fb} function
fb (x : real):real; begin
fb := x – sqrt (x + 1) end; {}
procedure
Bisec (eps, a, b : real; f : func;
var
x:real)
;
<Тело процедуры>
begin
{Главная
программа} writeln
(‘’); readln
(eps);
{Нахождение
корня
xa} bisec
(eps, p*p, p*p+1, fa, xa); Writeln
(‘xa =’, xa);
{
Нахождение
корня
xb} bisec
(eps, 0, 1, fb, xb); Writeln
(‘xb =’, xb) end.
Происходит взаимодействие программных модулей, которое удобно продемонстрировать в виде следующей схемы:
Использование для «Сортировки».