Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
31.03.2015
Размер:
44.03 Кб
Скачать

3

Тема 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)?

  1. Если описать функцию(в виде, например, выражения) в теле процедуры

Bisec, то она будет годиться только для решения одного конкретного уравнения.

  1. Если описать функцию вне процедуры, а в теле процедуры к ней только

обращаться, то при использовании этой процедуры для решения другого уравнения, потребуется заменить в ее тексте старое обращение на новое.

  1. Если же описать имя функции, как формальный параметр процедуры Bisec,

то процедура станет универсальной относительно этой функции: просто вместо формального имени надо подставить имя фактической функции.

Такие процедуры называются с “нестандартными внешними функциями”, которые должны для процедуры описываться пользователем.

Рассмотрим пример.

1. Задача. Найти корни уравнений

  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.

Происходит взаимодействие программных модулей, которое удобно продемонстрировать в виде следующей схемы:

Использование для «Сортировки».

Соседние файлы в папке Metod1_2010