Помогите с программой для Turbo Pascal (умножение матриц)
ПОмогите пожалуйста составить программу для вычисения произведения матриц 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; |
в принципе правильно, вот только нет ввода n и вместо оператора read лучше использовать readln imho, неплохо бы было выводить приглашение на ввод данных. размерность матриц лучше задавать через константу
Код:
const p. s. используйте тег CODE |
Код:
program ABC; D[i,j] := D[i,j] + (A[i,j]*B[j,i])*C[j,i]; Вот формула Значит матрицы мною заданны, как теперь задать их перемножение? |
Сами матрицы точно правильно введутся?!
|
Цитата:
|
Это не данная формула)) Значит моя ошибка(
МОжет поможете дальше с программой? |
Цитата:
Цитата:
И вид общей формулы тут Результирующую матрицу получать в 2 этапа. Сначала 1*2, затем получившее*3; Процедуры и функции проходили? Они бы сейчас очень пригодились. |
Код:
1.program AB; |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
А чтобы перемножать три матрицы, нужно новый цикл писать "MulMatrix(var c, d, e: Matrix; n: Integer)" ?? |
Вот готово, замечания будут?
Код:
program ABC; |
Цитата:
Код:
program ABC; Код:
finction MulMatrix(var M1, M2; n: Integer):Matrix; Код:
d:=MulMatrix(a,b,n); Вообще не стОит путать локальные(внутри процедур и функций) и глобальные(общие для всей программы) переменные. Поэтому я переименовал в процедурах a, b, c, e и т.д. в более условные и единые M1, M2, M3. i, j, k счетчики, с ними все ясно. Массивы a, b, c - основные. d, e производные от умножения. Бывшие процедуры 1MulMatrix, 2MulMatrix нигде не вызывались, соотв. заменены на вызываемую MulMatrix с разными передаваемыми ей аргументами. Конечный Readln; по большому счету не нужен. Он служит для паузы во время отладки. При финальной компиляции программы эту строчку желательно закоментировать. |
Спасибо, да действительно объединение двух процедур перемножения в одну очень кстати, и процедура ввода весьма удобна, а вот процедура вывода кажется мне лишней=)
|
Проверила все в ручную на примере перемножения матриц размерностью 3х3 в первой программа все вычисляется верно, а во второй где процедуры объединены неверно, почему так??
|
dasha131, приведи код программы пожалуйста. В которой процедуры объединены и работают не верно.
|
Вот же он.
Выше вами приведенный Да вот кстати обьясните пожалуйста почему в моём варианте кода выбор параметра в процедуре по ссылке лучше чем по значению??? |
lxa85,
Цитата:
|
Странно, вроде бы ошибки быть не должно.
Давай сравнивать входные наборы и полученные результаты. Цитата:
procedure VvodM(var M1:Matrix; n:integer); от procedure VvodM(M1:Matrix; n:integer); При вызове процедуры (функции) выделяется память, в нее записываются передаваемые данные и служебная информация. Передавать ссылку на массив проще, нежели сам массив. Это быстрее, экономичнее в плане ресурсов и времени. Если этого не делать, а передавать в процедуру весь массив, то при большой "вложенности" процедур с пересылками полного массива данных, может возникнуть переполнение доступной памяти. Если передавать ссылки, этого не произойдет. Однако следует быть внимательным к тому, что на что и когда ссылается. Для наглядности предложу вариант с книжной библиотекой. Если понадобилась информация, нас адресуют к нужному стеллажу. Перетаскивать к себе домой 6 рядов книг, чтобы прочесть эпиграф к произведению - нецелесообразно. Можно конечно, но не нужно :) |
Понятно обьяснили, спасибо!=)
|
результат получается числа но не те
ввожу матрицы, пеемножение которых было проверенно мной в ручную размерность=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 |
Ну все, причина найдена
MulMatrix(a, b, d, n); d:=MulMatrix(a,b,d,n); MulMatrix(d, c, e, n); e:=MulMatrix(c,d,e,n); у нас он вы чиcлял как C*AB , а в планах было AB*C хоты разницы особой нет, по свойству матриц A*B=B*A но все же лучше будет записать MulMatrix(a, b, d, n); MulMatrix(d, c, e, n); Все правильно?=) |
Цитата:
От сюда была ошибка, и я рад, что ты нашла ее первой :) |
Время: 06:46. |
Время: 06:46.
© OSzone.net 2001-