Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра прикладной математики
Лабораторная работа №3
По дисциплине
«Программирование вычислений»
Факультет: ПМИ
Группа: ПМ-64
Студенты: Ведерникова М.А., Довгаль С.Ю., Чепарев С.С.
Преподаватели: Рояк М.Э., Рояк С.Х.
Новосибирск 2008
1. Задание
Написать программу, реализующую на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности. Матрица ленточная, симметричная, диагональ хранить не нужно.
2. Теоретическая часть
Ленточный строчно-столбцовый формат.
А – исходная квадратная матрица, размерностью N и с полушириной ленты L, доопределенная нулями в начале диагоналей. AL и AU – прямоугольные матрицы размерностью N*L, в которых хранятся нижний треугольник по строкам и верхний треугольник по столбцам соответственно. В задании лабораторной работы задается симметричная матрица и не требуется хранить диагональ отдельно, поэтому все данные о содержимом матрицы хранятся в AL.
модуль mul.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 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
модуль tobin.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
program tobin
dimension x_mem(1000000)!vydelenie pamyati
call input(x_mem)!vvod
n=x_mem(1)
l=x_mem(2)
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
write(11,rec=i) (x_mem((i-1)*l+j+2),j=1,l) !pishem AL
enddo
write(12,rec=1) (x_mem(i+n*l+2),i=1,n)
!pishem vektor
print *,'Success'
pause
end!main
модуль muld.for – программа перемножения матрицы на столбец с использованием файлов с прямым доступом
subroutine input(x_mem)
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
stop
endif
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.