Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

UM(n,A,B,C);

For i:=1 to n do // Запоминание текущего результата умножения матриц

For j:=1 to n do B[i,j]:=C[i,j]; End;

For i:=1 to n do // Вывод результатов вычислений

For j:=1 to n do StringGrid2.Cells[j-1,i-1]:=FloattoStrF(C[i,j], ffGeneral, 10,5); End;

Процедуры и функции, которые прямо или косвенно вызывают сами себя, называют рекурсивными.

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

Function F(n:Integer):Extended; Begin

If n>1 then F:=F(n-1)*n else F:=1; End;

Расчет большинства полиномов осуществляется по рекуррентным формулам, когда каждый последующий полином рассчитывается через предыдущие полиномы. Например, B0=1, B1=X, Bk=2 X Bk-1-Bk-2. Для расчета таких полиномов можно тоже использовать рекурсивную функцию вида:

Function B(n:Integer; x:Extended):Extended; Begin

If n>1 then B:=2*X*B(n-1,x)-B(n-2,x) else If n=1 then B:=x else B:=1;

End;

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

12. МОДУЛЬ UNIT

Модуль Unit является отдельной программной единицей – он описывается в отдельном текстовом файле с расширением *.pas и транслируется отдельно. Результатом трансляции является машинный код, который записывается в файл с расширением *.dcu. Структура модуля Unit может иметь следующий вид:

Unit Имя модуля;

Interface

// Интерфейсная часть модуля

Uses

// Имена подключаемых модулей

//Объявления глобальных типов, констант, переменных,

//заголовков процедур и функций, которые будут доступны в других

//модулях, подключивших данный модуль

……………….

 

 

Implementation

// Секция реализации модуля

Uses

// Имена подключаемых модулей

53

//Здесь могут определяться внутренние константы, типы, переменные,

//процедуры и функции, которые будут доступны только внутри

//данного модуля. Здесь же дается реализация всех процедур и функций,

//объявленных в интерфейсной секции модуля

………………...

Initialization // Секция инициализации модуля

//В этой секции записываются операторы, которые будут выполнены

//сразу после загрузки программы в память ЭВМ. Секции инициализации

//будут выполняться в том порядке, в каком модули Unit описаны

//в основной программе в операторе Uses

//Секция инициализации может отсутствовать в модуле Unit

Finalization // Секция завершения

//Эта секция может присутствовать в модуле Unit, только если в нем есть

//секция инициализации

//Выполнение операторов этой секции происходит после окончания работы

//программы перед выгрузкой ее из оперативной памяти ЭВМ

//Эти секции выполняются в обратном порядке по сравнению с порядком

//выполнения секций инициализации

End.

// Конец модуля Unit

Все

объявления, сделанные в интерфейсной секции, являются

глобальными для программ, использующих данный модуль. Подключение модулей к другим модулям осуществляется оператором Uses со списком подключаемых модулей. Если в интерфейсных секциях модулей есть определения с одинаковым именем, то воспринимается определение того модуля, который находится в конце списке модулей в операторе Uses.

Определения, данные в секции Implementation, имеют силу только внутри данного модуля Unit.

Рассмотрим пример написания модуля Unit для работы с комплексными числами. Любое комплексное число имеет реальную и мнимую части,

например: a = are + j aim , где are

– реальная часть комплексного числа, aim

мнимая часть комплексного числа, а j =

1 – мнимая единица.

Сложение двух

комплексных

чисел

осуществляется по формуле

c = a +b = (a

re

+b

)+ j

im

(a

im

+b )= c

re

+ jc

im

.

 

re

 

 

im

 

 

 

 

Умножение комплексных чисел определяется формулой

c = a b = (are bre aim bim )+ j(are bim +aim bre )= cre + jcim .

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

Unit Complex;

// Начало модуля Complex

Interface

// Интерфейсная секция модуля

Type TComp=Record

// Объявление типа комплексного числа

Re,Im:Extended;

End;

Const JC:TComp=(re:0.0;im:-1.0); // Мнимая единица

54

//Функция сложения комплексных чисел

Function AddC(a,b:TComp):TComp;

