Mam mały problem z przepisaniem kodu z c++ na delphi. Znalazłem na necie taki kod: http://www-users.mat.uni.torun.pl/~lciesla/_private/algorytmy/omm.htm
i przepisałem go na:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Label1: TLabel;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
procedure drukuj(pocz:integer;kon:integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a:array[0..100,0..100] of integer;
implementation
{$R *.dfm}
procedure TForm1.drukuj(pocz:integer;kon:integer);
begin
if pocz=kon then
begin
edit1.Text:=edit1.Text+'M['+inttostr(pocz+1)+']';
end
else
begin
edit1.Text:=edit1.Text+'(';
drukuj(pocz,pocz+a[kon][pocz]);
edit1.Text:=edit1.Text+')*(';
drukuj(pocz+a[kon][pocz]+1,kon);
edit1.Text:=edit1.Text+')';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,l,n,r:integer;
w:array[0..100] of integer;
k:array[0..100] of integer;
begin
edit1.Text:='';
n:=8;
w[0]:=2;
k[0]:=4;
w[1]:=4;
k[1]:=8;
w[2]:=8;
k[2]:=2;
w[3]:=2;
k[3]:=3;
w[4]:=3;
k[4]:=5;
w[5]:=5;
k[5]:=4;
w[6]:=4;
k[6]:=6;
w[7]:=6;
k[7]:=8;
for i:=0 to n-1 do
a[i][i]:=0;
for i:=1 to n-1 do
begin
for j:=0 to n-i-1 do
begin
a[j][i+j]:=-1;
for l:=0 to i-1 do
begin
r:=a[j][j+l]+a[j+l+1][i+j]+w[j]*k[j+l]*k[i+j];
if (r < a[j][i+j])=false then
begin
a[j][i+j]:=r;
a[i+j][j]:=l;
end;
end;
end;
end;
label3.Caption:='Ilość operacji: '+inttostr(a[0][n-1]);
drukuj(0,n-1);
end;
end.
k to ilość kolumn a w to ilość wierszy. Do testów użyłem ciagu ośmiu macierzy. Oba kody które wydają mi się takie same w działaniu wyliczją inne nawiasowanie i ilość operacji. Co tu może być nie tak?
Kod w c++ daje
operacji: 306
((((((M[1])((M[2])(M[3])))(M[4]))(M[5]))(M[6]))(M[7]))*(M[8])
a w delphi:
operacji: 1232
(M[1])((M[2])(((((M[3])(M[4]))(M[5]))((M[6])(M[7])))*(M[8])))