请大神用选择、循环、数组、子程序、文件结构, 编写个Fortran95的程序,简单能看得懂最好

2025-05-01 03:41:18
推荐回答(1个)
回答1:

    module subs
    implicit none
    
    CONTAINS
    !--------------------------------------------------------------------------
    ! calculate mean and variance of a data set    
    !--------------------------------------------------------------------------
    SUBROUTINE avevar(data,ave,var)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: data
REAL, INTENT(OUT) :: ave,var
INTEGER :: n
REAL, DIMENSION(size(data)) :: s
n=size(data)
ave=sum(data(:))/n
s(:)=data(:)-ave
var=dot_product(s,s)
var=(var-sum(s)**2/n)/(n-1)
END SUBROUTINE avevar
!BL
    !--------------------------------------------------------------------------
    ! calculation of Sample AutoCorrelation Sequence
    !--------------------------------------------------------------------------
    subroutine autocorr(data,acs,nLag)    
    IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: data
integer,intent(in) :: nLag
real,dimension(0:nLag),intent(out) :: acs
real :: sum1, sum2, ave, var
integer :: i, lag, N

N=size(data)

    !------------------------------------
    call avevar(data(:),ave,var)
        
    !------------------------------------
    sum2=dot_product(data(:)-ave,data(:)-ave)  
    do lag=0,nLag
        sum1 = 0.
        do i=1,N-lag
            sum1 = sum1 + (data(i+lag)-ave) * (data(i)-ave)           
        enddo                 
        acs(lag)=sum1/sum2
    enddo
    end subroutine autocorr
    
end module subs


    !--------------------------------------------------------------------------
    ! calculation of Sample AutoCorrelation Sequence
    !--------------------------------------------------------------------------
    program sampleAutoCorrelationSequence
    use subs
    implicit none
    integer,parameter :: N = 128, nLag=32   
    character(len=255):: ifilename='fig3a.dat'
    character(len=255):: ofilename='sampleAVS_fig7a.dat'
    
    real,dimension(N) :: data1
    real,dimension(0:nLag) :: sampleACS 
    
    integer :: i

    !------------------------------------
    open(7,file=ifilename)
    read(7,*)(data1(i),i=1,N)
    close(7)

    !------------------------------------    
call autocorr(data1(:),sampleACS(:),nLag)

open(7,file=ofilename)
    write(7,'(i5,f15.6)')(i,sampleACS(i),i=0,nLag)
    close(7)
    
    end program sampleAutoCorrelationSequence