Министерство образования и науки Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
Кафедра прикладной математики
Лабораторная работа №3
По дисциплине
«Программирование вычислений»
Факультет: ПМИ
Группа: ПМ-64
Студенты: Ганжа Е.М.
Матвеева Н.М.
Преподаватели: Рояк М.Э.
Рояк С.Х.
Вариант: 10.1
Новосибирск, 2008
1. Условие задачи
Написать программу, реализующую на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности: умножение ленточной симметричной матрицы на вектор (с выделением диагонали).
2. Представление матрицы
А – исходная квадратная матрица, размерностью N и с полушириной ленты L. AL прямоугольная матрицы размерностью N*(L-1), в которых хранятся нижний треугольник (так как матрица симметричная верхний треугольник хранить не надо) по строкам, доопределяется нулями в начале диагонали; DA – диагональ матрицы
3. Структура программы
Программы включает в себя 5 модулей:
main.for – программа перемножения матрицы на столбец, исходные данные хранятся в текстовом файле
to_bin.for – программа перевода текстового файла в файл прямого доступа
main_for_bin – программа перемножения матрицы на столбец, исходные данные хранятся в файле прямого доступа
generator.for – программа генерации файлов прямого доступа с матрицей, размерность которой задается пользователем
print.for – программа распечатки матрицы ленточного формата (симметричной) в виде плотной матрицы
4. Текст программы
main.for
! funktsia vvoda matritsi
SUBROUTINE input_matrix
COMMON /array/ a(200000000)
COMMON /size/ max_i, max_j
COMMON /error/ er
er=0
OPEN(1,FILE='in_mat.txt',ERR=10)
OPEN(2,FILE='in_diag.txt',ERR=10)
READ(1,*,ERR=11) max_i,max_j
IF (((max_i.GT.max_j).OR.(max_i.LE.0)).OR.(max_i*(max_j+2)
*.GT.200000000)) THEN
er=1
GOTO 6
ENDIF
k=max_j
DO 7 j=1,max_j
7 READ(2,*,ERR=11) a((max_i-1)*max_j+j)
DO 5 j=1,max_j
5 READ(1,*,ERR=11) (a(i),i=(max_i-1)*(j-1)+1,(max_i-1)*(j-1)
*+max_i-1)
GOTO 6
10 PRINT *,'O6ibka otkritiya faila'
er=1
GOTO 6
11 PRINT *,'O6ibka 4teniya 1'
er=1
GOTO 6
6 CLOSE(1)
CLOSE(2)
END
!funktsia vvoda vectora
SUBROUTINE input_vector
COMMON /array/ a(200000000)
COMMON /error/ er
COMMON /size/ max_i,max_j
OPEN(3,FILE='in_vec.txt',ERR=20)
READ(3,*,ERR=21) max_k
IF (max_k.NE.max_j) THEN
er=1
GOTO 16
ENDIF
DO 15 i=1,max_j,1
15 READ(3,*,ERR=21) a(max_i*max_j+i)
GOTO 16
20 PRINT *,'O6ibka otkritiya faila'
er=1
GOTO 16
21 PRINT *,'O6ibka 4teniya 2'
er=1
GOTO 16
16 CLOSE(3)
END
!funktsia umnozhenia matritsi na vector
SUBROUTINE multiplication(d_mat,diag,vec,rez)
COMMON /error/ er
COMMON /size/ max_i,max_j
DIMENSION d_mat(max_i-1,max_j), diag(max_j), vec(max_j),
*rez(max_j)
DO 28 j=1,max_i-1
rez(j)=rez(j)+diag(j)*vec(j)
k=2
DO 28 i=1,max_i-1
IF (d_mat(i,j).NE.0) THEN
rez(j)=rez(j)+vec(i+j-max_i)*d_mat(i,j)
rez(j-k)=rez(j-k)+vec(i+j-max_i+k)*d_mat(i,j)
ENDIF
28 k=k-1
DO 29 j=max_i,max_j
rez(j)=rez(j)+diag(j)*vec(j)
k=2
DO 29 i=1,max_i-1
rez(j)=rez(j)+vec(i+j-max_i)*d_mat(i,j)
rez(j-k)=rez(j-k)+vec(i+j-max_i+k)*d_mat(i,j)
29 k=k-1
END
!functsia vivoda vectora resultata
SUBROUTINE output
COMMON /array/ a(200000000)
COMMON /size/ max_i,max_j
COMMON /error/ er
OPEN (4,FILE='output.txt',ERR=40)
DO 35 j=max_j*(max_i+1)+1,max_j*(max_i+2)
35 WRITE (4,31,ERR=37) a(j)
GOTO 36
31 FORMAT (E10.4)
40 PRINT *,'O6ibka otkritiya faila'
er=1
GOTO 36
37 PRINT *,'O6ibka zapisi'
er=1
GOTO 36
36 CLOSE(4)
END
!glavnaya funktsia
PROGRAM main
COMMON /error/ er
COMMON /array/ a(200000000)
COMMON /size/ max_i,max_j
CALL input_matrix
IF (er.NE.0) GOTO 50
CALL input_vector
IF (er.NE.0) GOTO 50
CALL multiplication(a(1),a((max_i-1)*max_j+1),a(max_i*max_j+1),
*a((max_i+1)*max_j+1))
CALL output
IF (er.NE.0) GOTO 50
PRINT *,'programma vipolnena, resultat v faile'
GOTO 51
50 PRINT *,'programma ne vipolnena'
51 PAUSE
END
to_bin.for
! perevod textovih failov v 2i4nie
PROGRAM to_bin
DIMENSION s(2000000)
OPEN(1,FILE='in_mat.txt',ERR=10)
OPEN(2,FILE='in_vec.txt',ERR=10)
OPEN(5,FILE='in_diag.txt',ERR=10)
OPEN(3,FILE='in_mat.bin',ACCESS='direct',RECL=4,ERR=10)
OPEN(4,FILE='in_vec.bin',ACCESS='direct',RECL=4,ERR=10)
OPEN(6,FILE='in_diag.bin',ACCESS='direct',RECL=4,ERR=10)
!perevod matrirsi
READ(1,*,ERR=11) max_i,max_j
WRITE(3,REC=1,ERR=11) max_i
WRITE(3,REC=2,ERR=11) max_j
l=2
DO 5 i=1,max_j
READ(1,*,ERR=11) (s(k),k=1,max_i-1,1)
DO 5 j=1,max_i-1
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.