Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лек-5(информатика).doc
Скачиваний:
10
Добавлен:
03.03.2015
Размер:
263.68 Кб
Скачать

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