Delphi

Матрица - НУЖНА ПОМОЩЬ !

Короче такая задача: Даны матрицы A(n,k), B(k,m). Умножить матрицы.
Необходимо сделать тремя способами:
1. Исходные данные в TStringGrid (Для данной задачи 2 таких объекта: матрица1, матрица2 как я понял :confused: )
2. в TMemo
3. в txt файле

Я здесь прикрепил другую задачу с нужным оформлением, но нужно поменять программу, чтоб она работала как моё новое задание.

Я понимаю, задача вроде не простая, я даже не помню как в математике матрицы перемножать )

Но мож для кого покажется лёгкой и не отнимет много времени. Пожалста, помогите )

Вот, ребят написал процедуру, вроде должно работать, но нифига. Нет выводится никакой результат, в чём может быть дело ?
Имена всех объектов совпадают.

procedure TForm1.Button8Click(Sender: TObject);
var
i,j,ad:integer;
begin
for i:=0 to n-1 do
for j:=0 to n-1 do
ad:=StrToInt(StringGrid1.Cells[i,j]) * StrToInt(StringGrid2.Cells[i,j]);
StringGrid1.Cells[i,j]:=inttostr(ad);

end;

http://elib.ispu.ru/library/math/sem...i1/node44.html

Цитата:
Сообщение от POPOV
Вот, ребят написал процедуру, вроде должно работать, но нифига. Нет выводится никакой результат, в чём может быть дело ?
Имена всех объектов совпадают.

procedure TForm1.Button8Click(Sender: TObject);
var
i,j,ad:integer;
begin
for i:=0 to n-1 do
for j:=0 to n-1 do
ad:=StrToInt(StringGrid1.Cells[i,j]) * StrToInt(StringGrid2.Cells[i,j]);
StringGrid1.Cells[i,j]:=inttostr(ad);

end;
так погоди, ты получишь с такими циклами только значение одной ячейки последней, там надо так
procedure TForm1.Button8Click(Sender: TObject);
var
i,j,ad:integer;
begin
for i:=0 to n-1 do
for j:=0 to n-1 do begin
ad:=ad + (StrToInt(StringGrid1.Cells[i,j]) * StrToInt(StringGrid2.Cells[i,j]));
StringGrid1.Cells[i,j]:=inttostr(ad);
end;
end;

Так с этой фигнёй разобралсо, WooDooMan666 спасибо )
Ток вот блин матрицы то перемножаются не так просто)
ну ладно, всё равно по правильному способу не сделаю никогда
С TMemo заипался уже, вот кое-чё написал:

Код:
procedure TForm1.Button9Click(Sender: TObject); var a:array [1..10,1..10] of integer; b:array [1..10,1..10] of integer; i,j,i1,j1,k,k1,rez,l:integer; str,s,s1:string; begin str:=Memo1.text; S:=Memo2.Text; S1:=Memo4.Text; for i:=1 to strtoint(edit2.text) do begin for j:=1 to strtoint(edit2.text) do begin for i1:=1 to strtoint(edit6.Text) do begin for j1:=1 to strtoint(edit6.Text) do begin k:=pos( ,str); k1:=pos( ,S1); a[i,j]:=StrToInt(copy(str,1,k-1)); b[i1,j1]:=StrToInt(copy(S1,1,k1-1)); rez:=a[i,j] * b[i1,j1]; delete(str,1,k); delete(S1,1,k1); end; delete(str,1,2); delete(S1,1,2); end; Memo3.Clear; for i:=1 to strtoint(edit2.text) do for i1:=1 to strtoint(edit6.text) do begin S:=; for j:=1 to strtoint(edit2.text) do for j1:=1 to strtoint(edit6.text) do S:=S+inttostr(rez)+ ; memo3.Lines.Add(s); end; end; end; end; Выдаёт следующие ошибки: [Error] Unit1.pas(203): Assignment to FOR-Loop variable i [Error] Unit1.pas(207): Assignment to FOR-Loop variable j Пробовал менять переменные, бестолку. Таже фигня со способом "Загрузка матрицы из файла", вот код: procedure TForm1.Button10Click(Sender: TObject); var f,f1: TextFile; i,j,n,i1,j1,p: Integer; X,Y,Rez: Integer; S: String; begin AssignFile(f, Edit3.Text); Reset(f); AssignFile(f1, Edit7.text); Reset(f1); n := StrToInt(Edit4.Text); p := StrtoInt(Edit8.Text); Memo2.Clear; Memo5.Clear; for i := 0 to n - 1 do begin for i1 := 0 to n-1 do begin for j := 0 to n - 1 do begin for j1:=0 to n - 1 do begin S := ; Read(f, X); read(f1, Y); rez:=X * Y; // Вычисляем S := S + IntToStr(rez) + ; end; Memo2.Lines.Add(S); end; CloseFile(f); CloseFile(f1); end; end; end;
Помогите если знаете в чём дело пожалста..

