Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Ответить
Настройки темы
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


ПОмогите пожалуйста составить программу для вычисения произведения матриц A,B,C каждая из которых имеет размерность nxn

ВОт составленная мною часть проги, где вводятся сами матрицы, проверьте пожалуйста
program ABC;
var
matrA: array[1..500,1..500] of integer;
matrB: array[1..500,1..500] of integer;
matrC: array[1..500,1..500] of integer;
i: integer;
j: integer;

begin
for i:=1 to n do
for j:=1 to n do
begin
read matrA[i,j];
end;
begin
read matrB[i,j];
end;
begin
read matrC[i,j];
end;

Отправлено: 13:45, 01-10-2010

 

Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Вот готово, замечания будут?
Код: Выделить весь код
program ABC;
const NMax = 10;
type Matrix = array [1..NMax, 1..NMax] of Real;  
 
procedure 1MulMatrix(var a, b, c: Matrix; n: Integer);
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
          s := s + a[i, k]*b[k, j];
          c[i, j] := s
     end
 
end;
procedure 2MulMatrix(var c, d, e: Matrix; n: Integer);
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
          s := s + c[i, k]*d[k, j];
          e[i, j] := s
     end
 
end;
 
var  a, b, c,d,e: Matrix;
     i, j, n: Integer;
begin
     WriteLn('vvedite poradok matrix');
     Write('n = '); ReadLn(n);
 
     WriteLn('vvedite pervyu');
     for i := 1 to n do
     for j := 1 to n do
     Read(a[i, j]);
 
     WriteLn('vvedite vtoryu');
     for i := 1 to n do
     for j := 1 to n do
     Read(b[i, j]);
 
 WriteLn('vvedite tretu');
     for i := 1 to n do
     for j := 1 to n do
     Read(d[i, j]);

     MulMatrix(a, b, c, n);
     MulMatrix(c, d, e, n);
 
     for i := 1 to n do
 begin
          for j := 1 to n do
          Write(e[i, j]:0:6, ' ');
          WriteLn
     end;
     ReadLn
end.

Отправлено: 07:54, 04-10-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата dasha131:
Вот готово, замечания будут? »
Будут
Код: Выделить весь код
program ABC;
const NMax = 10;
type Matrix = array [1..NMax, 1..NMax] of Real;  
 
procedure MulMatrix(var M1, M2, M3: Matrix; n: Integer);
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
              s := s + M1[i, k]*M2[k, j];
          M3[i, j] := s
     end
 
end;

procedure VvodM(var M1:Matrix; n:integer);
var 
    i,j:integer;
begin
     for i := 1 to n do
     for j := 1 to n do
         Read(M1[i, j]);
end;

procedure VivodM(var M1:Matrix; n:integer);
var 
    i,j:integer;
begin
     for i := 1 to n do
     begin
          for j := 1 to n do
              Write(M1[i, j]:0:6, ' ');
          WriteLn;
     end;
end;


var  a, b, c,d,e: Matrix;
     i, j, n: Integer;
begin
     WriteLn('vvedite poradok matrix');
     Write('n = '); ReadLn(n);
 
     WriteLn('vvedite pervyu');
     VvodM(a, n);
     WriteLn('vvedite vtoryu');
     VvodM(b, n);
     WriteLn('vvedite tretu');
     VvodM(c, n);

     MulMatrix(a, b, d, n);
     MulMatrix(c, d, e, n);
 
     VivodM(e,n);

     ReadLn;
end.
Как вариант, можно кусочек переписать иначе, через функцию:

Код: Выделить весь код
finction MulMatrix(var M1, M2; n: Integer):Matrix;
var  i, j, k: Integer;
     s: Real;
begin
     for i := 1 to n do
     for j := 1 to n do
     begin
          s := 0;
          for k := 1 to n do
              s := s + M1[i, k]*M2[k, j];
          result[i, j] := s
     end
end;
соотв. в основном теле программы будет:

