PROGRAM Statistica

  USE stat
  IMPLICIT NONE
  INTEGER :: N, Nbins
  REAL, ALLOCATABLE :: x(:), bin(:), cont(:)
  REAL :: ave, sigma
  CHARACTER(LEN=20) :: inpfile, outfile

  PRINT *,"Programma per calcoli statistici"
  PRINT *,"Numero di valori da leggere:"
  READ *,N
  PRINT *,"Nome del file di input:"
  READ *,inpfile
  PRINT *,"Numero di canali nell'istogramma:"
  READ *,Nbins
  PRINT *,"Nome del file di output:"
  READ *,outfile

  ALLOCATE(x(N), bin(Nbins), cont(Nbins))
  CALL Leggi_dati(inpfile,N,x)

  ave = media(N,x)
  sigma = stdev(N,x,ave)

  PRINT *,'Media dei valori: ',ave
  PRINT *,'Deviazione standard: ',sigma

  CALL istogramma(N,x,Nbins,bin,cont)
  CALL Scrivi_dati(outfile,Nbins,bin,cont)

  DEALLOCATE(x, bin, cont)

  CONTAINS

    SUBROUTINE Leggi_dati(nfile,n,x)
      CHARACTER(LEN=20) :: nfile
      INTEGER :: n, i
      REAL :: x(n)

      OPEN(FILE=nfile, UNIT=15, STATUS='UNKNOWN')
      DO i=1,n
         READ(15,*) x(i)
      ENDDO
      CLOSE(UNIT=15)
    END SUBROUTINE Leggi_dati

    SUBROUTINE Scrivi_dati(nfile,n,x,y)
      CHARACTER(LEN=20) :: nfile
      INTEGER :: n, i
      REAL :: x(n), y(n)

      OPEN(FILE=nfile, UNIT=16, STATUS='UNKNOWN')
      DO i=1,n
         WRITE(16,*) x(i), y(i)
      ENDDO
      CLOSE(UNIT=16)
    END SUBROUTINE Scrivi_dati

END PROGRAM Statistica