Цитата:
Сообщение от POPOV
Так с этой фигнёй разобралсо, WooDooMan666 спасибо )
Ток вот блин матрицы то перемножаются не так просто)
ну ладно, всё равно по правильному способу не сделаю никогда
С TMemo заипался уже, вот кое-чё написал:

Код:
procedure TForm1.Button9Click(Sender: TObject);vara:array [1..10,1..10] of integer;b:array [1..10,1..10] of integer;i,j,i1,j1,k,k1,rez,l:integer;str,s,s1:string;beginstr:=Memo1.text;S:=Memo2.Text;S1:=Memo4.Text;for i:=1 to strtoint(edit2.text) do // скажим внешний цикл 1beginfor j:=1 to strtoint(edit2.text) do // скажим внешний цикл 2beginfor i1:=1 to strtoint(edit6.Text) do // начало внутреннего цикла 1beginfor j1:=1 to strtoint(edit6.Text) do // начало внутреннего цикла 2begink:=pos( ,str);k1:=pos( ,S1);a[i,j]:=StrToInt(copy(str,1,k-1));b[i1,j1]:=StrToInt(copy(S1,1,k1-1));rez:=a[i,j] * b[i1,j1];delete(str,1,k);delete(S1,1,k1);end; // конец внутреннего цикла 1delete(str,1,2);delete(S1,1,2);end; // начало внутреннего цикла 2Memo3.Clear;for i:=1 to strtoint(edit2.text) do // откуда индексы внешнего цикла 1 здесь имеют место быть (решение ввести еще i2)for i1:=1 to strtoint(edit6.text) do // на это не матерится, потому что предыдущий цикл с его использование уже закрытbeginS:=;for j:=1 to strtoint(edit2.text) do // та же фигня (решение ввести еще j2)for j1:=1 to strtoint(edit6.text) doS:=S+inttostr(rez)+ ;memo3.Lines.Add(s);end;end; // конец внешнего цикла 2end; // конец внешнего цикла 1end;Выдаёт следующие ошибки:[Error] Unit1.pas(203): Assignment to FOR-Loop variable i[Error] Unit1.pas(207): Assignment to FOR-Loop variable jПробовал менять переменные, бестолку.Таже фигня со способом "Загрузка матрицы из файла", вот код:procedure TForm1.Button10Click(Sender: TObject); varf,f1: TextFile; i,j,n,i1,j1,p: Integer;X,Y,Rez: Integer; S: String;beginAssignFile(f, Edit3.Text); Reset(f); AssignFile(f1, Edit7.text);Reset(f1); // эти ресеты желательно перенести в пределы первого циклаn := StrToInt(Edit4.Text); p := StrtoInt(Edit8.Text);Memo2.Clear; Memo5.Clear;for i := 0 to n - 1 do beginfor i1 := 0 to n-1 do beginfor j := 0 to n - 1 do beginfor j1:=0 to n - 1 do beginS := ;Read(f, X); read(f1, Y);rez:=X * Y; // ВычисляемS := S + IntToStr(rez) + ; end;Memo2.Lines.Add(S); end;CloseFile(f); // файл закрыл, а для следующей итерации открыть бы его надоCloseFile(f1);end;end;end;
Помогите если знаете в чём дело пожалста..

