Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 12:18   #1
Manik
Пользователь
 
Аватар для Manik
 
Регистрация: 08.12.2009
Сообщений: 24
По умолчанию Delphi. Умножение матриц.

С матрицами беда.

Ниже кусок кода, который умеет умножать квардратные матрицы, но вылетает на остальных.

Не могу понять ,почему не считает ...
Помогите, если сможете,пожалуйста!

Код:
var i,j,k,s,s1:integer;
arr1,arr2,arr3:array of array of integer;

...

Setlength(arr1,m1,n1);
Setlength(arr2,m2,n2);
Setlength(arr3,m1,n2);

.....


k:=0;
for i:= 0 to m1-1 do
 for j:= 0 to n2-1 do begin
   s:=0;s1:=1;
    for k:=0 to m2-1 do begin
     s1:=arr2[i,k]*arr1[k,j];
     s:=s+s1;
   end;
  arr3[i,j]:=s;

Заранее спасибо)
я вырасту большим и умным)
Manik вне форума Ответить с цитированием
Старый 09.12.2009, 13:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А вылетать он может потому что arr2 и arr1 несовместимы по координатам.
Вообще поставить условие можно:
Код:
 if (k<length(arr2[i]))and(k<Length(arr1)) then
  s1:=arr2[i,k]*arr1[k,j] 
 else 
  s1:=0;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2009, 13:15   #3
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Код:
const
  N = 10;
  M = 20;

type Matrix = Array[1..N, 1..M] of Integer;

function Min(A, B: Integer): Integer;
begin
  if A < B then Min := A else Min := B;
end;

var
  I, J, K: Integer;
  A, B, C: Matrix;
begin
  {...............................}
  for I := 1 to N do
    for J := 1 to M do
    begin
      C[I, J] := 0;
      for K := 1 to Min(N, M) do
         C[I, J] := C[I, J] + A[I, K] * B[K, J];
    end;
  { С есть произведение A на B }
end.
Alex_FF вне форума Ответить с цитированием
Старый 10.12.2009, 11:47   #4
Manik
Пользователь
 
Аватар для Manik
 
Регистрация: 08.12.2009
Сообщений: 24
По умолчанию

Спасибо за ответы!
только вот лыжи всё не едут...

Stilet, то ли не так вставила, то ещё что, но не помогло.

Алекс, полный код программы ниже.
Не могу понять, что я сделала не так, но считать она считает,но считает неправильно...
да, и всё же мне нужны динамические массивы...
но это я наверное сама...как только заработает)


Код:
const
  N = 10;
  M = 20;

type Matrix = Array[1..N, 1..M] of Integer;

function Min(A, B: Integer): Integer;
begin
  if A < B then Min := A else Min := B;
end;

var
  I, J, K,m1,n1,m2,n2: Integer;
  A, B, C: Matrix;

begin
  write(rus('Введите размерность матрицы --> ')); readln(m1,n1);
  write(rus('Введите '), n1*m1,(rus(' элементов матрицы 1 --> ')));
   for i :=1 to m1 do
    for j :=1 to n1 do
     read ( a [ i , j ]);
  writeln(rus('Вы ввели матрицу: '));
   for i :=1 to m1 do
    begin
     for j :=1 to n1 do
      write ( a [ i , j ]:4);
      writeln
    end;
     write(rus('Введите размерность матрицы --> ')); readln(m2,n2);
  write(rus('Введите '), n2*m2,(rus(' элементов матрицы 2 --> ')));
  for i :=1 to m2 do
    for j :=1 to n2 do
     read ( b [ i , j ]);
  writeln(rus('Вы ввели матрицу: '));
   for i :=1 to m2 do
    begin
     for j :=1 to n2 do
      write ( b [ i , j ]:4);
      writeln
    end;

   for I := 1 to m1 do
    for J := 1 to n2 do
    begin
      C[I, J] := 0;
      for K := 1 to Min(m1, n2) do
         C[I, J] := C[I, J] + A[I, K] * B[K, J];
    end;
  { С есть произведение A на B }

  writeln(rus('Получилось : '));
   writeln;
   for i :=1 to m1 do
    begin
     for j :=1 to n2 do
      write ( c [ i , j ]:4);
      writeln
      end;
 readln;
 readln
end.
помогите, пожалуйста..
я вырасту большим и умным)

Последний раз редактировалось Manik; 10.12.2009 в 11:50.
Manik вне форума Ответить с цитированием
Старый 10.12.2009, 11:51   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну и чо такое rus?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2009, 12:55   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну и чо такое rus?
Скорее всего функция переводящая из win кодировки в dos.

