program esame
  implicit none
  real(8), allocatable, dimension (:) :: x,b,c
  integer :: selettore 
  integer :: ios,n,k
  character(*), parameter :: nomefile="vettore.dat"

  real(8) :: y,test04051
  real(8):: test04052

  ! selettore sceglie l'esame da eseguire
  write(*,'(a)',advance='no') "Scegli l'appello (1,2,4 o 5) "
  read (*,*) selettore
  select case (selettore)

  case(1)
     open(unit=1,iostat=ios,file=nomefile,status="old",action="read")
     if (ios/=0) then
        write(*,*) "Errore. Impossibile aprire il file!"
        stop
     end if

     read (1,*) n
     allocate(x(n))
     do k=1,n
        read(1,*) x(k)
     end do

     write(*,*) "Il risultato e` ",test04051(n,x)

  case(2)
     write(*,*) "Inserisci un numero minore o uguale di 1 "
     read(*,*)  y
     n=1000
     write(*,*) "Il risultato e` ",test04052(n,y)

  case(3)
     write(*,*) "Avevo detto 1, 2, 4 o 5!!!!"
  case(4)
     open(unit=1,iostat=ios,file=nomefile,status="old",action="read")
     if (ios/=0) then
        write(*,*) "Errore. Impossibile aprire il file!"
        stop
     end if

     read (1,*) n
     allocate(c(n),b(n))
     do k=1,n
        read(1,*) c(k)
     end do
     b=c
     
     call test04054(n,c,b,y)
     write(*,*) "Il risultato e` ",y

  case(5)
     call test04055
  end select
end program esame

function test04051 (n,x) 
  ! Esercizio n. 4 aa. 2004-2005 24 gennaio 2005
  implicit none

  integer :: n,i,j
  real(8) :: test04051,sum
  real(8),dimension(n) :: x

  sum=0
  do i=1,n
     j=1+mod(i+1,n)
     sum=sum+x(i)*x(j)
  end do  

  test04051=sum
end function test04051

function test04052 (n,x)
  ! Esercizio n. 4 aa. 2004-2005 7 febbraio 2005
  implicit none

  integer :: n,i,j
  real(8) :: test04052,a,sold,snew
  real(8) :: x

  sold=0;a=x
  do i=1,n
     snew=sold+a
     if (snew==sold) exit
     a=x**(2**i)
     sold=snew
  end do  

  test04052=snew
end function test04052

subroutine test04054 (n,b,c,x)
  ! Esercizio n. 4 aa. 2004-2005 30 giugno 2005
  implicit none

  integer :: n,i
  real(8) :: x
  real(8),dimension(n) :: b,c

  x=1
  do i=1,n
     x=c(i)*b(i)/x+x
  end do

end subroutine test04054

subroutine test04055
  ! Esercizio n. 4 aa. 2004-2005 19 settembre 2005
  implicit none

  integer(8) :: n,i
  real(8) :: s

  write(*,'(a)',advance='no') "Inserisci un numero intero "
  read (*,*) n

  s=0
  do i=1,n
     if (mod(i,2)==1) then
        s=s+(i-1.d0)/i**2
     else
        s=s+(i+1.d0)/i**2
     end if
  end do
  write(*,*) "Il risultato e` ",s

end subroutine test04055
