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

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

Mass : MyArray;

 

Begin

 

SetLength(Mass,Memo1.Lines.Count);

// Выделение памяти

For i:=0 To Length(Mass)-1 Do

// Заполнение массива

Mass[i]:=StrToFloat(Memo1.Lines[i]); Memo1.Lines.Add('Квадрат максимального элемента: '

+FormatFloat('0.00E+0',Sqr(Form1.Max(Mass))));

end;

end.

В обработчике Button1Click функция Max вызывается из функции Sqr, которая, в свою очередь, вызывается из функции форматного вывода FormatFloat. Здесь параметр Mass – фактический. Рекомендуется вводить идентификаторы формальных параметров на основе фактических параметров, предваряя их символом «A».

Функции и процедуры могут быть рекурсивными, т.е. вызывающими сами себя. При каждом новом обращении к функции (процедуре) её параметры заносятся в стек – специальный участок ОЗУ, причем параметры предыдущего обращения также сохраняются. Не следует забывать об опасности переполнения стека. По умолчанию максимальный размер стека равен 1 Мегабайт. Данный параметр регулируется опциями компилятора.

П р и м е р 3.32

Вычисление факториала числа N методом рекурсии.

procedure TForm1.Button1Click(Sender: TObject); var

N : Integer;

Function Factorial(N: Byte): Extended;

Begin

If N In [0..1] Then Result:=1 else Result:=N*Factorial(N-1)

end;

begin

N:=StrToInt(Edit1.Text); // Ввод целого N //Вывод факториала N:

Edit2.Text:=FloatToStr(Factorial(N)); end;

80

3.7 ПРОЦЕДУРЫ И ФУНКЦИИ

3.7.4 Параметры процедур и функций

Правила передачи параметров для процедур и функций одинаковы. При описании процедур (функций) все параметры должны содержать описание их типов. Количество, порядок следования и тип формальных и фактических параметров должен обязательно совпадать. В Object Pascal существуют несколько способов передачи параметров:

1.Группа формальных параметров, перед которой стоит слово Var и за которыми следуют указания типов, является списком параметровпеременных. Такие параметры передаются по ссылке на адрес фактического параметра. При этом идентификаторы формального и фактического параметров указывают на один и тот же адрес данных в ОЗУ. Поэтому при передаче параметров по ссылке они не заносятся в стек данных. По существу они являются глобальными.

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

2.Группа формальных параметров, перед которыми ничего не стоит и за которыми следуют указания типов, является списком параметровзначений. Параметр-значение обрабатывается как локальная переменная. Изменение формального (локального) параметра не оказывает никакого влияния на фактический (глобальный) параметр, поскольку значение формального параметра храниться в стеке данных процедуры, а после завершения её работы стек уничтожается. В качестве параметров-значе- ний могут быть переменные, константы и выражения соответствующих типов.

3.Группа формальных параметров, перед которой стоит слово Const и за которыми следуют указания типов, является списком параметров- констант. Эти параметры отличаются от предыдущих тем, что память стека для них не выделяется и их фактические значения не изменяются. Такие параметры следует использовать для передачи больших массивов с «защитой» от их изменения.

4.Группа формальных параметров, перед которой стоит слово Out и за которыми следуют указания типов, является списком выходных параметров. Эти параметры отличаются от Var-параметров-переменных тем, что их фактические значения перед вводом в процедуру игнорируются. Если, затем им не будет присвоено никаких значений внутри процедуры, то при выходе из неё они будут иметь случайные значения.

5.Параметры-переменные и параметры-константы без указания типов являются параметрами без типов. В этом случае фактический параметр

81

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

может быть любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

6.Передаваемым параметром может быть процедура или функция – это параметр процедурного типа. Он может быть параметром-значением или параметром-константой.

Замечание. Если передаваемые параметры имеют ссылочный тип, например, – динамические массивы, тогда любой способ передачи параметров работает как передача по ссылке, поскольку формальные и фактические параметры будут указывать на один и тот же адрес ОЗУ. Будьте внимательны при передаче таких параметров.

Рекомендуется следующий порядок размещения параметров: сначала

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

П р и м е р 3.33

