! Este programa le e imprime duas matrizes e, no caso terem a mesma dimensão calcula e imprime 
! a matriz soma    
program subrotinas_e_matriz
	implicit none
    integer matrizA(10,10), matrizB(10,10), matrizS(10,10), n_linA, n_colA, n_linB, n_colB
    
    !Inicializa Programa    
    write(*, *) "Este programa le e imprime duas matrizes e, no caso de terem a mesma dimensao, calcula &
                 &e imprime a matriz soma    "
    
    
    !Lê Dados da Matriz A    
    call le_dimensao_matriz(n_linA, n_colA, "Matriz A")
    call le_matriz(matrizA, n_linA, n_colA, "Matriz A")

    !Lê Dados da Matriz B    
    call le_dimensao_matriz(n_linB, n_colB,  "Matriz B")
    call le_matriz(matrizB, n_linB, n_colB,  "Matriz B")
    
    !Imprime as Matrizes
    call imprime_matriz(matrizA, n_linA, n_colA, "Matriz A")
	call imprime_matriz(matrizB, n_linB, n_colB, "Matriz B")
    
    if(n_linA == n_linB .and. n_colA == n_colB) then
      call gera_matriz_soma(matrizA, matrizB, matrizS, n_linA, n_colA)
      call imprime_matriz(matrizS, n_linA, n_colA, "Matriz S") 
    end if  
          
    stop
end program subrotinas_e_matriz 

!
!  SUBPROGRAMAS
!
subroutine le_dimensao_matriz (n_lin, n_col, nome_matriz)
	implicit none
    integer n_lin, n_col
    character *8 nome_matriz
    
    write(*, *)
    write(*, *) "Digite o numero de linhas e de colunas da ", nome_matriz
	read (*, *) n_lin, n_col 
       
    return
end subroutine le_dimensao_matriz


subroutine le_matriz (mat, lin, col, nome_matriz)
	implicit none
    integer lin, col, mat(lin,col), i, j 
    character *8 nome_matriz
    
    write(*,*) "Digite elementos da matriz ", nome_matriz
    
    do i = 1, lin, 1
      read(*,*)(mat(i,j), j = 1, col, 1)
    end do  
    return
end subroutine le_matriz


subroutine imprime_matriz (mat, lin, col, nome_matriz)
	implicit none
    integer lin, col, mat(lin, col), i, j
    character *8 nome_matriz
    
	write(*,*)    
	write(*,*) nome_matriz
    do i = 1, lin, 1
      write(*,*) (mat(i,j), j = 1, col, 1)
    end do
    
    return
end subroutine imprime_matriz 

  
subroutine gera_matriz_soma(mat1, mat2, matS, lin, col)
	implicit none
    integer lin, col, mat1(lin, col), mat2(lin, col), matS(lin, col), i, j

    do i = 1, lin, 1
      do j = 1, col, 1
         matS(i,j) = mat1(i,j) + mat2(i,j)
      end do
    end do
    
    return
end subroutine gera_matriz_soma