Помощь - Поиск - Пользователи - Календарь
Полная версия: процедуры ввода и вывода
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Anastacia Adesso
Вот такой вопрос появтлся.

Нужно вводить например 2 (или больше) двумерных массива.
Код
    procedure readmatrix( var a: matrix; var n, m :integer);
    var i,j : integer;
    begin
     repeat write('Ievadi rindu skaitu: ');readln(n)
     until (n>0) and (n<=nn);
     repeat write('Ievadi kolonnu skaitu: ');readln(m)
     until (m>0) and (m<=mm);
     for i:=1 to n do begin
      for j:=1 to m do begin
       writeln('A[',i,j,']= '); readln(a[i,j])
      end end
    end;

    procedure printmatrix(a :matrix; n,m: integer);
    var i,j,k: integer;
    begin for i:=1 to n do begin
      for j:=1 to m do write(a[i,j]:6);
       writeln;
      end
    end;


можно ли эти 2 процедуры сделать так, чтоб поменяв чтото при их вызове типа readmatrix(a,n,m), например а, она ещё и выполняла чтение другой матрицы?
Брр так сложно написано

Ну то есть в разделе описания будет одна процедура, а при вызове 2 раза, прочитает 2 матрицы
volvo
Ну, она и так будет читать столько матриц, сколько нужно:

procedure readmatrix(var a: matrix; var n, m :integer);
begin
...
end;

var
m1, m2, m3: matrix;
begin
readmatrix(m1, n, m);
readmatrix(m2, n, m);
readmatrix(m3, n, m);
end.

В чем проблема?
Anastacia Adesso
В том что в дальнейшем эти матрицы надо перемножить.
А не получается.
Мож я чтото не то делаю.
Вроде уже всё что можно туда сунула
Нажмите для просмотра прикрепленного файла
volvo
Исходные матрицы какие?
Anastacia Adesso
Вводятся с клавы первые две типа pirma и otra (ну массивы такие).
volvo
Нельзя напрямую сделать так, чтобы одна и та же процедура заполняла два массива разных типов. Нужен трюк:

{Programma sareizina divas matricas}

uses crt;
const
rinda = 3;
kopa = 2;
kolonna = 5;

type
{ Будет использоваться ниже }
vector = array[1 .. pred(maxint) div sizeof(integer)] of integer;

pirma = array[1..rinda, 1..kopa] of integer;
otra = array[1..kopa, 1..kolonna] of integer;
rezultats = array[1..rinda, 1..kolonna] of integer;

var
row,col: integer;
a1: pirma; a2: otra;
ar: rezultats;

procedure matrixmult(var res:resultats; var a:pirma; b:otra);
var i,j,k: integer;
begin
for i:=1 to rinda do
for j:=1 to kolonna do
begin
res[i,j]:=0;
for k:=1 to kopa do
res[i,j]:=res[i,j]+ a[i,k]* b[k,j];
end
end;

{ Передаешь бестиповый параметр }
procedure readmatrix(var a; n, m :integer);
var
i,j : integer;
mx: vector absolute a;
begin
{
Я закомментировал, ибо ты НЕ должна вводить здесь размерность.
Вводи ДО этого в программе, и передавай сюда через N, M
}
(*
repeat write('Ievadi rindu skaitu: ');readln(n)
until (n>0) and (n<=rinda);
repeat write('Ievadi kolonnu skaitu: ');readln(m)
until (m>0) and (m<=kolonna);
*)
for i:=1 to n do begin
for j:=1 to m do begin
writeln('A[',i,j,']= '); readln(mx[pred(i)*n + j]);
end end
end;

procedure printmatrix(var a; n,m: integer);
var
i,j,k: integer;
mx: vector absolute a;
begin for i:=1 to n do begin
for j:=1 to m do write(mx[pred(i)*n + j]:6);
writeln;
end
end;



begin
clrscr;
writeln('Ievadi 1. matricu'); readmatrix(a1,rinda, kopa);
writeln('Ievadi 2. matricu'); readmatrix(a2,kopa, kolonna);
matrixMult(ar,a1,a2);
clrscr;
writeln('Pirma matrica: ');printmatrix(a1,rinda, kopa); writeln;
writeln('Otra matrica: ');printmatrix(a2,kopa, kolonna);
readkey;
end.


А если еще точнее, чем написано в комментарии - то ты вообще не должна вводить размерность матриц, потому что не каждые 2 матрицы можно перемножить (только сцепленные), а ты при перемножении нигде не проверяешь, являются ли матрицы сцепленными ...

Размерности у тебя уже указаны константами...
Anastacia Adesso
Хе хе...Так и думала что тут какая то фишка должна быть!!! good.gif

Попробую..
Тока сначала с другими разберусь smile.gif
Anastacia Adesso
Гмм компилирует даже
а вот такой прикол
если матрацы 2х2 ввести и (1 2 3 4) * (5 6 7 8)=(19 22 22 26) на самом деле..
А Паскаль говорит что (19 22 43 50) nea.gif непорядок
volvo
Цитата
если матрацы 2х2 ввести и (1 2 3 4) * (5 6 7 8)=(19 22 22 26) на самом деле..

blink.gif С чего бы?

|1 2| |5 6| |1*5+2*7 1*6+2*8| |19 22|
| | * | | = | | = | |
|3 4| |7 8| |3*5+4*7 3*6+4*8| |43 50|

Что я неправильно делаю?
мисс_граффити
Цитата(Anastacia Adesso @ 18.10.2006 17:32) *

если матрацы 2х2 ввести и (1 2 3 4) * (5 6 7 8)=(19 22 22 26) на самом деле..
А Паскаль говорит что (19 22 43 50) nea.gif непорядок

он же того... умер. давно. в 1662 году.
а программулина правильно насчитала.
во всяком случае, мне кажется, что
3*5+4*7=15+28=43
3*6+4*8=18+32=50
могу ошибаться.
Anastacia Adesso
mega_chok.gif

Вы правильно посчитали..
А я не знаю зачем какимто методом считаю..
Бррр
Спасибо good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.