next up previous


Informática. Exame de Prácticas resolto
Febreiro, 2005


Nome:



  1. Primeiro Parcial

    1. (2.5 PUNTOS) Escribir un programa que lea un número por teclado, o descompoña nas súas cifras e imprima a suma das mesmas.

      SOLUCIÓN:

      program suma_cifras
      integer :: n, m, suma
      
      print *, "Introduza un número: "
      read *, n
      
      m = n; suma = 0
      do
        suma = suma + mod(m, 10)
        m = m/10
        if(m == 0) exit
      end do
      print *, "A suma das cifras de ", n, " é ", suma
      
      stop
      end program suma_cifras
      

    2. (2.5 PUNTOS) Escribir unha subrutina en Fortran 90 chamada suprime_fila_col() que reciba como argumentos unha matriz a de enteiros e as súas dimensións nf e nc. Tamén debe ter como argumentos un número de fila f e un número de columna c da matriz a. A subrutina debe proporcionar como resultado outra matriz b, reservada dinámicamente, que sexa igual á matriz a pero suprimindo a fila f e a columna c (se non dominas a memoria dinámica, faino con arrais estáticos pero puntúa menos).

      SOLUCIÓN:

      subroutine suprime_fila_col(a, nf, nc, f, c, b)
      integer, dimension(nf, nc), intent(in) :: a
      integer, intent(in) :: nf, nc, f, c
      integer, dimension(:,:), allocatable, intent(out) :: b
      
      do i = 1, nf
        if(i == f) cycle
        do j = 1, nc
          if(j == c) cycle
          b(k, l) = a(i, j)
          l = l + 1
        end do
        k = k + 1; l = 1
      end do
      
      return
      end subroutine suprime_fila_col
      

  2. Segundo Parcial
    1. (3 PUNTOS) Escribir unha subrutina chamada le_datos(...) que lea dende o arquivo datos.dat dous vectores $ \bf x$ e $ \bf y$. A subrutina debe proporcionar como saída estos dous vectores e a súa dimensión n (non se coñece o número de filas do arquivo). Os dous vectores atópanse dispostos como columnas no arquivo datos.dat. O formato a utilizar será de números reais sen expoñente con 3 díxitos na parte fraccionaria situados nos tabuladores 1 e 10 (se non dominas os formatos, usa o formato por defecto, pero o exercicio puntúa menos). Exemplo:
      -1.231   2.453
      ...      ...
      

      SOLUCIÓN:

      subroutine le_datos(x, y, n)
      real, dimension(100), intent(out) :: x, y
      integer, intent(out) :: n
      
      open(1, file = "datos.dat")
      
      n = 0
      do
        read (1, 2) x(n + 1), y(n + 1)
      2 format(f6.3, t10, f6.3)
        n = n + 1
      end do
      
      1 close(1)
      
      return
      end subroutine le_datos
      

    2. (2 PUNTOS) Escribir un programa principal que chame á subrutina le_datos(...). Logo, debe calcula-lo vector $ \tt z$, de dimensión n, cuxa compoñente k defínese como:

      zk = $\displaystyle \sum_{{i = 1}}^{{n}}$xiyi-k    k = 1,..., n (1)

      Usar yi-k = 1 para os valores i $ \leq$ k.

      SOLUCIÓN:

      program convolucion
      real, dimension(100) :: x, y, z
      integer :: n
      
      call le_datos(x, y, n)
      
      do k = 1, n
        z(k) = 0
        if(i <= k) then
          z(k) = z(k) + x(i)
        else
          z(k) = z(k) + x(i)*y(i - k)
        end if
      end do
      stop
      end program convolucion
      


next up previous
© 2004, Dr. Manuel Fernández Delgado, Universidad de Santiago de Compostela, Departamento de Electrónica e Computación