Написание программы, реализующей на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности (Лабораторная работа № 3), страница 2

      if(n*l+2*n+2.gt.1000000) then!proverka na perpolnenie

      print *, 'Perepolnenie pamyati'

      pause

      stop

      endif

      open(unit=11,access='direct',recl=l*4,file='x_matrix.bin')

      open(unit=12,access='direct',recl=n*4,file='x_vector.bin')

      do i=1,n

      read(11,rec=i) (x_mem((i-1)*l+j+2),j=1,l) !chitaem AL

      enddo

      read(12,rec=1) (x_mem(i+n*l+2),i=1,n)

      !chitaem vektor

      close(1)

      close(2)

      close(3)

      end!input

      subroutine multip(n,l,AL,vect,rez)!podprogramma peremnozheniya

      dimension AL(l,n),vect(n),rez(n)

      do i=1,n

        jb=max(1,l-i+1)!otkuda nachinat'

        m=max(1,i-l+1)

        rez(i)=0

        do j=jb,l

        rez(i)=rez(i)+AL(j,i)*vect(m)!idem po stroke

        m=m+1

        enddo

        j=l-1

        do while(j.gt.0 .and. i+l-j.le.n)

        rez(i)=rez(i)+AL(j,i+l-j)*vect(m)!potom po diagonali

        m=m+1

        j=j-1

        enddo

      enddo

      end!multip

      subroutine output(n,rez)

      dimension rez(n)

      open(4,file='out.txt')!otkryvaem  fail

      write(4,99) (rez(i),i=1,n)!pishem

99    format(g11.2) 

      end!output

      Program matrix

      dimension x_mem(1000000)!vydelenie pamyati

      call input(x_mem)!vvod

      n=x_mem(1)

      l=x_mem(2)

      call multip(n,l,x_mem(3),x_mem(n*l+3),x_mem(n*l+n+3)) !sobstvenno schet

      call output(n,x_mem(n*l+n+3))!vyvod

      print *,'Success'

      pause

      end!main

модуль ranD.for – программа для генерирования тестов в файлах с прямым доступом

program ranD

      integer *4 n,i,j,l

      dimension x_mem(1000000)!vydelenie pamyati

      print *, 'Vvedite parametry n i l'

      read *, n,l

      open(3,file='x_par.txt')

      write(3,*) n,l

      if(n*l+2*n+2.gt.1000000) then

      print *,'Too big matrix'

      pause

      stop

      endif

      open(unit=1,access='direct',recl=l*4,file='x_matrix.bin')

      do i=1,n

         do j=1,l-i

         x_mem((i-1)*l+j)=0!zapolnyaem nulyami

         enddo

         do j=l-i+1,l

         x_mem((i-1)*l+j)=2.5!i soderzhimym

         enddo

      enddo

      do i=1,n

      write(1,rec=i) (x_mem((i-1)*l+j),j=1,l)

      enddo

      open(10,file='x_matrix.txt')!posmotrim che poluchilos'

      do i=1,n

      write(10,99) (x_mem((i-1)*l+j),j=1,l)

      write(10,*)

      enddo

99    format(f6.2\)

      open(11,file='x_vector.txt')

      write(11,*) (i,i=1,n)

      open(unit=2,access='direct',recl=n*4,file='x_vector.bin')

      write(2,rec=1) (i,xi=1,n)

      print *,'Test gotov'

      pause

      end

модуль full_m.for – программа, распечатывающая матрицы, представленные по форматы, в виде плотных матриц

      subroutine input(x_mem)

      dimension x_mem(1000000)!pamyat' vydelena v glavnoi programme

      open(1,file='x_par.txt')!otkryvaem faily

      open(2,file='x_matrix.txt')

      open(3,file='x_vector.txt')

      read(1,*) n,l!chitaem parametry

      x_mem(1)=n

      x_mem(2)=l

      if(l.ge.n.or.l.le.0) then!proverka na korrectnost' dannyh

      print *, 'Nevernye dannye'

      pause

      stop

      endif

      if(n*l+2*n+2.gt.1000000) then!proverka na perpolnenie

      print *, 'Perepolnenie pamyati'

      pause

      stop

      endif

      read(2,*) (x_mem(i+2),i=1,n*l)!chitaem AL

      read(3,*) (x_mem(i+n*l+2),i=1,n)!chitaem vektor

      close(1)

      close(2)

      close(3)

      end!input

      subroutine prin_m(n,l,AL)!podprogramma peremnozheniya

      dimension AL(l,n)

      open(10,file='full.txt')

      do i=1,n

        jb=max(1,l-i+1)!otkuda nachinat'

        do k=1,i-l

        write(10,99) 0.0

        enddo

        do j=jb,l

        write(10,99) AL(j,i)

        enddo

        j=l-1       

        do while(j.gt.0 .and. i+l-j.le.n)

        write(10,99) AL(j,i+l-j)

        j=j-1

        enddo

        do k=1,n-l-i+1

        write(10,99) 0.0

        enddo

        write(10,*)    

      enddo

 99   format(f6.2\) 

      end!multip

      program full_m

      dimension x_mem(1000000)!vydelenie pamyati

      call input(x_mem)!vvod

      n=x_mem(1)

      l=x_mem(2)

      call prin_m(n,l,x_mem(3))

      print *,'Success'

      pause

      end

модуль muld_t.for – программа вычисления времени считывания данных из файла с прямым доступом и перемножения

      subroutine input(x_mem)

      integer*4 n,i

      dimension x_mem(1000000)!pamyat' vydelena v glavnoi programme

      open(1,file='x_par.txt')!otkryvaem faily

      read(1,*) n,l!chitaem parametry

      x_mem(1)=n

      x_mem(2)=l

      if(l.ge.n.or.l.le.0) then!proverka na korrectnost' dannyh

      print *, 'Nevernye dannye'

      pause