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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.