код веселый, но не суть важна, ваша ошибка уважаемый, что вы создаете кучу циклов и определяете циклы внутри циклов с одними и теми же индексами... (мутно, но см. выше в сырцах покажу, в чем причина)


во втором случае, ты после первой итерации пытаешься читать закрытый файл... А еще вопрос, зачем их столько раз переоткрывать, нельзя ли раз открыть и раз закрыть, логика не понятна

Блин, не понимаю, вы пишете решение - ввести ещё i2, и j2 для вторго такого цикла..
Так как и куда их припехнуть то ?

Цитата:
Сообщение от POPOV
Блин, не понимаю, вы пишете решение - ввести ещё i2, и j2 для вторго такого цикла..
Так как и куда их припехнуть то ?
видать ты сырцы не читал:
procedure TForm1.Button9Click(Sender: TObject);
var
a:array [1..10,1..10] of integer;
b:array [1..10,1..10] of integer;
i,j,i1,j1, i2,j2,k,k1,rez,l:integer;
str,s,s1:string;
begin
str:=Memo1.text;
S:=Memo2.Text;
S1:=Memo4.Text;
for i:=1 to strtoint(edit2.text) do
begin
for j:=1 to strtoint(edit2.text) do
begin
for i1:=1 to strtoint(edit6.Text) do
begin
for j1:=1 to strtoint(edit6.Text) do
begin
k:=pos( ,str);
k1:=pos( ,S1);
a[i,j]:=StrToInt(copy(str,1,k-1));
b[i1,j1]:=StrToInt(copy(S1,1,k1-1));
rez:=a[i,j] * b[i1,j1];
delete(str,1,k);
delete(S1,1,k1);
end;
delete(str,1,2);
delete(S1,1,2);
end;
Memo3.Clear;
for i2:=1 to strtoint(edit2.text) do //
for i1:=1 to strtoint(edit6.text) do
begin
S:=;
for j2:=1 to strtoint(edit2.text) do // вот где ругается компилер
for j1:=1 to strtoint(edit6.text) do
S:=S+inttostr(rez)+ ;
memo3.Lines.Add(s);

end;
end;
end;
end;

Выдаёт следующие ошибки:

[Error] Unit1.pas(203): Assignment to FOR-Loop variable i
[Error] Unit1.pas(207): Assignment to FOR-Loop variable j

Пробовал менять переменные, бестолку.

Таже фигня со способом "Загрузка матрицы из файла", вот код:

procedure TForm1.Button10Click(Sender: TObject);
var
f,f1: TextFile;
i,j,n,i1,j1,p: Integer;
X,Y,Rez: Integer;
S: String;
begin
AssignFile(f, Edit3.Text);
AssignFile(f1, Edit7.text);

n := StrToInt(Edit4.Text);
p := StrtoInt(Edit8.Text);
Memo2.Clear;
Memo5.Clear;
for i := 0 to n - 1 do begin
for i1 := 0 to n-1 do begin
Reset(f); // ну примерно так... хотя все равно не понимаю, зачем по много раз переоткрывать файлы
Reset(f1);

for j := 0 to n - 1 do begin
for j1:=0 to n - 1 do begin
S := ;
Read(f, X);
read(f1, Y);
rez:=X * Y; // Вычисляем
S := S + IntToStr(rez) + ;
end;
Memo2.Lines.Add(S);
end;
CloseFile(f);
CloseFile(f1);

end;
end;
end;Помогите если знаете в чём дело пожалста..

