关于多项式的数据结构,加法没有问题,乘法调用加法时有问题,请帮忙看一下,100分送上。 (100分)

  • 主题发起人 主题发起人 juli
  • 开始时间 开始时间
J

juli

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
//多项式ADT单元,使用数组方法
unit Polynomial_liner;
interface
type
  array1 = record                                          //存储多项式数据
    p: array[1..30] of Integer;
                           //系数
    e: array[1..30] of Integer;
                           //指数
    num: byte;
                                            //多项式项数
  end;

  Tpoly = class
    data: array1;
  public
    constructor Create;virtual;
    procedure Attach(p: Integer;
e: Integer);virtual;
     //增加数据
    procedure clear;virtual;
                              //清空
    function Empty:Boolean;
                               //判断是否为空
    procedure Add(B: Tpoly;var Result: Tpoly);
            //多项式相加
    procedure Sub(B: Tpoly;var Result: Tpoly);
            //多项式相减
    procedure Mult(B: Tpoly;var Result: Tpoly);
           //多项式相乘
    function Calc(X: Real): Real;
                         //多项式求值
    end;

implementation
constructor Tpoly.Create;
begin
  data.num:=0;
end;

procedure Tpoly.Attach(p: Integer;
e: Integer);
begin
  inc(data.num);
  data.p[data.num]:=p;
  data.e[data.num]:=e;
end;

function Tpoly.Empty: Boolean;
begin
  Result:=(data.num<1);
end;

procedure Tpoly.Add(B: TPoly;var Result: Tpoly );
//Result=self+B
var
  i,j,k:Integer;
begin
  i:=1;
  j:=1;
  while (i<=data.num) and (j<=B.data.num)do
    if data.e[i]<B.data.e[j] then
    begin
      inc(Result.data.num);
      Result.data.p[Result.data.num]:=data.p[i];
      Result.data.e[Result.data.num]:=data.e[i];
      inc(i);
    end
    else
 if data.e[i]=B.data.e[j] then
    begin
      if (data.p[i]+B.data.p[j])<>0 then
      begin
        inc(Result.data.num);
        Result.data.p[Result.data.num]:=data.p[i]+B.data.p[j];
        Result.data.e[Result.data.num]:=data.e[i];
      end;
      inc(i);
      inc(j);
    end
    else
    begin
      inc(Result.data.num);
      Result.data.p[Result.data.num]:=B.data.p[j];
      Result.data.e[Result.data.num]:=B.data.e[j];
      inc(j);
    end;
  if j<=B.data.num then
    for k:=j to B.data.numdo
    begin
      inc(Result.data.num);
      Result.data.p[Result.data.num]:=B.data.p[k];
      Result.data.e[Result.data.num]:=B.data.e[k];
    end;
  if i<=data.num then
    for k:=i to data.numdo
    begin
      inc(Result.data.num);
      Result.data.p[Result.data.num]:=data.p[k];
      Result.data.e[Result.data.num]:=data.e[k];
    end;
end;

procedure Tpoly.Sub(B: Tpoly;var Result: Tpoly);
//Result=self-B
var
  A:Tpoly;
  i:Integer;
begin
  A:=Tpoly.Create;
  for i:=1 to B.data.numdo
          //A:=-B
  begin
    A.data.p[i]:=-B.data.p[i];
    A.data.e[i]:=B.data.e[i];
    A.data.num:=B.data.num;
  end;
  Add(A,Result);
                   //Result=self-B=self+A
end;

procedure Tpoly.Mult(B: Tpoly;var Result: Tpoly);
//Result=self*B
var
  i,j,t:Integer;
  A:array[1..10] of Tpoly;
begin
  Result.Create;
  if data.num<B.data.num then
          //用短的多项式乘长的
  begin
    for i:=1 to data.numdo
    begin
      A[i]:=Tpoly.Create;
      for j:=1 to B.data.numdo
      begin
        A[i].data.p[j]:=data.p[i]*B.data.p[j];
        A[i].data.e[j]:=data.e[i]+B.data.e[j];
      end;
      A[i].data.num:=B.data.num;
    end;
    t:=data.num;
  end
  else
  begin
    for i:=1 to B.data.numdo
    begin
      A[i]:=Tpoly.Create;
      for j:=1 to data.numdo
      begin
        A[i].data.p[j]:=B.data.p[i]*data.p[j];
        A[i].data.e[j]:=B.data.e[i]+data.e[j];
      end;
      A[i].data.num:=data.num;
    end;
    t:=B.data.num;
  end;

  for i:=1 to tdo
                  //问题出在这里,但是我不知道怎么解决
    Result.Add(A[i],Result);
 
end;

function Tpoly.Calc(X: Real): Real;
var
  i:Integer;
begin
  Result:=0;
  for i:=1 to data.numdo
    Result:=Result+data.p[i]*Exp(data.e[i]*Ln(X));
end;

procedure Tpoly.clear;
begin
  data.num:=0;
end;

end.
 
if DataNum>10 then
error.
因为你定义的A[1..10],
可以适当的改大一点,运行正确是运气,
因为你搭建的程序太危险了,缺乏面向对象编程的风格。
首先没有限定data.num的范围,一旦>30程序就会崩溃,
其次Self*B项数不确定,需要用链表示实现。详细内容在看一下数据结构。
 
首先感谢你的答复。
我的程序只是做的作业,所以没有考虑许多的因素,很容易看得出来,这个我自己也知道。
因为只是作业嘛,并不需要那么完善。
其次你没有理解乘法中A数组的含义,它的项数等于两个相乘多项式中项数小的项的项数,
所以对一般乘法来讲,是不会有两个10项以上的式子相乘的,即使是,那p、e也会越界的。
而且用链表做我当然会,只是要求是用数组的。
我的程序毛病其实在于加法中自身相加,导致的乘法不对,只是我想知道怎么解决这个问题。
所以抱歉不能给你积分。
 
我已经自己解决了,不需要再回复。
 
这种问题本来就是应该自己搞定的。
会者不难,难者不会——遇到自己不会的问题,完全可以上来问一问,大家帮你出主意。
可是这个问题的解决方法——调试程序——你都“不会”吗??——懒虫!!!
一上来就贴出一堆代码,你把大富翁当成什么地方了?——义务源代码调试论坛吗???
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
630
import
I
后退
顶部