ВУЗ:
Составители:
Рубрика:
29
Исправления следует внести в часть кода, где производятся оп е -
рации с переменной r . Перед первым использованием она должна быть
создана путем вызова конструктора, после чего значения числителя и
знаменателя можно будет установить, вызывая методы SetNum/SetDen.
Кроме того, строка
WriteLn('v2.ScalarProduct(v4): ', AsString(v2.ScalarProduct(v4)));
должна быть заменена на
p:=v2.ScalarProduct(v4);
WriteLn('v2.ScalarProduct(v4): '+p.AsString);
p.Destroy;
где p — вспомогательная переменная типа Rational. Вариант без введ е-
ния этой переменной :
WriteLn('v2.ScalarProduct(v4): '+v2.ScalarProduct(v4).AsString);
успешно компилируется и работает, но приводит к утечке памяти, так
как объект, созданный методом ScalarProduct, нигде не удаляется.
Итак, демонстрационная программа выглядит следующим обр а зом .
Пример 2.3.2. Демонстрационная программа для задачи 2.3.
program TestRVector;
{$APPTYPE CONSOLE}
uses UnitRVector in 'UnitRVector.pas',
UnitRational in 'UnitRational.pas';
var v1, v2, v3, v4: RVector; r, p: Rational; i: Integer;
begin
v1:=RVector.Create; v2:=RVector.Create; r:=Rational.Create;
for i:=1 to Dim do begin
r.SetNum(i); r.SetDen(i+1); v1.SetComp(i, r);
r.SetNum(i+1); r.SetDen(i+2); v2.SetComp(i, r);
end;
WriteLn('v1: '+v1.AsString);
WriteLn('v2: '+v2.AsString);
WriteLn('v1.GetLength: ', v1.GetLength:5:5);
v3:=v1.Plus(v2); WriteLn('v3 after v3:=v1.Plus(v2): '+v3.AsString);
v1.Add(v2); WriteLn('v1 after v1.Add(v2): '+v1.AsString);
if v1.IsEqual(v3)
then WriteLn('v1 is equal to v3')
else WriteLn('v1 is not equal to v3');
v4:=RVector.Create;
v4.Assign(v2); WriteLn('v4 after v4.Assign(v2): '+v4.AsString);
v4.Subtract(v1);
WriteLn('v2 after v4.Subtract(v1): '+v2.AsString);
И с прав л ения с л ед ует в нес т и в час т ь код а, гд е произ в од ят с я опе-
рац ии с перем енной r. Перед перв ы м ис пол ь з ов анием она д ол жна бы т ь
с оз д ана пут ем в ы з ов а конс т руктора, пос л е чего з начения чис л ит ел я и
з нам енат ел я м ожнобуд ет ус т анов ит ь , в ы з ы в ая м етод ы SetNum/SetDen.
Кром е того, с т рока
WriteLn('v2.ScalarProduct(v4): ', AsString(v2.ScalarProduct(v4)));
д ол жна бы т ь з ам енена на
p:=v2.ScalarProduct(v4);
WriteLn('v2.ScalarProduct(v4): '+p.AsString);
p.Destroy;
гд е p — в с пом огат ел ь ная перем енная т ипа Rational. Вариант без в в ед е-
ния этой перем енной:
WriteLn('v2.ScalarProduct(v4): '+v2.ScalarProduct(v4).AsString);
ус пешно ком пил ирует с я и работ ает, но прив од ит к ут ечке пам ят и, т ак
как объект, с оз д анны й м етод ом ScalarProduct, нигд е не уд ал яет с я.
И т ак, д ем онс т рац ионная програм м а в ы гл яд ит с л ед ующ им образ ом .
Пример2.3.2. Дем онс т рац ионная програм м а д л я з ад ачи 2.3.
program TestRVector;
{$APPTYPE CONSOLE}
uses UnitRVector in 'UnitRVector.pas',
UnitRational in 'UnitRational.pas';
var v1, v2, v3, v4: RVector; r, p: Rational; i: Integer;
begin
v1:=RVector.Create; v2:=RVector.Create; r:=Rational.Create;
for i:=1 to Dim do begin
r.SetNum(i); r.SetDen(i+1); v1.SetComp(i, r);
r.SetNum(i+1); r.SetDen(i+2); v2.SetComp(i, r);
end;
WriteLn('v1: '+v1.AsString);
WriteLn('v2: '+v2.AsString);
WriteLn('v1.GetLength: ', v1.GetLength:5:5);
v3:=v1.Plus(v2); WriteLn('v3 after v3:=v1.Plus(v2): '+v3.AsString);
v1.Add(v2); WriteLn('v1 after v1.Add(v2): '+v1.AsString);
if v1.IsEqual(v3)
then WriteLn('v1 is equal to v3')
else WriteLn('v1 is not equal to v3');
v4:=RVector.Create;
v4.Assign(v2); WriteLn('v4 after v4.Assign(v2): '+v4.AsString);
v4.Subtract(v1);
WriteLn('v2 after v4.Subtract(v1): '+v2.AsString);
29
Страницы
- « первая
- ‹ предыдущая
- …
- 27
- 28
- 29
- 30
- 31
- …
- следующая ›
- последняя »