Хех, всё равно не понимаю , зачем i2 и j2. Прога выдаёт ту же ошибку, при чтении из файла выводит не тот результат, но эт ладно... Мнеб с этими Memo разобраться..

блин, ты понимаешь, что ты i и j используешь в циклах, которые находятся внутри циклов, у которых уже есть такие индексы, вот расскажи мне как могут два цикла с одинаковыми индексами работать... всегда было интересно такое узнать, а что там у тебя с файлами не догоню... и вообще зачем ты по много раз переоткрываешь файлы при считывании, я это не понимаю....

procedure TForm1.Button9Click(Sender: TObject);
var
a:array [1..10,1..10] of integer;
b:array [1..10,1..10] of integer;
i,j,i1,j1,k,k1,rez,l:integer;
str,s,s1:string;
begin
str:=Memo1.text;
S:=Memo2.Text;
S1:=Memo4.Text;
for i:=1 to strtoint(edit2.text) do // 1 первый раз использования i
begin
for j:=1 to strtoint(edit2.text) do // 1 первый раз использования j
begin
for i1:=1 to strtoint(edit6.Text) do
begin
for j1:=1 to strtoint(edit6.Text) do
begin
k:=pos( ,str);
k1:=pos( ,S1);
a[i,j]:=StrToInt(copy(str,1,k-1));
b[i1,j1]:=StrToInt(copy(S1,1,k1-1));
rez:=a[i,j] * b[i1,j1];
delete(str,1,k);
delete(S1,1,k1);
end;
delete(str,1,2);
delete(S1,1,2);
end;
Memo3.Clear;
for i:=1 to strtoint(edit2.text) do // такой уже индекс используется уже (см. выше) :confused:
for i1:=1 to strtoint(edit6.text) do
begin
S:=;
for j:=1 to strtoint(edit2.text) do // вот где ругается компилер :confused:
for j1:=1 to strtoint(edit6.text) do
S:=S+inttostr(rez)+ ;
memo3.Lines.Add(s);

end;
end;
end;
end;

Неужели не видно, где ты проганяешь?
Да я вижу, ток незнаю как исправить. Опыта программирования почти нет, эту задачу переделывал из другой задачи, в которой требовалось найти сумму положительных элементов матрицы. Я всё надеюсь, что кто-нибудь поисправляет в этом коде ошибки..
А циклы я вообще не понимаю ещё из Паскаля

так я же тебе написал, где надо приписать эти новые индексы... читай выше сырцы

Ну я ставлю i2 и j2 в место i и j в 2-х последних циклах. Запускается программа, пишу размерность первой матрицы в edit2, затем размерность второй матрицы в edit6.
После этого заполяю элементами Memo1 и Memo4, нажимаю кнопку "Вычислить" , снова вылетает ошибка ( Скрин вставил как прикреплённый файл ) и усё. Прикрепил также скрин запущенного приложения на всякий случай.

Ну это говорит о том, что где-то ты вылазишь за пределы заполнения, тем более ты просил исправить ошибки, я это сделал, дай-ка обновленные исходники, я еще разок их просмотрю, но проблему, указанную вначале я тебе, по-моему, указал, будем теперь удаленно трассировать.... о, кстати, а ты потрассируй свою функцию, сразу будет видно, где кекс проскакивает... ну а если не осилишь, давай сырцы - гляну

Ну вообщем вот текущий мой код процедуры с матрицей в TMemo:

