// Prof. carlos Maziero, DINF-UFPR, Maio de 2016

program matrizes ;

const
  MAX = 100 ;

type
  matriz2D = array [1..MAX, 1..MAX] of integer ;

//----------------------------------------------------------

function ler_valor (prompt : string;
                    min, max : integer) : integer ;
var
  valor : integer ;
begin
  repeat
    write (prompt, ': ') ;
    read (valor) ;
  until (valor >= min) AND (valor <= max) ;
  ler_valor := valor ;
end;

//----------------------------------------------------------

procedure ler_matriz (var m : matriz2D; var lin, col : integer) ;
var
  i, j : integer ;

begin
  // ler num linhas e colunas
  lin := ler_valor ('linhas',  1, MAX) ;
  col := ler_valor ('colunas', 1, MAX) ;

  // ler a matriz
  for i := 1 to lin do
    for j := 1 to col do
    begin
      write ('m[',i,',',j,']: ') ;
      read (m[i,j]) ;
    end ;
end ;

//----------------------------------------------------------

procedure escrever_matriz (m: matriz2D ; lin, col: integer) ;
var
  i, j: integer ;
begin
  // escrever a matriz
  for i := 1 to lin do
  begin
    for j := 1 to col do
      write (m[i,j], ' ') ;
    writeln ;
  end;
end;

//----------------------------------------------------------

procedure calcula_transposta (    m     : matriz2D ;
                              var mt    : matriz2D ;
                                  l,c   : integer ;
                              var lt, ct: integer) ;
var
  i, j: integer ;
begin
  for i := 1 to l do
    for j:= 1 to c do
      mt[j,i] := m[i,j] ;
  lt := c ;
  ct := l ;
end;

//----------------------------------------------------------

procedure busca_valor (    val    : integer ;
                       var m      : matriz2D ;
                           l, c   : integer ;
                       var lv, cv : integer) ;
var
  i, j: integer ;
  achou : boolean ;

begin
  achou := false ;
  lv := 0 ;
  cv := 0 ;
  i := 1 ;
  while (i <= l) AND NOT achou do
  begin
    j := 1 ;
    while (j <= c) AND NOT achou do
    begin
      if (m[i,j] = val) then
      begin
        achou := true ;
        lv := i ;
        cv := j ;
      end ;
      j := j + 1 ;
    end ;
    i := i + 1 ;
  end ;
end;

//----------------------------------------------------------

procedure multiplica (    m1,m2 : matriz2D ;
                      var mp    : matriz2D ;
                          l1, c1, l2, c2 : integer ;
                      var lp, cp : integer) ;
var
  i, j, k : integer ;
  x : real ;
begin

  ... completar

end ;


//----------------------------------------------------------

var
  mat1, mat2 : matriz2D ;
  lin1, col1 : integer ;
  lin2, col2 : integer ;
  val, lv, cv : integer ;

begin
  ler_matriz (mat1, lin1, col1) ;
  escrever_matriz (mat1, lin1, col1) ;
  calcula_transposta (mat1, mat2, lin1, col1, lin2, col2) ;
  escrever_matriz (mat2, lin2, col2) ;

  val := ler_valor ('busca', 0, 100) ;

  busca_valor (val, mat1, lin1, col1, lv, cv) ;
  if (lv <> 0) then
    writeln ('Encontrei ',val,' na linha ',lv,' coluna ',cv)
  else
    writeln ('Nao encontrei ',val,' na matriz') ;

end.









