ВУЗ:
Составители:
Рубрика:
63
деле мы ни в коем случае не должны применять данные алгоритмы к
матрицам , элементы которых действительно имеют тип Number, по-
скольку для записей такого типа указатели Plus, Add и Dot не определ е-
ны . Вместо этого следует использовать структуры , содержащие адреса
конкретных подпрограмм.
Но для того, чтобы данные адреса обрабатывались корректно, они
должны находится на тех же местах, что и в записях типа Number. Более
точно это означает, что каждая замещающая структура обязана включать
все поля типа Number, и располагаться они должны в той же последов а -
тельности и с теми же смещениями относительно начала объекта.
С учетом сказанного выше определим тип для хранения рацио-
нальных чисел :
Rational = packed record
TypeNameIs: function(TypeName: String): Boolean;
Destroy: procedure(var n: PNumber);
Plus: function(n1: PNumber; n2: PNumber): PNumber;
Minus: function(n1: PNumber; n2: PNumber): PNumber;
Dot: function(n1: PNumber; n2: PNumber): PNumber;
Slash: function(n1: PNumber; n2: PNumber): PNumber;
Add: procedure(var n1: PNumber; n2: PNumber);
Subtract: procedure(var n1: PNumber; n2: PNumber);
MultiplyBy: procedure(var n1: PNumber; n2: PNumber);
DivideBy: procedure(var n1: PNumber; n2: PNumber);
Normalize: procedure(var r: PRational);
Reduce: procedure(var r: PRational);
num: Integer;
den: Integer;
end;
Его начало полностью повторяет структуру типа Number. К уна-
следованным полям добавляется два указателя на процедуры нормал и-
зации и с окращения и два обычных поля для числителя и знаменателя. В
объявлениях новых полей фигурирует тип PRational, определяемый ана-
логично PNumber:
type PRational = ^Rational;
Для приведенной структуры можно реализовать уже все опера-
ции, что мы и сдел аем .
Пример 4.2. Определение методов типа Rational.
procedure Normalize(var r: PRational);
begin
д ел е м ы ни в коем с л учае не д ол жны прим енят ь д анны е ал горит м ы к м ат рицам , эл ем ент ы которы х д ейс т в ит ел ь но им еют т ип Number, по- с кол ь ку д л я з апис ей т акогот ипа указ ат ел и Plus, Add и Dot не опред ел е- ны . Вм ес то э того с л ед ует ис пол ь з ов ат ь с т рукт уры , с од ержащие ад рес а конкрет ны хпод програм м . Н од л я того, чтобы д анны е ад рес а обрабат ы в ал ис ь коррект но, они д ол жны наход ит с я на т ехже м ес т ах, чтои в з апис яхт ипа Number. Б ол ее точноэ тооз начает, чтокажд ая з ам ещающая с т рукт ура обяз ана в кл ючат ь в с е пол я т ипа Number, и рас пол агат ь с я они д ол жны в той же пос л ед ов а- т ел ь нос т и и с т ем и же с м ещениям и от нос ит ел ь ноначал а объект а. С учетом с каз анного в ы ш е опред ел им т ип д л я хранения рацио- нал ь ны хчис ел : Rational = packed record TypeNameIs: function(TypeName: String): Boolean; Destroy: procedure(var n: PNumber); Plus: function(n1: PNumber; n2: PNumber): PNumber; Minus: function(n1: PNumber; n2: PNumber): PNumber; Dot: function(n1: PNumber; n2: PNumber): PNumber; Slash: function(n1: PNumber; n2: PNumber): PNumber; Add: procedure(var n1: PNumber; n2: PNumber); Subtract: procedure(var n1: PNumber; n2: PNumber); MultiplyBy: procedure(var n1: PNumber; n2: PNumber); DivideBy: procedure(var n1: PNumber; n2: PNumber); Normalize: procedure(var r: PRational); Reduce: procedure(var r: PRational); num: Integer; den: Integer; end; Е го начал о пол нос т ь ю пов т оряет с т рукт уру т ипа Number. К уна- с л ед ов анны м пол ям д обав л яет с я д в а указ ат ел я на процед уры норм ал и- з ации и с окращения и д в а обы чны хпол я д л я чис л ит ел я и з нам енат ел я. В объяв л енияхнов ы хпол ей фигурирует т ип PRational, опред ел яем ы й ана- л огичноPNumber: type PRational = ^Rational; Дл я прив ед енной с т рукт уры м ожно реал из ов ат ь уже в с е опера- ции, чтом ы и с д ел аем . Пример 4.2. Опред ел ение м етод ов т ипа Rational. procedure Normalize(var r: PRational); begin 63
Страницы
- « первая
- ‹ предыдущая
- …
- 61
- 62
- 63
- 64
- 65
- …
- следующая ›
- последняя »