Podgląd pojedynczego posta
Stary 19.03.2006, 02:29   #3
Ziele
.: AT90S2313 :.
 
Avatar użytkownika Ziele
 
Data rejestracji: 09.09.2002
Lokalizacja: Kraków
Posty: 2,724
Ziele zaczyna zdobywać reputację <1 - 49 pkt>
To teraz ja mam mały problem z algorytmami ;) Mam zrobić optymalne mnożenie macierzy. Znalazłem takie kod w c++: http://www-users.mat.uni.torun.pl/~l...orytmy/omm.htm i próbuję go przepisać pod delphi ale coś mi to nie wychodzi. Wydaje mi się że algorytm jest ten sam a mimo to nie działa.

Kod:
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])))
__________________
LiteOn LTR-40125S & SOHW-1633S 8 )

Jak zrobić szybko sałatke z buraków? Wrzucić granata do BMW
Ziele jest offline   Odpowiedz cytując ten post