Код: Выделить весь код
d:=MulMatrix(a,b,n);
e:=MulMatrix(c,d,n);
Общие комментарии:
Вообще не стОит путать локальные(внутри процедур и функций) и глобальные(общие для всей программы) переменные.
Поэтому я переименовал в процедурах a, b, c, e и т.д. в более условные и единые M1, M2, M3.
i, j, k счетчики, с ними все ясно.
Массивы a, b, c - основные.
d, e производные от умножения.
Бывшие процедуры 1MulMatrix, 2MulMatrix нигде не вызывались, соотв. заменены на вызываемую MulMatrix с разными передаваемыми ей аргументами.
Конечный Readln; по большому счету не нужен. Он служит для паузы во время отладки. При финальной компиляции программы эту строчку желательно закоментировать.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Последний раз редактировалось lxa85, 04-10-2010 в 12:19. Причина: добавил комментариев.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:02, 04-10-2010 | #12


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:55, 13-10-2010 | #13


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Проверила все в ручную на примере перемножения матриц размерностью 3х3 в первой программа все вычисляется верно, а во второй где процедуры объединены неверно, почему так??

Отправлено: 15:18, 13-10-2010 | #14


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


dasha131, приведи код программы пожалуйста. В которой процедуры объединены и работают не верно.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 15:23, 13-10-2010 | #15


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Вот же он.
Выше вами приведенный

Да вот кстати обьясните пожалуйста почему в моём варианте кода выбор параметра в процедуре по ссылке лучше чем по значению???

Отправлено: 12:50, 14-10-2010 | #16


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


lxa85,
Цитата lxa85:
приведи код программы пожалуйста »
Я имею веду ваш код!

Отправлено: 18:01, 15-10-2010 | #17


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Странно, вроде бы ошибки быть не должно.
Давай сравнивать входные наборы и полученные результаты.

Цитата dasha131:
Да вот кстати обьясните пожалуйста почему в моём варианте кода выбор параметра в процедуре по ссылке лучше чем по значению?? »
Ты имеешь в виду в чем отличие записи
procedure VvodM(var M1:Matrix; n:integer); от
procedure VvodM(M1:Matrix; n:integer);
При вызове процедуры (функции) выделяется память, в нее записываются передаваемые данные и служебная информация.
Передавать ссылку на массив проще, нежели сам массив. Это быстрее, экономичнее в плане ресурсов и времени.
Если этого не делать, а передавать в процедуру весь массив, то при большой "вложенности" процедур с пересылками полного массива данных, может возникнуть переполнение доступной памяти. Если передавать ссылки, этого не произойдет. Однако следует быть внимательным к тому, что на что и когда ссылается.

Для наглядности предложу вариант с книжной библиотекой. Если понадобилась информация, нас адресуют к нужному стеллажу. Перетаскивать к себе домой 6 рядов книг, чтобы прочесть эпиграф к произведению - нецелесообразно. Можно конечно, но не нужно

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:12, 15-10-2010 | #18


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Понятно обьяснили, спасибо!

Отправлено: 18:26, 15-10-2010 | #19


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


результат получается числа но не те
ввожу матрицы, пеемножение которых было проверенно мной в ручную
размерность=3
3 2 1 0 4 7 7 4 0
4 0 5 8 2 1 8 2 1
7 0 2 6 5 0 9 1 1

правильный ответ
529 153 44
790 230 69
829 173 87

ответ выдаваемый программой
274 311 273
248 288 289
240 268 284

Попробовала убрать вызов второй процедуры и вывисти результат перемножения AB, результат сошолся с тем который был получен в ручную
22 21 23
30 41 28
12 38 49

Отправлено: 18:45, 15-10-2010 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Всё о TURBO PASCAL (обсуждение, помощь в написание программ, ошибки, Pascal ABC) Loading Программирование и базы данных 41 20-05-2015 15:28
Разное - [решено] Помогите плииз с программой для Turbo Pascal dasha131 Программирование и базы данных 17 04-12-2010 14:06
Прочие - Turbo Pascal 7 Sniper Программное обеспечение Windows 30 01-12-2008 16:04
Turbo Pascal, Помогите написать пару программ kirillsp Программирование и базы данных 11 20-11-2006 23:34
Borland Turbo Pascal 7.0 Guest Программирование и базы данных 4 21-09-2004 18:44




 
Переход