• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Перемножение матриц

Svetlanka

Новые
Регистрация
15 Ноя 2010
Сообщения
34
Реакции
0
Баллы
0
Перемножение матриц

Разработать программу перемножения двух матриц A и B размерности n*n. Обе матрицы размещаются в оперативной памяти динамически, а значение n вводится по запросу с клавиатуры.
 
Разработать программу перемножения двух матриц A и B размерности n*n. Обе матрицы размещаются в оперативной памяти динамически, а значение n вводится по запросу с клавиатуры.
Н-да... Вообще-то я сам не использую динамические массивы, а тут решил было разобраться, и, как выяснилось, впоролся в проблему, с которой сталкиваются все новички, пытающиеся работать с многомерными динамическими массивами. Суть вопроса такова. Если написать что-нибудь вроде
Код:
{$r-}
TYPE
 T=ARRAY[1..1,1..1] of Integer;
VAR
 A:^T;
 i,j,k,N:Integer;
BEGIN
 N:=2;
 GetMem(A, SizeOf(Integer)*N*N);

 WriteLn('Matrix A:');
 A^[1,1]:=1;
 A^[1,2]:=2;
 A^[2,1]:=3;
 A^[2,2]:=4;
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     Write(A^[i,j]:4);
    end;
   WriteLn;
  end;
 
 FreeMem(A, SizeOf(Integer)*N*N);

 ReadLn;
END.
то выясняется, что транслятор не делает разницы между A^[i,j] и A^[j,i], т.е. переменной A^[1,2] присваивается значение 3. Полазал по Сети, убедился, что на этом подрывается куча народу, а вот внятных советов (кроме как перейти на статические массивы) не обнаружил. А теперь самому интересно стало.
Ау, есть спецы по динамическим массивам в Паскале? В чем ошибка и как правильно?
 
выясняется, что транслятор не делает разницы между A^[i,j] и A^[j,i], т.е. переменной A^[1,2] присваивается значение 3. Полазал по Сети, убедился, что на этом подрывается куча народу, а вот внятных советов (кроме как перейти на статические массивы) не обнаружил. А теперь самому интересно стало. Ау, есть спецы по динамическим массивам в Паскале? В чем ошибка и как правильно?
Отбой, похоже, сам разобрался. Ошибка возникает вследствие того, что адрес компоненты двумерного массива определяется, как произведение индексов, умноженное на количество бит, отводимых под переменную заявленного типа. Отсюда понятно, что перемена индексов местами адреса не меняет. Следовательно, похоже, ничего другого не остается, как преобразовать двумерный массив в одномерный. Тогда решение задачи о перемножении матриц получается таким:
Код:
{$r-}
TYPE
 T=ARRAY[1..1] of Integer;
VAR
 A,B,C:^T;
 i,j,k,N:Integer;
BEGIN
 Write('N= ');
 ReadLn(N);
 GetMem(A, SizeOf(Integer)*N*N);
 GetMem(B, SizeOf(Integer)*N*N);
 GetMem(C, SizeOf(Integer)*N*N);

 WriteLn('Matrix A:');
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     A^[N*(i-1)+j]:=Random(20)-10;
     Write(A^[N*(i-1)+j]:4);
    end;
   WriteLn;
  end;
 WriteLn;

 WriteLn('Matrix B:');
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     B^[N*(i-1)+j]:=Random(20)-10;
     Write(B^[N*(i-1)+j]:4);
    end;
   WriteLn;
  end;
 WriteLn;

 WriteLn('Matrix C:');
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     C^[N*(i-1)+j]:=0;
     For k:=1 to N do
      C^[N*(i-1)+j]:=C^[N*(i-1)+j]+A^[N*(i-1)+k]*B^[N*(k-1)+j];
     Write(C^[N*(i-1)+j]:4);
    end;
   WriteLn;
  end;

 FreeMem(A, SizeOf(Integer)*N*N);
 FreeMem(B, SizeOf(Integer)*N*N);
 FreeMem(C, SizeOf(Integer)*N*N);

 ReadLn;
END.
По-моему, ужасно неудобно и некрасиво. Но что поделаешь...
 
Назад
Сверху