//Функция умножения комплексных чисел

Function MulC(a,b,:TComp):TComp;

Implementation // Секция реализации модуля

Function AddC(a,b:TComp):TComp; Begin

AddC.re:=a.re+b.re;

AddC.im:=a.im+b.im;

End;

Function MulC(a,b:TComp):TCOmp; Begin

MulC.re:=a.re*b.re-a.im*b.im;

MulC.im:=a.re*b.im+a.im*b.re;

End;

End. // Конец модуля Unit

В модуле формы мы должны в конце списка модулей в операторе Uses добавить имя модуля Complex. Пусть начальные значения для комплексных

чисел a и b будут определяться в компонентах TEdit, а результат вычисления

выражения c = (a +b) a поместим в компонент Memo1. Тогда начало модуля формы Form1 и обработчик события «Вычислить» будут иметь вид

Unit Unit1;

Uses …….., Complex;

………………………

Procedure Button1Click(Sender:Tobject); Var a,b,c:TComp;

Begin a.re:=StrtoFloat(Edit1.text); a.im:=StrtoFloat(Edit2.text); b.re:=StrtoFloat(Edit3.text); b.im:=StrtoFloat(Edit4.text);

//Вычисление заданного комплексного выражения c:=MulC(AddC(a,b),a);

//Вывод результата

Memo1.Lines.Add(’c.re=’+FloattoStr(c.re)+’ c.im=’+FloattoStr(c.im)); End;

13. РАБОТА СО МНОЖЕСТВАМИ

Множество представляет собой набор однотипных элементов, при этом ни один элемент множества не может входить в него дважды и порядок расположения элементов в множестве не имеет никакого значения. В Delphi размер множества не может превышать 256 значений, т.е. множество занимает в памяти компьютера всего 256/8=32 байта.

55

Множество определяется ключевым словом Set, за которым определяется тип элементов множества. Например, в разделе типов можно записать:

Type TLatChar=Set of ’A’..’z’;

// Множество латинских букв

TSimv=Set of Char;

// Множество любых символов

TColor=Set of (Red,Blue,Green,White,Black);

// Множество цветов перечисляемого типа Теперь можно определить сами множества и проделать некоторые

операции над ними:

Var L1,L2:TLatChar;

S1,S2:TSimv;

C1,C2:TColor;

Begin

 

L1:=[’A’,’B’,’C’];

// Множество из трех латинских букв

L2:=[’a’..’z’];

// Множество строчных латинских букв

S1:=[’z’,’ф’];

// Множество из двух символов

S2:=[];

// Пустое множество

C1:=[Red];

// Множество из одного значения Red

C2:=[Green];

// Множество из одного значения Green

C2:=C1+C2;

// Множество уже из двух значений

Над множествами

можно выполнять операции сложения «+»

(объединения множеств), вычитания «-» (исключения из множества), умножения множеств «*» (пересечение множеств) и вхождения во множество «in». Кроме этого, можно использовать процедуры:

Include(S,i) – добавление элемента i во множество S, Exclude(S,i) – исключение элемента i из множества S.

Над множествами можно выполнять операции сравнения, например: S1=S2 будет равно True, если множества одинаковы;

S1<>S2 будет равно True, если множества различаются хоть немного; S1>=S2 будет равно True, если S2 является подмножеством S1;

’z’ in S1 будет равно True, если элемент ’z’ принадлежит S1. Рассмотрим пример работы со множествами. Допустим, что на форме

находится компонент Memo1 и нам нужно, чтобы при нажатии на клавиатуре клавиши с латинскими буквами звучал сигнал одной частоты, с русскими буквами – другой частоты и с цифрами – третьей частоты. Для этого объявим глобальный тип множества символов и переменные этого типа в интерфейсной секции модуля Unit так:

Type Tc=Set of Char;

 

Var CL,CR,C0:Tc;

 

В обработчике события создания

формы определим множества

латинских, русских и цифровых символов следующим образом:

Procedure Tform1.FormCreate(Sender:TObject); Begin

CL:=[’A’..’z’];

CR:=[’А’..’я’]; С0:=[’0’ ‘9’];

56