Глава 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