Если вместо функции Max примера 3.31 использовать процедуру Max, доступную для других модулей и не являющуюся методом класса TForm1, то такой пример может иметь следующий вид:

unit Unit1; interface uses

Windows,Messages,SysUtils,Classes,Graphics,Controls,

Forms,Dialogs,StdCtrls; type

TForm1 = class(TForm) Button1: TButton; Memo1: TMemo;

Procedure Button1Click(Sender: TObject); private { Private declarations }

public { Public declarations } end;

type

 

MyArray=Array of Double;

//глобальный тип-массив

{Объявление глобальной процедуры Max, доступной в др. модулях, }

{если она не нужна в др. модулях, то этого делать не надо }

Procedure Max(AMass: MyArray; var Ax: Double);

82

3.7 ПРОЦЕДУРЫ И ФУНКЦИИ

var

Form1: TForm1;

implementation

{$R *.DFM}

{---- Описание процедуры Max с формальными параметрами AMass,Ax ----}

Procedure Max(AMass: MyArray; var Ax: Double); Var i: Integer;

begin

Ax:=AMass[Low(AMass)];

For i:=Low(AMass)+1 To High(AMass) Do If Ax<AMass[i] Then Ax:=AMass[i];

end; {Конец описания процедуры Max}

{----------------------

Обработчик клавиши Button1Click ------------------------

}

procedure TForm1.Button1Click(Sender: TObject);

Var

 

 

i

: Integer;

 

Mass : MyArray;

 

x

: Double;

 

Begin

 

 

SetLength(Mass,Memo1.Lines.Count);

// Выделение памяти

For i:=0 To High(Mass) Do

// Заполнение массива

Mass[i]:=StrToFloat(Memo1.Lines[i]);

 

Max(Mass,x);

// Вызов процедуры

Memo1.Lines.Add('Квадрат максимального элемента: ' +FormatFloat('0.00E+0',Sqr(x)));

end;

end.

Если при описании процедуры Max вместо Var Ax: Double указать просто Ax: Double, то при возвращении значения переменной Ax мы получим случайное число, поскольку возвращаемые параметры должны передаваться по ссылке.

Замечание. При передаче массивов стандартных типов (не описанных в Type) их элементы в теле процедуры или функции нумеруются от нуля. При необходимости верхний предел индекса можно контролировать стандартной функцией High.

П р и м е р 3.34

Передача имени функции в качестве фактического параметра в другую процедуру. Поскольку при описании формальных параметров должен

83

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

указываться их тип, то при передаче параметра-функции необходимо заранее создать соответствующий тип параметра-функции. Это можно сделать, например, в разделе implementation после директивы компилятора {$R *.DFM} на основе заголовка передаваемой функции:

{ Создание типа передаваемой функции }

Type MyFunc=Function(AS: String): String;

{ Описание передаваемой функции }

Function XX(AP: String): String; begin

XX:='Функция '+AP; end;

{ Описание процедуры, принимающей функцию }

Procedure YY(AU: MyFunc; AL: String; Out AW: String);

{- в качестве параметра AU будет приниматься функция типа MyFunc с параметром AL}

begin

AW:=AU(AL)+'Ok!'; end;

{ Подключение обработчика события – нажатие на клавишу Button1 }

Procedure Tform1.Button1Click(Sender: TObject);

Var V: String;

Begin

// Вызов процедуры с фактическими параметрами: YY(XX {– параметр-функция},

'работает? '{– параметр для функции}, V {- выходной параметр});

Edit1.Text:=V;

End;

После нажатия на клавишу Button1 в окне редактора Edit1 появится текст:

Функция работает? Ok!

Задание 9.

Численное решение задачи Коши методом Эйлера

Цель задания

1. Получение навыков в написании программ с использованием функций.

84

3.7ПРОЦЕДУРЫ И ФУНКЦИИ

2.Изучение механизма передачи параметров.

3.Знакомство с численными методами решения обыкновенных дифференциальных уравнений.

Постановка задачи

Написать программу, которая в соответствие с вариантом задания находит решение u(t) обыкновенного дифференциального уравнения в виде задачи

Коши:

 

du(t)

= f (u, t) , u(0) = u0 . Для решения уравнения используйте

 

 

 

 

