program ordinavett ! ! legge un file di coppie di numeri e le ordina ! a x crescente ! i vettori (allocati dinamicamente) passano ai sottoprogrammi in forma presunta ! real, allocatable,dimension(:) :: x,y integer :: n,i INTERFACE subroutine readdati (x,y,n) implicit none integer, intent(OUT) :: n real, allocatable,dimension(:) :: x,y end subroutine readdati subroutine ordina (x,y,n) implicit none integer, intent(IN) :: n real, dimension(:),intent(OUT):: x,y end subroutine ordina END INTERFACE call readdati(x,y,n) call ordina(x,y,n) do i=1,n write(6,'(2f8.2)')x(i),y(i) enddo end program ordinavett subroutine readdati (x,y,n) implicit none integer, intent(OUT) :: n real, allocatable,dimension(:) :: x,y real ::xx,yy integer :: iend,i character (len=40) :: nome 1 Write(6,*)'Nome File?' read(5,'(a)')nome open (unit=50,status='old',file=nome,err=1) ! questa parte serve per contare i record do i=1,1000000 read(50,*,iostat=iend)xx,yy if(iend /= 0)exit enddo if(iend > 0)then write(6,*)'Errore di lettura :',iend stop endif n=i-1 write(6,*) 'Lette ',n,' righe' rewind(50) ! alloco i vettori necessari allocate(x(n)) allocate(y(n)) ! leggo i dati nei vettori allocati do i=1,n read(50,*)x(i),y(i) enddo end subroutine readdati subroutine ordina (x,y,n) implicit none integer, intent(IN) :: n real, dimension(:),intent(OUT):: x,y real::t integer::i,j write(6,'(i2,10f5.1)')0,(x(i),i=1,n) do j = n-1, 1 , -1 do i=1,j if(x(i) > x(i+1)) then call scambio(x(i),x(i+1)) call scambio(y(i),y(i+1)) endif enddo write(6,'(i2,10f5.1)')j,(x(i),i=1,n) enddo end subroutine ordina subroutine scambio(v1,v2) implicit none real :: v1,v2,t t=v1 v1=v2 v2=t end subroutine scambio