1.16.3. Параметры процедур.
Фактические и формальные параметры.
Обмен данными между процедурой и вызывающей программной еди-
ницей может быть выполнен через параметры процедуры. Параметры, используемые при вызове процедуры, называются фактическими. Параметры, используемые в процедуре, называются формальными.
Соответствие формальных и фактических параметров.
При вызове процедуры между фактическими и формальными параметрами устанавливается соответствие (формальные параметры ассоциируются с соответствующими фактическими, т.е. происходит ассоциирование параметров процедур). Разумеется, что имена соответствующих фактических и формальных параметров могут различаться.
Если фактический параметр является внешней процедурой, то он должен иметь атрибут EXTERNAL.
Пример выполнения лабораторной работы 6.
Требуется вычислить скалярное произведение
,
где ;; ; ; .
Алгоритм решения задачи.
1) Вычисляем .
2) Вычисляем .
3) Вычисляем .
4) Вычисляем .
5) Вычисляем .
6) Вычисляем .
7) Вычисляем .
Ручной счет.
1) .
2) .
3) .
4) .
5) .
6) .
7) .
Ответ: .
Выполнение работы на ЭВМ.
Реализующая программа на языке Фортран имеет вид:
! Главная программа program lab_2_8 real(4), dimension(3,3) :: a,b real(4), dimension(3) :: p,q,r,x,y,z,u,w,t real(4) :: scal integer(4) :: i,j open(1,file=’inpdata.dat’) read(1,*)((a(i,j),j=1,3),i=1,3) read(1,*)((b(i,j),j=1,3),i=1,3) read(1,*)(p(i),i=1,3) read(1,*)(q(i),i=1,3) read(1,*)(r(i),i=1,3) close(1) print 1,((a(i,j),j=1,3),i=1,3) 1 format(/2x,’Matritsa A’,/(3g12.4)) print 2,((b(i,j),j=1,3),i=1,3) 2 format(/2x,’Matritsa B’,/(3g12.4)) print 3,(p(i),i=1,3) 3 format(/2x,’Vector p’,/(3g12.4)) print 4,(q(i),i=1,3) 4 format(/2x,’Vector q’,/(3g12.4)) print 5,(r(i),i=1,3) 5 format(/2x,’Vector r’,/(3g12.4)) call lin(1.,r,1.,q,3,x) call lin(1.,x,1.,p,3,y) call mv(b,y,3,3,z) call mv(a,z,3,3,u) call mv(a,p,3,3,w) call mv(a,w,3,3,t) s=scal(u,t,3) print 6,s 6 format(/2x,’Rezultat: s=(AB(r+q+p),AAp)=’,g13.5) end
! Подпрограмма умножения матрицы на вектор ! y=Ax subroutine mv(a,x,n,m,y) real(4), dimension(n,m) :: a,x(m),y(n) integer(4) :: i,j,n,m do i=1,n y(i)=0. do j=1,m y(i)=y(i)+a(i,j)*x(j) end do end do end
! Подпрограмма вычисления линейной комбинации векторов ! z=alpha*x+beta*y subroutine lin(alpha,x,beta,y,n,z) real(4), dimension(n) :: x,y,z real(4) :: alpha,beta integer(4) :: i,n do i=1,n z(i)=alpha*x(i)+beta*y(i) end do end
! Подпрограмма вычисления скалярного произведения векторов ! scal=(x,y) real(4), dimension(n) :: x,y real(4) :: s,scal integer(4) :: i,n s=0. do i=1,n s=s+x(i)*y(i) end do scal=s end |
Результаты расчета:
Matritsa A
1.000 2.000 3.000
1.000 2.000 1.000
3.000 2.000 0.000
Matritsa B
4.000 1.000 2.000
0.000 4.000 3.000
1.000 1.000 1.000
Vector p
0.1000 1.700 -1.500
Vector q
-1.600 0.8000 1.100
Vector r
-0.7000 1.300 0.2000
Rezultat: s=(AB(r+q+p),AAp)= 576.64
Примечания.
1. Реализующая программа состоит из главной программы, подпрограммы вычисления скалярного произведения векторов (подпрограмма-функция scal), подпрограммы вычисления линейной комбинации двух векторов (подпрограмма-процедураlin), подпрограммы вычисления произведения матрицы на вектор (подпрограмма-процедураmv).
2. В представленной выше программе было введено 6 дополнительных массивов: x,y,z,u,wиt.
3. Исходные данные вводятся из файла inpdata.dat. В рассмотренном примере в нем размещаютсязначения элементов матриц A и B, а также векторовp,q,rв том же порядке, в котором они «считываются» из файлаinpdata.datв главной программе. Иными словами содержание файлаinpdata.datдолжно быть следующим:
1 2 3
1 2 1
3 2 0
4 1 2
0 4 3
1 1 1
0.1 1.7 -1.5
-1.6 0.8 1.1
-0.7 1.3 0.2