program calcolointegrale implicit none real,allocatable,dimension(:)::x,y integer::i,n real :: xint interface subroutine readdatiterm (x,y,n) integer,intent(out):: n real,allocatable ,dimension(:)::x,y end subroutine readdatiterm real function integrale(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) end function integrale real function integrale90_1(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) end function integrale90_1 real function integrale90_2(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) end function integrale90_2 end interface call readdatiterm (x,y,n) xint=integrale(x,y,n) write(6,*) 'Stile F77 Integrale=',xint xint=integrale90_1(x,y,n) write(6,*) 'Stile F90_1 Integrale=',xint xint=integrale90_2(x,y,n) write(6,*) 'Stile F90_2 Integrale=',xint xint = sum( (y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)) )/2 write(6,*) 'Con espr vettoriale: Integrale=',xint end program calcolointegrale real function integrale(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) integer::i integrale=0 do i=2,n integrale=integrale+((y(i)+y(i-1))*(x(i)-x(i-1))) enddo integrale=integrale/2.0 end function integrale real function integrale90_1(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) real, allocatable::trapezi(:) allocate (trapezi(n-1)) trapezi=(y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)) integrale90_1=sum(trapezi)/2 deallocate (trapezi) end function integrale90_1 real function integrale90_2(x,y,n) implicit none integer,intent(in)::n real,intent(in)::x(:),y(:) integrale90_2=sum( (y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)) )/2 end function integrale90_2 subroutine readdatiterm (x,y,n) implicit none integer,intent(out):: n real,allocatable ,dimension(:)::x,y real:: xx,yy character (len=30)::nomefile integer::i,ierr 23 write(6,*)'Nome file' read(5,'(a)')nomefile open(unit=50,file=nomefile,status='old',err=23) i=1 read(50,*,iostat=ierr) xx,yy do while(ierr == 0) i=i+1 read(50,*,iostat=ierr) xx,yy enddo if (ierr > 0) then write(6,*)'Errore numero:', ierr stop endif n=i-1 rewind(50) write(6,*) 'primo giro :n =',n allocate (x(n),y(n)) do i=1,n read(50,*) x(i),y(i) enddo close(50) end subroutine readdatiterm