Если я правильно помню то должно
n1 = m2
Код:
var i,j,k,s,s1:integer;
arr1,arr2,arr3:array of array of integer;

...

Setlength(arr1,m1,n1);
Setlength(arr2,n1,n2);
Setlength(arr3,m1,n2);

.....


k:=0;
for i:= 0 to m1-1 do
 for j:= 0 to n2-1 do begin
   s:=0;s1:=1;
    for k:=0 to n1-1 do begin
     s1:=arr1[i,k]*arr2[k,j];
     s:=s+s1;
   end;
  arr3[i,j]:=s;
  end;

Последний раз редактировалось Stilet; 10.12.2009 в 13:17.
s.Creator вне форума Ответить с цитированием
Старый 10.12.2009, 13:17   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Скорее всего функция переводящая из win кодировки в dos.
Да в другой теме е уже выложили.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2009, 16:00   #8
Manik
Пользователь
 
Аватар для Manik
 
Регистрация: 08.12.2009
Сообщений: 24
По умолчанию

Спасибо за ответы!

кусок кода про rus забыла, изивините)
но все всё правильно поняли)

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

*снова код:
(проверка n1=m2) есть ...

**разъясняю что это такое перед собственно программой умножения:
это я так считываю то, что ввели StringGrid, то, что не ввели заменяю нулями и всё это вывожу.
***по этой схеме тоже есть вопросы, но это уже потом....

m1,n1,m2,n2-глобальные переменные.

Код:
procedure TForm1.Button8Click(Sender: TObject);  //*
var i,j,k,s,s1:integer;
arr1,arr2,arr3:array of array of integer;

begin
Setlength(arr1,m1,n1);
Setlength(arr2,m2,n2);
Setlength(arr3,m1,n2);
StringGrid3.Visible:=true;
StringGrid3.ColCount:=n2;
StringGrid3.RowCount:=m1;

if (n1=m2) then begin

for i:= 0 to m1-1 do
 for j:= 0 to n1-1 do
  if Length(StringGrid1.Cells[i,j])<>0 then
   arr1[i,j]:= StrToInt(StringGrid1.Cells[i,j]);

for i:= 0 to m1-1 do
 for j:= 0 to n1-1 do
 if Length(StringGrid2.Cells[i,j])<>0 then
   arr2[i,j]:= StrToInt(StringGrid2.Cells[i,j]);

for i:= 0 to m1-1 do
 for j:= 0 to n1-1 do
  if Length(StringGrid1.Cells[i,j])<>0 then
   StringGrid1.Cells[i,j]:=IntToStr(arr1[i,j])
  else StringGrid1.Cells[i,j]:=IntToStr(0);

for i:= 0 to m1-1 do
 for j:= 0 to n1-1 do
  if Length(StringGrid2.Cells[i,j])<>0 then
   StringGrid2.Cells[i,j]:=IntToStr(arr2[i,j])
  else StringGrid2.Cells[i,j]:=IntToStr(0);

//умножение

k:=0;
for i:= 0 to m1-1 do
 for j:= 0 to n2-1 do begin
   s:=0;s1:=1;
   for k:=0 to n1-1 do begin
    s1:=arr2[i,k]*arr1[k,j];
    s:=s+s1
    end;
    arr3[i,j]:=s;
    StringGrid3.cells[i,j]:=IntToStr(arr3[i,j])
    end;
  end
 else Label8.Caption:='Операцию выполнить невозможно!'+#13#10+'Проверьте размеры матриц';
чую, что подстава где-то здесь
s1:=arr2[i,k]*arr1[k,j];

ибо более логичное, написанное s.Creator, даёт неверный результат.
я вырасту большим и умным)

Последний раз редактировалось Manik; 10.12.2009 в 16:02.
Manik вне форума Ответить с цитированием
Старый 10.12.2009, 16:40   #9
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

А нельзя ли прикрепить проект, чтоб посмотреть нормально?
s.Creator вне форума Ответить с цитированием
Старый 10.12.2009, 16:52   #10
Manik
Пользователь
 
Аватар для Manik
 
Регистрация: 08.12.2009
Сообщений: 24
По умолчанию

можно, конечно...)

он правда кривой страшно, но пока с функционалом разбираюсь...

*надеюсь, выложила именно то, что нужно...
Вложения
Тип файла: rar proj.rar (189.0 Кб, 56 просмотров)
я вырасту большим и умным)
Manik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение матриц Alyonka_v Помощь студентам 2 18.08.2009 21:51
Ввод векторов и матриц, умножение матрицы на вектор и вычисление скалярного призведения двух векторов zverushka Помощь студентам 18 20.02.2009 15:25