procedure TForm1.Button9Click(Sender: TObject);
var
a:array [1..10,1..10] of integer;
b:array [1..10,1..10] of integer;
i,j,i1,j1,k,k1,rez,l,i2,j2:integer;
str,s,s1:string;
begin
str:=Memo1.text;
S:=Memo2.Text;
S1:=Memo4.Text;
for i:=1 to strtoint(edit2.text) do
begin
for j:=1 to strtoint(edit2.text) do
begin
for i1:=1 to strtoint(edit6.Text) do
begin
for j1:=1 to strtoint(edit6.Text) do
begin
k:=pos( ,str);
k1:=pos( ,S1);
a[i,j]:=StrToInt(copy(str,1,k-1));
b[i1,j1]:=StrToInt(copy(S1,1,k1-1));
rez:=a[i,j] * b[i1,j1];
delete(str,1,k);
delete(S1,1,k1);
end;
delete(str,1,2);
delete(S1,1,2);
end;
Memo3.Clear;
For i2:=1 to strtoint(edit2.text) do
for i1:=1 to strtoint(edit6.text) do
begin
S:=;
for j2:=1 to strtoint(edit2.Text) do
for j1:=1 to strtoint(edit6.text) do
S:=S+inttostr(rez)+ ;
memo3.Lines.Add(s);

end;
end;
end;
end;

Эх, чую я опять чего-то не понял...

слушай, ты пытаешься, вроде бы, пробелы между элементами в инт преобразовать (поэтому и матерится)...
я бы на твоем месте сваял процедурку для начала, которая считывает в массивы из мемов данные, а потом уже работал тупо с матрицами, текст станет попроще...