dt

 

численный метод Эйлера на сетке ω t ={ti =i × Dt , i = 0,1,..., n }:

 

 

 

ui+1 = ui + t f (ui , ti ) , i = 0,1,..., n -1,

где ui

= u(ti ) – решение задачи в момент времени ti , шаг сетки t = T n ,

T – максимальное время в задаче Коши,

n – количество ячеек сетки ω t .

Начальное условие u0 = −1.

 

Значение T вводите через объект Edit,

а значение n = 10,20,30,50,100

вводите через выпадающий список ComboBox. Вычисление свободного члена f(u,t) оформите в виде функции Object Pascal.

Интерфейс приложения может иметь вид, показанный на рис. 3.11.

Рекомендации

Не забудьте сохранить архив исходных кодов разработанной программы, поскольку её алгоритм будет далее использован в лабораторной работе 11.

Рис. 3.11 Интерфейс приложения для демонстрации численного решения задачи Коши

85

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

Для ввода количества узлов сетки ω t необходимо использовать компонент

TComboBox – поле с выпадающим списком. Перечислим характерные свойства данного компонента:

DropDownCount – максимальное количество выпадающих строк (по умолчанию – до 8). Если весь список не помещается, то появляется слайдер прокрутки строк;

Items – список строк, типа TStrings;

ItemIndex – номер выбранной строки. Первая строка имеет номер 0. Выбор строки осуществляется нажатием клавиши мыши на стрелке справа, а затем – на одной из выпавших строк. Если не выбрана ни одна строка,

тогда ItemIndex=-1;

Style – может принимать следующие значения. csDropDown – можно редактировать выбранную строку списка, значение csDropDownList – нельзя редактировать, csSimple – показывать только одну строку, что отождествляется с компонентом TEdit.

Text – содержит текст выбранной строки списка. Для очистки списка используйте метод Clear.

Очевидно, что список строк TComboBox имеет все методы его предка TStrings. Эти методы подробно рассмотрены в разделе 3.2.1. Для определения выбранной строки и, соответственно, – количества узлов сетки, можно использовать алгоритм:

Case ComboBox1.ItemIndex of

0:n:=10;

1:n:=20;

2:n:=30;

3:n:=50;

4:n:=100;

end;

Кроме того, можно непосредственно анализировать содержимое выбранной строки через свойство Text.

Варианты задания

1.f (u, t) u 2 + t 2 , если 0,

u + t, если u £ 0

=u + t 2 , если u ³ 0,

2.f (u, t)

u - t, если u < 0>u=

3.

u + sin(t), если u ³ 0

f (u, t) =

 

u + t, если u < 0

4.

u + sin(t), если t < 0.1

f (u, t) =

 

u + t, если t ³ 0.1

86

3.7 ПРОЦЕДУРЫ И ФУНКЦИИ

 

 

u − 2t, если t < 1

5.

f (u, t) =

u t , если t > 1

 

 

 

 

 

 

 

 

 

- t

u

, если t = 1

 

 

u

 

6.

 

 

u + 2t , если t ³ 1

f (u, t) =

2 - 2t+1 , если t < 1

 

 

u

 

 

 

 

 

 

 

 

u + t, если u > 1

7.

 

 

- u, если u < 0

f (u, t) = t

 

 

 

- t, если 0 £ u £ 1

 

 

u

8.f (u, t)

9.f (u, t)

10.f (u, t)

u + t, если t > 1

=

 

u - t, если t £ 1

u / t, если t ≤ 1

=

t

t u−4

, если t >1

 

 

u / t + u, если u > 1

= u - t если £

t 4 , u 1

Контрольные вопросы для сдачи лабораторной работы:

1.Расскажите идею метода Эйлера.

2.Чем отличаются глобальные переменные от локальных?

3.Чем отличается передача параметров по ссылке от передачи по значению?

4.Как вернуть значения рассчитанных переменных из тела функции?

5.Можно ли использовать имя функции как оператор?

Задание 10.

Вычисление определенного интеграла методом трапеций

Цель задания

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

2.Знакомство с численными методами интегрирования.

Постановка задачи

