Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 3 Более сложные элементы языка

____________________________________________________________________

Таким образом, одноименные глобальные и локальные переменные - это разные переменные. Любое обращение к таким переменным в теле подпро-

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

Пример использования функции.

Вычислить значение y sin x путем разложения sin x в ряд Тейлора с точ-

ностью 10 3 , x [0,1], x 0.1 Вычисление оформить в виде функции.

Вычисленное значение sin x для каждого x сравнить с "точным" значением пу-

тем применения стандартной функции Паскаля sin(x).

Напомню, что мы уже писали эту программу (см. 2.1.26), но без примене-

ния функций. Разложение sin x в ряд Тейлора имеет вид:

 

x3

 

x5

x7

sin x x

 

 

 

 

 

....

3!

5!

 

7!

 

 

 

Функцию, которая

вычисляет sinx по данному ряду, назовем

No_standard_sin(x).

program sinus_fun; {$mode objfpc}{$H+} uses

CRT, FileUtil;

var

x, y, y1, dx:real;// глобальные переменные, доступны функции

function No_standard_sin (x: real): real; var

eps, s, t: real; // локальные переменные, недоступны

n: integer;

// вызывающей программе

begin

 

s:= x;

 

t:= x;

 

151

3.1 Общая структура Паскаль – программы

____________________________________________________________________

n:= 2; eps:= 1e-7; repeat

t:= -t * sqr(x)/(n * (n + 1)); s:= s + t;

n:= n + 2;

until abs(t) < eps;

No_standard_sin:= s; // возврат значения функции

//Result:= s; // можно и так end;

begin x:= 0;

dx:= 0.2;

writeln(UTF8ToConsole('Значения синуса')); writeln(UTF8ToConsole('моя функции, стандартная функции')); while x <= 1 do

begin

y:= No_standard_sin(x);// вызов моей функции y1:= sin(x); // вызов стандартной функции writeln(' ', y:0:7,' ', y1:0:7); x:= x + dx;

end;

writeln(UTF8ToConsole('Нажмите любую клавишу')); readkey;

end.

Пример.

Вспомним пример из 2.2.2. вычисления интеграла по формуле Симпсона.

Перепишем программу, причем оформим вычисление подынтегральной функ-

152

Глава 3 Более сложные элементы языка

____________________________________________________________________

ции в виде функции, а вычисление интеграла в виде процедуры:

program integral; {$mode objfpc}{$H+} uses

CRT, FileUtil; var

a, b, eps: real;

function Fx(x: real): real; // Подынтегральная функция

{Если потребуется вычислить интеграл для другой функции,

достаточно поменять только один оператор}

begin

Fx:= sin(x); // Для другой функции меняем здесь

end;

{ Процедура вычисления интеграла по формуле Симпсона методом двойного пересчета}

procedure Simpson(a, b, eps: real); var

x, h, s, s1: real; n, k: integer;

begin

k:= 0; // при первом вычислении интеграла k=0

n:= 4; // начальное число точек разбиения интервала (a,b) h:= (b - a)/n; // шаг вычисления подынтегральной функции while true do

begin x:= a;

153

3.1 Общая структура Паскаль – программы

____________________________________________________________________

x:= x + h; s:= 0;

while x < (b-h) do begin

s:= s + Fx(x) + 2 * Fx(x + h); x:= x + 2 * h;

end;

s:= 2 * s;

s:= (h/3) * (Fx(a) + 2 * Fx(b) + s); if k = 0

then begin

k:= 1; s1:= s; h:= h/2; continue;

end else

if abs(s1 - s) > eps then begin

s1:= s; h:= h/2; continue;

end else

break;

end;

writeln(UTF8ToConsole('Значение интеграла s= '), s:0:4);

end; // конец процедуры

154

Глава 3 Более сложные элементы языка

____________________________________________________________________

begin // начало основной программы

{задаем интервал на котором вычисляется интеграл}

a:= 0;

b:= pi/4;

eps:= 1e-5; // заданная точность вычисления интеграла

Simpson(a, b, eps); // вызов процедуры вычисления интеграла writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

3.1.1.4 Способы передачи параметров

Передача параметров по значению

При таком способе передачи параметров в функцию или процедуру пере-

дается копия переменной. Внутри функции или процедуры можно менять зна-

чения переданных параметров, однако в вызывающей программе значения па-

раметров остаются неизменными.

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

program parameters; {$mode objfpc}{$H+} uses

CRT, FileUtil; var

x, y: real; n: integer;

{Объявление процедуры с параметром}

procedure example(x, y: real; n: integer);

begin

x:= 1.5;

155

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773