Цель работы
Изучение псевдодинамического распределения памяти на языке ФОРТРАН. Изучение форматов хранения матриц большой размерности. Оптимизация программ по точности, скорости, памяти. Изучение погрешности вычисления скалярного произведения. Изучение способов отладки. Изучение принципов формирования тестов для вычислительных программ. Изучение файлов прямого доступа.
Ход выполнения работы
1. Написана программа, реализующая на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности с учетом следующих требований:
· для распределения памяти под необходимые массивы используются идеи псевдодинамической памяти; память выделяется в головной программе, путём описания 1 одномерного массива большой размерности; вся оставшаяся после распределения память находиться в конце этого массива; при недостатке памяти выдавается соответствующее сообщение;
· каждое действие должно быть реализовано в виде подпрограммы;
· вычисления производятся оптимальным, на мой взгляд, образом;
· все вводимые данные должны проверятся на корректность, для любых данных программа должна давать корректный результат (сообщение об ошибке на английском языке – корректный результат, сообщение системы о делении на ноль - некорректный результат);
· все входные данные должны вводиться из файлов (матрица и вектор в разных файлах); в первой строке файла хранятся размерности объекта
(в файле где хранится вектор размерности нет, так как считав матрицу из файла, программа уже знает какой длинны вектор необходимо читать)
· матрица в файле хранится в заданном формате.
2. Протестирована разработанная программа на матрицах небольшой размерности.
3. Реализовано задание лабораторной работы с использованием написанных
ранее подпрограмм, при условии, что матрицы и вектора хранятся в файлах
прямого доступа.
4. Для тестирования программы написана программа перевода текстовых
файлов, содержащих матрицу в заданном формате, в файлы прямого доступа.
5. Разработана программа генерации тестов большой размерности, при представлении матриц в заданном формате. Программа создаёт файлы прямого доступа.
6. Разработана программа, распечатывающая матрицы, представленные по формату, в виде плотных матриц.
7. Протестированы все разработанные программы. Для тестирования использовались матрицы большой и максимально возможной размерности.
Тескты программ
Программа умножения матрицы на столбец, читает данные не из бинарных файлов
program fort3
implicit none
common /error/e
common /array/a
integer e/0/
real a
dimension a(2000000)
call InputMatrix
if (e.eq.0) call InputVector
if (e.eq.0) call Calc
if (e.eq.0) call Output
return
end
subroutine InputMatrix
common /error/e
common /array/a(2000000)
common /maximize/ maxi, maxj
integer i/1/, j/1/, maxi/0/, maxj/0/
open (1,file='Matrix.f',err=10)
read(1,*,err=11) maxi, maxj
if((maxi.lt.0).and.(maxj.lt.0)) e=2
if((maxi*(maxj+2)).gt.2000000) e=1
if(e.ne.0) then
print *, 'Error in maxi, maxj'
return
endif
20 if(j.le.maxj)then
30 if(i.le.maxi)then
if(j.eq.1) then
read(1,*,err=11) a(i+maxi*maxj)
else
read(1,*,err=11) a((j-1)*maxi+i)
endif
i=i+1
goto 30
endif
i=1
j=j+1
goto 20
endif
close(1)
return
10 print *, 'Can not open Matrix.f file.'
goto 12
11 print *, 'Error in Matrix.f file.'
12 e=3
close(1)
return
end
subroutine InputVector
common /error/e
common /array/a(2000000)
common /maximize/ maxi, maxj
integer i/1/
open (2,file='Vector.f',err=50)
60 if(i.le.maxi)then
read(2,*,err=51) a(maxi*(maxj+1)+i)
i=i+1
goto 60
endif
close(2)
return
50 print *, 'Can not open Vector.f file.'
goto 52
51 print *, 'Error in Vector.f file.'
52 e=3
close(2)
return
end
subroutine Calc
common /error/e
common /array/a(2000000)
common /maximize/ maxi, maxj
integer i/1/, j/1/
real s/0/
70 if(j.le.maxi)then
80 if((i.lt.(maxj+j)).and.(i.gt.(j-maxj)))then
if(i.eq.j) then
s=s+a(maxi*maxj+i)*a(maxi*(maxj+1)+i)
endif
if(i.gt.j)then
s=s+a(maxi*(maxj+1)+i)*a(maxi*(i-j)+i)
endif
if(i.lt.j)then
s=s+a(maxi*(maxj+1)+i)*a(maxi*(j-i)+j)
endif
i=i+1
goto 80
endif
a(j)=s
j=j+1
i=(j-maxj)+1
s=0
goto 70
endif
return
end
subroutine Output
common /array/a(2000000)
common /maximize/ maxi, maxj
integer i/1/
open (3,file='Result.csv',err=100)
110 if(i.le.maxi)then
write(3, 111) a(i)
i=i+1
goto 110
endif
close(3)
return
100 print *, 'Can not open Result.csv file.'
return
111 format(E10.4, ';')
end
Программа умножения матрицы на столбец, читает данные из бинарных файлов
program fort3
implicit none
common /error/e
common /array/a
integer e/0/
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.