Помощь - Поиск - Пользователи - Календарь
Полная версия: процедуры ввода и вывода
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.