|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц) |
|
Разное - [решено] Помогите с программой для Turbo Pascal (умножение матриц)
|
Новый участник Сообщения: 40 |
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить 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; Общие комментарии: Вообще не стОит путать локальные(внутри процедур и функций) и глобальные(общие для всей программы) переменные. Поэтому я переименовал в процедурах a, b, c, e и т.д. в более условные и единые M1, M2, M3. i, j, k счетчики, с ними все ясно. Массивы a, b, c - основные. d, e производные от умножения. Бывшие процедуры 1MulMatrix, 2MulMatrix нигде не вызывались, соотв. заменены на вызываемую MulMatrix с разными передаваемыми ей аргументами. Конечный Readln; по большому счету не нужен. Он служит для паузы во время отладки. При финальной компиляции программы эту строчку желательно закоментировать. |
|
------- Последний раз редактировалось lxa85, 04-10-2010 в 12:19. Причина: добавил комментариев. Отправлено: 11:02, 04-10-2010 | #12 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Спасибо, да действительно объединение двух процедур перемножения в одну очень кстати, и процедура ввода весьма удобна, а вот процедура вывода кажется мне лишней
|
Отправлено: 14:55, 13-10-2010 | #13 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Проверила все в ручную на примере перемножения матриц размерностью 3х3 в первой программа все вычисляется верно, а во второй где процедуры объединены неверно, почему так??
|
Отправлено: 15:18, 13-10-2010 | #14 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать dasha131, приведи код программы пожалуйста. В которой процедуры объединены и работают не верно.
|
------- Отправлено: 15:23, 13-10-2010 | #15 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Вот же он.
Выше вами приведенный Да вот кстати обьясните пожалуйста почему в моём варианте кода выбор параметра в процедуре по ссылке лучше чем по значению??? |
Отправлено: 12:50, 14-10-2010 | #16 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать lxa85,
Цитата lxa85:
|
|
Отправлено: 18:01, 15-10-2010 | #17 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Странно, вроде бы ошибки быть не должно.
Давай сравнивать входные наборы и полученные результаты. Цитата dasha131:
procedure VvodM(var M1:Matrix; n:integer); от procedure VvodM(M1:Matrix; n:integer); При вызове процедуры (функции) выделяется память, в нее записываются передаваемые данные и служебная информация. Передавать ссылку на массив проще, нежели сам массив. Это быстрее, экономичнее в плане ресурсов и времени. Если этого не делать, а передавать в процедуру весь массив, то при большой "вложенности" процедур с пересылками полного массива данных, может возникнуть переполнение доступной памяти. Если передавать ссылки, этого не произойдет. Однако следует быть внимательным к тому, что на что и когда ссылается. Для наглядности предложу вариант с книжной библиотекой. Если понадобилась информация, нас адресуют к нужному стеллажу. Перетаскивать к себе домой 6 рядов книг, чтобы прочесть эпиграф к произведению - нецелесообразно. Можно конечно, но не нужно |
|
------- Отправлено: 18:12, 15-10-2010 | #18 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Понятно обьяснили, спасибо!
|
Отправлено: 18:26, 15-10-2010 | #19 |
Новый участник Сообщения: 40
|
Профиль | Отправить 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 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - Всё о 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 |
|