Заданы три функции: F1(x), F2(x), F3(x). Требуется найти определённый интеграл от каждой функции в заданных пределах a,b. Для вычисления определённого интеграла необходимо использовать численный метод трапеций. Квадратурная формула метода трапеций имеет вид:

b

n

xi

F (x)dx =

F (x)dx ,

a

i=1

x

 

 

i−1

87

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

 

xi

 

 

 

h

[F (xi ) + F (xi−1 )] . Шаг равно-

где частичный интеграл

F (x)dx

 

 

xi−1

 

 

2

 

 

 

 

 

 

 

мерной сетки h = xi xi−1

 

b a

i =1,2,..., n .

=

 

 

,

 

 

 

 

 

n

 

 

 

Вычисление интеграла необходимо оформлено в виде глобальной процедуры главного модуля. Функция, от которой вычисляется интеграл, должна передаваться в процедуру как параметр процедурного типа. Варианты возможных функций представьте посредством TComboBox. Вызов процедуры интегрирования организуйте в обработчике события выбора элемента из списка TComboBox – onSelect.

Варианты задания

 

F1 =

 

 

 

 

 

,

 

 

 

 

 

 

 

a1 = 2, b1 = 3;

1.

x −1

 

F2 = x s in x ,

a2 = 0, b2 = π / 2 ;

 

F

=10(x2 −1) − x ,

a

3

= 0, b = 1.5 .

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

F = x3

 

 

 

 

 

 

 

,

 

 

 

a = −1, b = 8 ;

2.

1 + x

 

1

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

1

1

 

F2

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,

a2 = 0, b2 = π / 2 ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

+ 2 cos x

 

 

 

 

F2

=

 

 

 

 

 

1

 

 

 

 

 

,

 

 

 

 

a3 = 2, b3 = 5.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x ln(2x)

 

 

 

 

F =

sin

 

 

 

 

 

 

 

 

,

 

 

 

3.

 

 

1 + x

a

 

= 0, b =1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

2

 

x

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

F = x3 e2 x ,

a

2

= 0, b = 3;

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

F

= tg(x2 πx) ,

a

3

= 0, b = 0.5.

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

4.

F1 = x arctg x ,

a1 =1, b1 =10 ;

 

F =

1

 

 

 

,

 

 

 

 

 

 

 

a

2

= 0, b = 25;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

1 +

 

 

 

x

 

2

 

 

 

 

 

 

 

 

 

F3

=

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

,

a3 = 2, b3 = 2.5 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

− 3cos x

 

 

 

88

3.7 ПРОЦЕДУРЫ И ФУНКЦИИ

5. F1

=

 

2

,

 

 

 

1

− 4x

F2 =

 

1

 

 

,

(x + 1)

 

 

 

 

 

 

x 2 + 1

F3 = 2x x2 −1 ,

6.F1 = e x −1,

F2 = (x + 1) x 2 + 1 ,

F =

arcsin x

,

 

3

1

x

 

 

 

7.F1 = x arcsin x ,

F2

=

 

 

2x

 

 

 

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

x 2 + 1

F

=

sin

x

,

 

 

3

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

8.F1 = e x sin x ,

F2 =

 

x

 

 

 

,

 

 

 

 

 

 

x 2 + cos x

F

=

 

arcsin x

,

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

x 2

 

 

 

 

 

 

 

9. F1

=

 

 

 

2

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

x

F

=

 

e2 x

,

 

 

 

 

 

2

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

F

=

 

 

 

x

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

x 2

 

 

 

 

 

 

 

 

 

 

 

 

a1 = 2, b1 = 10;

a2 = 0, b2 = 5 ;

a3 = 1, b3 = 50 .

a1 = 0, b1 = 10 ; a2 = 2, b2 = 20 ;

a3 = 0, b3 = 0.5.

a1 = 0, b1 = 1;

a2 = 5, b2 = 15 ;

a3 = 0.1, b3 = 0.5 .

a1 = 0, b1 = 1;

a2 = 0, b2 = 0.5 ;

a3 = 0.1, b3 = 1.

a1 = 0, b1 = 10 ;

a2 = 2, b2 = 20 ;

a3 = −1, b3 = 1.

89