next up previous


Informática. Exame de Prácticas
Novembro, 2004


Nome:



  1. (3 PUNTOS) Escribir unha función externa chamada calcula_s en Fortran 90 que, dado un número enteiro n, calcule e retorne a seguinte suma:

    Sn = $\displaystyle \sum_{{i = 1}}^{n}$$\displaystyle \sum_{{j = 1}}^{i}$i2sen$\displaystyle \left(\vphantom{ \frac {\pi}{j} }\right.$$\displaystyle {\frac{{\pi}}{{j}}}$$\displaystyle \left.\vphantom{ \frac {\pi}{j} }\right)$ (1)

    function calcula_s(n)
    integer, intent(in) :: n
    calcula_s = 0
    do i = 1, n
      do j = 1, i
        calcula_s = calcula_s + (i*i)*sin(3.1416/j)
      end do
    end do
    return
    end function
    

  2. (4 PUNTOS) Escribir un programa en Fortran que lea por teclado un número enteiro n e reserve memoria dinámicamente para dous vectores $ \bf x$ e $ \bf y$ de n elementos reais cada un. Logo, debe ler por teclado o vector $ \bf x$ e transforma-lo a un novo vector $ \bf y$ de modo que yi = (xi-1 + xi + xi+1)/3, i = 1,..., n (se i - 1 < 1, non se debe sumar xi-1; se i + 1 > n, non se debe sumar xi+1). Finalmente, debe imprimi-lo vector $ \bf y$ e libera-la memoria dos dous vectores. Nota: se non sabes usar arrais dinámicos, usa arrais estáticos, aunque o exercicio puntuará menos.

    program proba
    real, dimension(:), allocatable :: x, y
    read *, n
    allocate(x(n), y(n))
    do i = 1, n
      y(i) = 0
      do j = -1, 1
        if( (i + j >= 1).and.(i + j <= n) ) y(i) = y(i) + x(i + j)
      end do
      y(i) = y(i)/3
    end do
    print *, y
    deallocate(x, y)
    end program
    

  3. (3 PUNTOS) Escribir un programa en Fortran que lea un número enteiro n e imprima por pantalla os seus divisores primos coas súas multiplicidades. Pista: o programa debe percorrer os números enteiros k < n/2, e atopar aqueles números k para os que n é múltiplo enteiro de k. Para atopa-la multiplicidade dun factor k, hai que facer n = n/k mentres que o resto desta división (que se pode calcular coa función intrínseca mod(n, k)) sexa 0: a multiplicidade é o número destas divisións.

    program factores_primos
    
    integer :: p
    
    read *, n
    
    k = n
    do
      if(mod(n, k) == 0) then
        p = 0
        do
          n = n/k
          p = p + 1
          if(mod(n, k) /= 0) exit
        end do
        print *, k, p
      end if
      if(n == 1) exit
      k = k + 1
    end do
    
    end program
    


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