next up previous
Next: Sobre este documento...

Informática. Prácticas. Febreiro 2002

Escribir unha subrutina que reciba como argumentos unha matriz $A$ de números enteiros e orde 4x4 e dous enteiros $i, j$. A subrutina debe calcular a matriz $B$ de orde 3x3 centrada no elemento $A_{ij}$. Cando o cálculo de $B$ implica acceder a elementos $A_{ij}$ que non existen, haberá que poñer 0's. Por exemplo, dada a matriz $A$:

\begin{displaymath}
A = \left[ \begin{array}{ccccc}
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\
9 & 8 & 7 & 6 \\
5 & 4 & 3 & 2\\
\end{array} \right]
\end{displaymath}


\begin{displaymath}i = 1, j = 1 \Longrightarrow
B = \left[ \begin{array}{ccc}
0 & 0 & 0 \\
0 & 1 & 2 \\
0 & 5 & 6 \\
\end{array} \right]
\end{displaymath}


\begin{displaymath}i = 3, j = 3 \Longrightarrow
B = \left[ \begin{array}{ccc}
6 & 7 & 8 \\
8 & 7 & 6 \\
4 & 3 & 2 \\
\end{array} \right]
\end{displaymath}


\begin{displaymath}i = 4, j = 4 \Longrightarrow
B = \left[ \begin{array}{ccc}
7 & 6 & 0 \\
3 & 2 & 0 \\
0 & 0 & 0 \\
\end{array} \right]
\end{displaymath}

Escribir un programa principal que inicialize a matriz coa seguinte sentencia:
data a/1, 5, 9, 5, 2, 6, 8, 4, 3, 7, 7, 3, 4, 8, 6, 2/

Logo, debe pedir ó usuario os números $i, j$, chamar á subrutina e imprimir en pantalla a matriz $B$.

MELLORA DO PROGRAMA: Facer que o programa, no canto de inicializar a matriz coa sentencia data anterior, lea a matriz $A$ dun ficheiro datos.dat, co seguinte formato:

|1  2  3  4 |
|5  6  7  8 |
|9  8  7  6 |
|5  4  3  2 |
Ademais, debe escribir a matriz $B$ no ficheiro resultados.dat co seguinte formato.
i = 2, j = 3
|2  3  4 | 
|6  7  8 |
|8  7  6 |
AVISO: Incluir como comentario nas primeiras liñas do programa o nome completo e o grupo (A, B)

SOLUCIÓN:

      program matriz
      integer  a(4, 4), b(3, 3)

      i = indice("i"); j = indice("j")
      print *, i, j

      call lee_matriz(a)
      call calcula_b(a, b, i, j)
      call escribe_matriz(b, i, j)

      stop
      end


cccccccccccccccccccccccccccccc
      function indice(c)
      character  c

 1    print *, "Introduza o índice ", c, " (1 <= ", c, " <= 4)"
      read *, indice
      if(indice.lt.1.or.indice.gt.4) goto 1 

      return
      end


ccccccccccccccccccccccccccccccc
      subroutine calcula_b(a, b, i, j)
      integer  a(4, 4), b(3, 3)

      do 1 k = -1, 1
         do 1 l = -1, 1
            if(i+k.ge.1.and.i+k.le.4.and.j+l.ge.1.and.j+l.le.4) then
               b(k + 2, l + 2) = a(i + k, j + l)
            else
               b(k + 2, l + 2) = 0
            endif
 1       continue

      do 2 k = 1, 3
 2       print *, (b(k, l), l = 1, 3)

      return
      end
      

cccccccccccccccccccccccccccccc
      subroutine lee_matriz(a)
      integer  a(4, 4)

      open(1, file = "datos.dat", status = "old", err = 1)

      do 2 i = 1, 4
         read (1, 3) (a(i, j), j = 1, 4)
 2    continue
 3    format("|", 4(i1, 1x), "|")

      close(1)


      return
 1    print *, "Erro en open (read)"
      stop
      end
     
ccccccccccccccccccccccccccccccc
      subroutine escribe_matriz(b, i, j)
      integer  b(3, 3)

      open(1, file = "resultados.dat", status = "new", err = 1)
      write (1, *) "i = ", i, ", j = ", j
      do 2 k = 1, 3
         write (1, 3) (b(k, l), l = 1, 3)
 2    continue
 3    format("|", i1, 1x, i1, 1x, i1, "|")

      close(1)
      return
 1    print *, "Erro en open (write)"
      stop
      end




next up previous
Next: Sobre este documento...
Manuel Fernandez Delgado 2002-02-15