! Este programa le uma matriz, gera a matriz transposta 
! e imprime as duas matrizes  
  
program calcula_matriz_transposta
	implicit none
    integer matrizA(10,10), matrizT(10,10), &
            &n_linA, n_colA, n_linT, n_colT
       
    call inicializa_programa
    
    call le_dimensao_matriz(n_linA, n_colA, "Matriz A")
    call le_matriz(matrizA, n_linA, n_colA, "Matriz A")
    
    call imprime_matriz(matrizA, n_linA, n_colA, "Matriz A")
    
	call gera_transposta(matrizA, matrizT, n_linA,&
                         &n_colA, n_linT, n_colT)
                         
    call imprime_matriz(matrizT, n_linT, n_colT, "Matriz T") 
          
    stop
end program calcula_matriz_transposta


!
!  SUBPROGRAMAS
!

subroutine inicializa_programa
    write(*, *) "Este programa le a Matriz A e gera sua transposta"
    write(*, *)
    return
end subroutine inicializa_programa


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_transposta (mat, mat_t, lin, col, lin_t, col_t)
	implicit none
    integer lin, col, mat(lin, col), mat_t(col,lin),lin_t, col_t, i, j

    do i = 1, lin, 1
      do j = 1, col, 1
      	mat_t(j, i) = mat(i,j)
      end do
    end do
    lin_t = col
    col_t = lin
    return
end subroutine gera_transposta              