умножение двумерных массивов

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

29 сен 2014, 11:15

здравствуйте, вводятся 2 матрицы в memo1 и memo2. Размерность задается с помощью SpinEdit. Мне нужно перемножить 2 матрицы одинаковой размерности, вообщем я ввожу матрицы в мемо1 и мемо 2 но результат в мемо3 выходит нулевая матрица.
вот код этого участка: (кидаю код только отдельной кнопки, так как код очень большой)

Код: Выделить всё

procedure TForm2.Button3Click(Sender: TObject);
var
   k,i,j:integer;
   temp:string;
begin

   Form3.Memo1.Clear;
   for i:=1 to rowcount do
   for j:=1 to colcount do
   begin
   s[i,j]:=0;
   for k:=1 to colcount do
   begin

      s[i,j] := s[i,j] + r[i,k]*q[k,j];
      temp:=temp+floattostr(s[i,j])+ ' ';
          end;
      Form3.Label1.Visible:=true;
      Form3.Label1.Caption:='A*B';
      form3.Show;
      Form3.Memo1.Lines.Add(temp);
      temp:= ' ';

       end;
помогите разобратся почему выводится нулевая матрица. скриншоты приложил
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

29 сен 2014, 12:06

Нужен код по кнопке целиком, описание переменных глобального модуля и процедура (функция) преобразования текстового представления матрицы в ее двоичный вид.
Если все это долго и лень - то убедите нас в том, что в r и q мы не имеем нулей с помощью дебага. Иначе нет смысла искать ошибку в коде, если имеем ошибку в данных.
It's a long way to the top if you wanna rock'n'roll
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

29 сен 2014, 18:02

не могу вложить проэкт на сайт, пишет некоректный файл .rar
вот код смотрите полностью
хорошо вот например не умножение матриці, а просто суммирование матриц, так и тут выводит 0 матрицу :(

Код: Выделить всё

unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Button3: TButton;
    Button4: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
        function getsubstr(st:string;n:integer):string;
        function getline(st:string;n:integer):string;


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses
    unit1,unit3;

    const N=10;
    M=10;
    var
        s,r,q:array[1..N,1..M] of real;

{$R *.dfm}



procedure TForm2.Button3Click(Sender: TObject);
var
   i,j:integer;
   temp:string;
begin

  for i:=1 to rowcount do
begin
temp:='';
for j:=1 to colcount do
begin
s[i,j]:=r[i,j]+q[i,j];
temp:=temp+floattostr(s[i,j]) + ' ';
end;
Form3.Show;
Form3.Memo1.Lines.Add(temp);
end;




end;

procedure TForm2.Button1Click(Sender: TObject);
var
    i,j:integer;
    buf,st:string;

begin

 i:=1;
 repeat
 st:=getline(memo1.Text,i);
 If length(st) <> 0 then
 begin
  j:=1;
  repeat buf:=getsubstr(st,j);
  If length(buf) <> 0 then
  try r[i,j]:=strtofloat(buf)
  except on EConvertError do
  begin
  showmessage('ïîòð³áíî ââåñòè ÷èñëî');
  memo1.SetFocus;
  exit;
  end
  end
  else
  begin
  showmessage('ïîòð³áíî ââåñòè' + inttostr(colcount)+'ñòîâïö³â');
  memo1.SetFocus;
  exit;
  end;
  j:=j+1;
  until (j>colcount) or (length(buf)=0)
  end
  else
  begin
   showmessage('ïîòð³áíî ââåñòè ' + inttostr(rowcount) + 'ryadkiv');
memo1.setfocus;
exit;
end;
i:=i+1;
until(i>rowcount) or (length(st)=0);



end;



procedure TForm2.N1Click(Sender: TObject);
begin
Form1.Show;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
    i,j:integer;
    buf,st:string;
begin

 i:=1;
 repeat
 st:=getline(memo2.Text,i);
 If length(st) <> 0 then

 begin

  j:=1;
  repeat buf:=getsubstr(st,j);
  If length(buf) <> 0 then
  try q[i,j]:=strtofloat(buf)
  except on EConvertError do
  begin
  showmessage('ïîòð³áíî ââåñòè ÷èñëî');
  memo2.SetFocus;
  exit;
  end
  end
  else
  begin
  showmessage('ïîòð³áíî ââåñòè' + inttostr(colcount)+'ñòîâïö³â');
  memo2.SetFocus;
  exit;
  end;
  j:=j+1;
  until (j>colcount) or (length(buf)=0)
  end
  else
  begin
   showmessage('ïîòð³áíî ââåñòè ' + inttostr(rowcount) + 'ryadkiv');
memo2.setfocus;
exit;
end;
i:=i+1;
until(i>rowcount) or (length(st)=0);
end;

function TForm2.getsubstr(st: string; n: integer): string;
 var
    p:integer;
    begin
    while (pos('',st)=1) do delete (st,1,1);
    If n>1 then
    repeat
    p:=pos('',st);
    If p<>0 then
    begin
    st:=copy(st,p+1,length(st)-p);
    while (pos('',st)=1) do delete(st,1,1);
    n:=n-1;
    end;
    until (n=1) or (p=0);
    If (n>1) then
    result:=''
    else
    begin
    p:=pos('',st);
    if p <> 0 then
    result:=copy(st,1,p-1)
    else
    result:=st;
    end;

end;

function TForm2.getline(st: string; n: integer): string;
var
    p:integer;
begin

while (pos('',st)=1) do delete (st,1,1);
if n>1 then
repeat p:=pos(#13,st);
if p<>0 then
begin
st:=copy(st,p+2,length(st)-p);
while(pos('',st)=1) do delete(st,1,1);
n:=n-1;
end;
until (n=1) or (p=0);
If n>1 then
result:=''
else
begin
p:=pos(#13,st);
if p<>0 then
result:=copy(st,1,p-1)
else
 result:=st;
 end;



end;

end. 
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 сен 2014, 13:04

Посмотрел бегло код. Не понятен код:

Код: Выделить всё

p:=pos('',st);
if p <> 0 then
Вы реально думаете, что Р будет не равно нулю? И какой смысл искать позицию пустой строки?
colcount и rowcount - они где заданы?
Какой то очень неструктурированый код, если честно...
Есть небезосновательное предположение, что getline и getsubstr отрабатывает не правильно, поэтому Button1Click заполняет r и q - нулями.
Могу предложить вручную заполнить R и Q, а потом вызвать Button3Click.

Подсказка 1: у Memo есть свойство Lines (TStrings), которое позволяет получить любую строку по ее номеру. Процедура getline совершенно не нужна
Подсказка 2: Для разбиения строки на слова по разделителю "пробел" можно использовать хитрый метод:
* обрезать строку от пробелов (Trim)
* заменить все двойные пробелы на одинарные (StringReplace)
* заменить все пробелы на #13#10 (StringReplace)
* создать TStringList и присвоить свойству Text эту строку
...
* PROFIT! можно получить любой текстовый параметр по его индексу в TStringList

Подсказка 3: произвести реструктуризацию, оформить преобразование TStrings в матрицу с помощью функции
It's a long way to the top if you wanna rock'n'roll
Ответить