Блин, я не смогу (

Цитата:
Сообщение от WooDooMan666
слушай, ты пытаешься, вроде бы, пробелы между элементами в инт преобразовать (поэтому и матерится)...
я бы на твоем месте сваял процедурку для начала, которая считывает в массивы из мемов данные, а потом уже работал тупо с матрицами, текст станет попроще...
Блин, я не смогу (

Чёрт, в среду сдавать эту лабораторную и я уже больше недели не могу с ней справиться... Очень жестоко

просто у меня билдер стоит, делфи ставить впадлу... давай расскажу тебе алгоритм... вообщем так:
1. считываешь в tstringlist все строки до значения, введеннго пользаком...
2. потом в цикле разбираем строки: считывать тебе лучше всего посимвольно, до очередного пробела, нашел пробел - это конец элемента матрицы... конвертнул, записал...
3. и так по всем строчкам пробежался...
просто когда у тебя будут готовые матрицы для умножения, то проблем будет меньше и, кстати, циклов тоже по идее, а на счет проблем с файлами... там советую открытие и закрытие файлов делать один раз... а не как ты по куче раз ... и еще - не читай ты одновременно два файла, а напиши функцию считывания с передачей в нее имени файла, тоже легче будет.... не вноси ты сложность в сырцы, больше процедур вводи... так проще будет отлаживаться

А на билдере разве не теже объекты и методы ?
Цитата:
Сообщение от POPOV
А на билдере разве не теже объекты и методы ?
так блин, ты не можешь на делфях написать, ты думаешь переведешь с с++ сырцы
?

не, не , не смогу конечно..

из скрина с ошибкой видно что ты пытаешься перменной типа integer присвоить значение типа string (а если точнее - пустую строку)... имхо у тебя в каком-то edit-е не содежиться никакого значения и пытаешся присвоить это int-перменной

зы: дай полностью исходник твоей проги (кроме exe-шника)

Воть, прикрепил архив с моей прогой на данной стадии выполнения и со всеми файлами...
Ток там и экзешник тоже, а то вдруг не запуститься

Код:
procedure TForm1.Button9Click(Sender: TObject);vara:array [1..10,1..10] of integer;b:array [1..10,1..10] of integer;i,j,i1,j1,k,k1,rez,l,i2,j2:integer;str,s,s1:string;beginstr:=;for i:=0 to memo1.Lines.Count-1 do str := str + trim(memo1.Lines.Strings[i]) + ;S:=Memo2.Text;S1:=;for i:=0 to memo4.Lines.Count-1 do S1 := S1 + trim(memo4.Lines.Strings[i]) + ;str := trim(str); S1 := trim(S1);for i:=1 to strtoint(edit2.text) dobeginfor j:=1 to strtoint(edit2.text) dobeginfor i1:=1 to strtoint(edit6.Text) dobeginfor j1:=1 to strtoint(edit6.Text) dobegink:=pos( ,str);k1:=pos( ,S1);if k>0 then a[i,j]:=StrToInt(copy(str,1,k-1)) else a[i,j]:=StrToInt(str);if k1>0 then b[i1,j1]:=StrToInt(copy(S1,1,k1-1)) else b[i1,j1]:=StrToInt(S1);rez:=a[i,j] * b[i1,j1];delete(str,1,k);delete(S1,1,k1);end;//delete(str,1,2);//delete(S1,1,2);end;Memo3.Clear;For i2:=1 to strtoint(edit2.text) dofor i1:=1 to strtoint(edit6.text) dobeginS:=;for j2:=1 to strtoint(edit2.Text) dofor j1:=1 to strtoint(edit6.text) doS:=S+inttostr(rez)+ ;memo3.Lines.Add(s);end;end;end;end;
хммм... проблему с преобразованием в int нашел, но вот с алгоритмом умножения матриц я че-то нифига ваще непонял, помоему ты умножаешь их не так как надо (или я просто запутался...)
зы: посмотри здесь, там есть алгоритм умножения матриц на разных языках (включая delphi) и блок-схема

Ну я понимаю, что не так как надо... Но дело втом что так как надо мне не посилам тем более.

Да кстати, за решение огромное спасибо, ток один вопросик: я например перемножаю 2 матрицы 2х2, в одной все элементы = 2, в другой = 3. Почему-то в результате выводится матрица размером 4х4 со всеми шестёрками. Вот почему матрица 4х4 ?

Цитата:
Сообщение от POPOV
Вот почему матрица 4х4 ?
так будет выводить матрицу 2х2:
Код:
str := ; for i:=1 to m do str := str + trim(memo1.Lines.Strings[i-1]) + ;S1 := ; for i:=1 to k do S1 := S1 + trim(memo4.Lines.Strings[i-1]) + ;str := trim(str); S1 := trim(S1);for j:=1 to strtoint(edit2.text) do begin for i:=1 to strtoint(edit2.text) do begin t := pos( , str); if t>0 then a[i,j] := StrToInt(copy(str, 1, t-1)) else a[i,j] := StrToInt(str); delete(str, 1, t); end;end;for j:=1 to strtoint(edit6.text) do begin for i:=1 to strtoint(edit6.text) do begin t := pos( , S1); if t>0 then b[i,j] := StrToInt(copy(S1, 1, t-1)) else b[i,j] := StrToInt(S1); delete(S1, 1, t); end;end;memo3.Clear;for i:=1 to strtoint(edit2.text) do begin str := ; for j:=1 to strtoint(edit6.text) do begin c[i, j] := a[i, j] * b[j, i]; str := str + inttostr(c[i, j]) + ; end; memo3.Lines.Add( trim(str) );end;

Не, с такой процедурой прога виснет при запуске..
Я имел ввиду что что ввожу 2 матрицы размером 2 на 2, а результат выдаёт размером 4 на 4, такого же быть не может

Цитата:
Сообщение от POPOV
Не, с такой процедурой прога виснет при запуске..
Я имел ввиду что что ввожу 2 матрицы размером 2 на 2, а результат выдаёт размером 4 на 4, такого же быть не может
странно, у меня этот код работал
да кстати, насчет матрицы 4х4, я в прошлом своем посту немного ошибся и написал 4х4 вместо 2х2, у меня этот код выводил матрицу 2х2

У тебя в коде используется ещё массив c[i, j], я его объявил как и все остальные, мож по другому надо было ?

И ещё, раз у тебя запустилась, можешь сюда весь код процедуры кинуть? А то ты мож чё начале менял, а в код у тебя не сначала..

Спасибо
сорри, я там небольшую ошибку допустил, вообщем смотри в атаче

О, большое спасибо!! Работает . Короче всё наверное , остальные вопросы задавать не буду, а то всех тут запарил уже ) Всем помогавшим СПАСИБО !