Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Процедуры. Назначение процедур

Содержание

Назначение процедурРазбиение исходной задачи на подзадачиУстранение дублирования кодаПовторное использование написанного кодаБиблиотеки готовых подпрограмм и функций Раздельное написание программ
Лекция 6ПРОЦЕДУРЫ Назначение процедурРазбиение исходной задачи на подзадачиУстранение дублирования кодаПовторное использование написанного кодаБиблиотеки готовых Виды процедурprogram имя...contains внутренние процедурыendГоловнаяпрограммаmodule имя...contains  модульные процедурыend moduleМодулиsubroutine или function...contains внутренние процедурыendВнешниепроцедуры Модульные процедуры Описываются в модулях после оператора contains. Обладают явным интерфейсом. Имеют Внутренние процедуры Описываются в головной программе после оператора contains. Обладают явным интерфейсом. Внешние процедуры Описываются отдельно от головной программы или в других файлах. Обладают Функциитип function имя_функции (формальные ФункцииПример.Функция представлена тригонометрическим рядомТип функции – вещественный;формальные параметры – x -вещественный, k !**************************************************!           Функция Вызов функцииВызов созданной функции аналогичен вызову стандартной функцииprogram FX real res res Вызов функцииВызов функции без параметровprogram func2 write(*,*) pi() end!**************************************************! Вызов функции При вызове должны соответствовать:1) тип функции и тип переменной, которой Подпрограммыsubroutine имя_подпрограммы ( формальные ПодпрограммыПодпрограмма печати прямоугольной таблицы символов* * * * * * * ** Подпрограммы!**************************************************!    Подпрограмма печати таблицы символов!**************************************************subroutine table(M,N,CH)!------------- формальные параметры --------------- Вызов подпрограммыОператор call вызывает подпрограммуprogram sub call table(4,7,'*') end!**************************************************! Внутренние переменныеВнутренние переменные доступны и используются внутри процедур.Внутренние переменные получившие инициализацию являются program static_var call sub() ! M = 1 call sub() ! M Передача параметровФормальные параметры1) входные,  intent(in)2) выходные, intent(out)3) входные/выходные, intent(inout)subroutine sub(a,b,c) integer, Вид связи intent(in)Принимают значение от соответствующего фактического параметра и не могут изменяться Вид связи intent(out)Параметры передают свое значение соответствующему фактическому параметру и предназначены для Вид связи intent(inout)Параметры могут как принимать значения от фактического параметра, так и Optional параметрыАтрибут optional устанавливает формальные параметры необязательными.Функция present проверяет присутствие необязательного параметра Optional параметрыprogram param_in real res res = logarithm(144.0,base = 12.0) write(*,*) resCONTAINS Область видимости*Объекты описанные в головной программе доступны во внутренних процедурах, недоступны во Область видимостиprogram region integer a, b;  integer c, d ...contains ! Область видимостиprogram array integer, parameter :: M = 10 integer :: A(M) Оператор interfaceПочему при компиляции выдаётся ошибка ?program question write(*,*) middle(3.0,2.0)ENDreal function middle(a,b) Оператор interfaceinterface тип имя_функции(формальные параметры) тип формальных параметров конец описания функцииend interfaceОпределяет Оператор interfaceprogram questioninterface real function middle(a,b)  real a,b end function middleend Оператор returnprogram break_functionwrite(*,*) div(3,0)contains integer function div(a,b)  integer a,b  if Процедуры как параметрыУниверсализация процедур.основная функцияфункции подставляемыевместо функции fun Процедуры как параметры program param_functexternal p, q, swrite(*,*) f(0.5, p) ! p(x) Процедуры как параметрыreal function p(x) ! ---------- функция p(x)real x p = Процедуры как параметрыОператор external объявляет, что перечисленные внешние процедуры передаются как параметры.Если Процедуры как параметрыОператор intrinsic объявляет, что перечисленные стандартные процедуры передаются как параметры.program Процедуры как параметрыprogram param_functinterface  real function p(x)  real x end Рекурсивные процедурыПроцедура вызывающая сама себя.recursive – объявление рекурсивной процедуры.Прямая рекурсия proc ---> Рекурсивный вывод последовательности чисел.program recurse call Number(10) !containsrecursive subroutine Number(N)integer N write(*,*) Результирующая переменная, предложение result.program fact write(*,*) factorial(10)contains recursive function factorial(p) result(k) Чистые процедурыЧистые процедуры – процедуры без побочных эффектовprogram side_effect real :: s Чистые процедурыКлючевое слово pure объявляет процедуру чистой.Для чистых процедур характерно ① все Чистые процедурыВ операторе forall используются только чистые процедуры.PROGRAM PURE_FORALLreal :: A(10) = Элементные процедурыЭлементные процедуры могут иметь в качестве фактических параметров как скаляры так Элементные процедурыКлючевое слово elemental объявляет процедуру элементной.program ELEMENTAL_FUNCreal :: A(10) = [1,2,3,4,5,6,7,8,9,0]
Слайды презентации

Слайд 2 Назначение процедур
Разбиение исходной задачи на подзадачи

Устранение дублирования кода

Повторное

Назначение процедурРазбиение исходной задачи на подзадачиУстранение дублирования кодаПовторное использование написанного кодаБиблиотеки

использование написанного кода

Библиотеки готовых подпрограмм и функций

Раздельное написание

программ

Слайд 3 Виды процедур
program имя
...
contains
внутренние процедуры
end
Головная
программа
module имя
...
contains
модульные

Виды процедурprogram имя...contains внутренние процедурыendГоловнаяпрограммаmodule имя...contains модульные процедурыend moduleМодулиsubroutine или function...contains внутренние процедурыendВнешниепроцедуры

процедуры
end module
Модули
subroutine или function
...
contains
внутренние процедуры
end
Внешние
процедуры


Слайд 4 Модульные процедуры
Описываются в модулях
после оператора contains.

Модульные процедуры Описываются в модулях после оператора contains. Обладают явным интерфейсом.

Обладают явным интерфейсом.

Имеют доступ ко всем объектам модуля


(типы данных, переменные, внутренние процедуры)
при несовпадении имён

Могут содержать
другие внутренние процедуры.

Слайд 5 Внутренние процедуры
Описываются в головной программе
после оператора

Внутренние процедуры Описываются в головной программе после оператора contains. Обладают явным

contains.

Обладают явным интерфейсом.

Имеют доступ ко всем объектам


головной программы
(типы данных, переменные, внутренние процедуры) при несовпадении имён

Не могут содержать
другие внутренние процедуры.

Слайд 6 Внешние процедуры
Описываются отдельно от
головной программы или

Внешние процедуры Описываются отдельно от головной программы или в других файлах.

в других файлах.

Обладают неявным интерфейсом.

Обмен данными с

головной программы происходит
посредством формальных параметров.

Могут содержать другие внутренние процедуры.

Слайд 7 Функции
тип function имя_функции (формальные

Функциитип function имя_функции (формальные       параметры)	типы

параметры)
типы

формальных параметров
типы внутренних переменных
исполняемые операторы
имя_функции = вычисленное значение
end function имя_функции

Результатом может выступать также переменная описанная в операторе result
после объявления функции.


Слайд 8 Функции
Пример.
Функция представлена тригонометрическим рядом
Тип функции – вещественный;

формальные параметры

ФункцииПример.Функция представлена тригонометрическим рядомТип функции – вещественный;формальные параметры – x -вещественный,


x -вещественный, k -целый;

внутренние переменные – сумма (вещественный),
индекс

суммирования (целый).

Слайд 9 !**************************************************
!

!**************************************************!      Функция f(x)!**************************************************real function f(x,N)!------------- формальные

Функция f(x)
!**************************************************
real function f(x,N)
!------------- формальные параметры

---------------
real x
integer N
!------------- внутренние переменные --------------
real sum
integer k
!--------------------------------------------------
sum = 0.0d0
do k = 1,N
sum = sum + sin(k*x)/k
end do
f = sum ! результат присвоили имени функции
end function f

Функции


Слайд 10 Вызов функции
Вызов созданной функции
аналогичен вызову стандартной функции
program

Вызов функцииВызов созданной функции аналогичен вызову стандартной функцииprogram FX real res

FX
real res
res = f(0.5, 100) ! вызов

функции
write(*,*) res
end

!**************************************************
! Функция f(x)
!**************************************************
real function f(x,N)
...
end function f

фактические
параметры
0.5d0, 100

формальные
параметры
x, N


Слайд 11 Вызов функции
Вызов функции без параметров
program func2

write(*,*) pi()

Вызов функцииВызов функции без параметровprogram func2 write(*,*) pi() end!**************************************************!  Функция



end

!**************************************************
! Функция возвращает число Пи
!**************************************************
real function

pi()
pi = 2.0*acos(0.0)
end function pi

Слайд 12 Вызов функции
При вызове должны соответствовать:

1) тип функции

Вызов функции При вызове должны соответствовать:1) тип функции и тип переменной,

и тип переменной, которой присваивается результат функции

2) тип формальных

и фактических параметров

Слайд 13 Подпрограммы
subroutine имя_подпрограммы ( формальные

Подпрограммыsubroutine имя_подпрограммы ( формальные

параметры )
типы формальных параметров
типы внутренних переменных
операторы описания
исполняемые операторы
end subroutine имя_подпрограммы

Слайд 14 Подпрограммы
Подпрограмма печати
прямоугольной таблицы символов
* * * *

ПодпрограммыПодпрограмма печати прямоугольной таблицы символов* * * * * * *

* * * *
* * * * * *

* *
* * * * * * * *



M

N

формальные параметры –
M, Т (целый), CH (символьный);

внутренние переменные –
индексы таблицы (целый).


Слайд 15 Подпрограммы
!**************************************************
! Подпрограмма печати таблицы символов
!**************************************************
subroutine

Подпрограммы!**************************************************!  Подпрограмма печати таблицы символов!**************************************************subroutine table(M,N,CH)!------------- формальные параметры --------------- integer

table(M,N,CH)
!------------- формальные параметры ---------------
integer M,N
character CH
!------------- внутренние

переменные --------------
integer i,j
!--------------------------------------------------
do k = 1,M
do j = 1,N
write(*,"(A,\)") CH
end do
write(*,*)
end do
end subroutine table

Слайд 16 Вызов подпрограммы
Оператор call вызывает подпрограмму
program sub

call table(4,7,'*')

Вызов подпрограммыОператор call вызывает подпрограммуprogram sub call table(4,7,'*') end!**************************************************!  Подпрограмма



end
!**************************************************
! Подпрограмма печати таблицы символов
!**************************************************
subroutine table(M,N,CH)
!-------------

формальные параметры ---------------
...
end subroutine table

соответствие
фактических
и формальных
параметров


Слайд 17 Внутренние переменные
Внутренние переменные
доступны и используются внутри процедур.

Внутренние

Внутренние переменныеВнутренние переменные доступны и используются внутри процедур.Внутренние переменные получившие инициализацию


переменные получившие инициализацию
являются статическими,
т.е. память выделяется на

этапе компиляции
(неявно обладают атрибутом static).

Атрибут automatic устанавливает
переменные автоматическими,
т.е. память выделяется во время работы программы.

Слайд 18 program static_var

call sub() ! M = 1

program static_var call sub() ! M = 1 call sub() !

call sub() ! M = 2
call sub() !

M = 3

end


subroutine sub()
integer :: M = 0
M = M + 1
write(*,*) M
end subroutine sub

program static_var

call sub() ! M = 1
call sub() ! M = 1
call sub() ! M = 1

end

subroutine sub()
integer , automatic :: M
M = 0
M = M + 1
write(*,*) M
end subroutine sub

Внутренние переменные


Слайд 19 Передача параметров
Формальные параметры
1) входные, intent(in)
2) выходные, intent(out)
3)

Передача параметровФормальные параметры1) входные, intent(in)2) выходные, intent(out)3) входные/выходные, intent(inout)subroutine sub(a,b,c) integer,

входные/выходные, intent(inout)
subroutine sub(a,b,c)
integer, intent(in) :: a

real, intent(out) :: b
character, intent(inout) :: c
...
end subroutine sub

По умолчанию все параметры имеют атрибут inout, т.к. передаются по ссылке.


Слайд 20 Вид связи intent(in)
Принимают значение от
соответствующего фактического параметра

Вид связи intent(in)Принимают значение от соответствующего фактического параметра и не могут


и не могут изменяться при выполнении процедуры.

Соответствующими
фактическими

параметрами могут быть
выражения, переменные, значения, константы.

program param_in
call sub(100)
end

subroutine sub(a)
integer, intent(in) :: a ! входной параметр
...
end subroutine sub


Слайд 21 Вид связи intent(out)
Параметры передают свое значение
соответствующему фактическому

Вид связи intent(out)Параметры передают свое значение соответствующему фактическому параметру и предназначены

параметру и предназначены для вывода данных из процедуры.


Соответствующий

фактический параметр
должен быть переменной.

program param_out
call sub(100) ! ошибка, ожидалась переменная
end

subroutine sub(a)
integer, intent(out) :: a ! выходной параметр
...
end subroutine sub


Слайд 22 Вид связи intent(inout)
Параметры могут как принимать
значения от

Вид связи intent(inout)Параметры могут как принимать значения от фактического параметра, так

фактического параметра,
так и передавать данные в фактический параметр.


Соответствующие фактические параметры должны быть переменными.

program param_inout
integer :: q = 80
call sub(q)
end

subroutine sub(a)
integer, intent(inout) :: a ! входной/выходной
... ! параметр
end subroutine sub


Слайд 23 Optional параметры
Атрибут optional устанавливает
формальные параметры необязательными.

Функция present

Optional параметрыАтрибут optional устанавливает формальные параметры необязательными.Функция present проверяет присутствие необязательного

проверяет присутствие необязательного параметра при вызове процедуры.

При отсутствии проверки

функцией present возможны ошибки выполнения для параметров с
видом связи intent(out, inout).

Процедура должна иметь явный интерфейс.

Слайд 24 Optional параметры
program param_in
real res
res = logarithm(144.0,base

Optional параметрыprogram param_in real res res = logarithm(144.0,base = 12.0) write(*,*)

= 12.0)
write(*,*) res

CONTAINS
real function logarithm(a, base)
real,

intent(in) :: a
real, intent(in), optional :: base
if (present(base)) then
logarithm = log(a)/log(base)
else
logarithm = log10(a)
end if
end function logarithm

END

Слайд 25 Область видимости
*Объекты описанные в головной программе доступны во

Область видимости*Объекты описанные в головной программе доступны во внутренних процедурах, недоступны

внутренних процедурах, недоступны во внешних.


Объекты описанные во внутренней, внешней

процедурах доступны только в них самих.


При совпадении имен объектов головной программы и внутренней или внешней процедур,
объекты являются разными.

*Объекты – переменные, типы данных, внутренние процедуры
(для головной программы или внешней процедуры)


Слайд 26 Область видимости
program region
integer a, b; integer

Область видимостиprogram region integer a, b; integer c, d ...contains !

c, d
...
contains ! -------------------------
subroutine sub (a,b)

integer q, p
...
end subroutine sub
END
! **********************************
subroutine proc(a,b)
integer a, b; integer c, d

contains
subroutine small(a,b)
integer f, q
...
end subroutine small
end subroutine proc

Слайд 27 Область видимости
program array
integer, parameter :: M =

Область видимостиprogram array integer, parameter :: M = 10 integer ::

10
integer :: A(M) = [2,4,6,8,9,1,1,1,1,1]

call PrintArray()

contains

subroutine PrintArray() ! нет формальных параметров
integer k ! доступ к массиву A
do k = 1,M ! из головной программы
write(*,"(i6,\)") A(k)
end do
write(*,*)
end subroutine PrintArray

END

Слайд 28 Оператор interface
Почему при компиляции выдаётся ошибка ?
program question

Оператор interfaceПочему при компиляции выдаётся ошибка ?program question write(*,*) middle(3.0,2.0)ENDreal function

write(*,*) middle(3.0,2.0)
END

real function middle(a,b)
real a,b
middle = (a+b)/2
end

function middle

По умолчанию тип функции middle – целый.
Функция объявлена как вещественная,
но головная программа об этом "не знает".

Как указать головной программе
про тип функции middle ?


Слайд 29 Оператор interface
interface
тип имя_функции(формальные параметры)
тип формальных параметров

Оператор interfaceinterface тип имя_функции(формальные параметры) тип формальных параметров конец описания функцииend

конец описания функции
end interface
Определяет явно заданный интерфейс.
Используется для внешних

процедур.
Внутренние процедуры обладают явно заданным интерфейсом.

Слайд 30 Оператор interface
program question

interface
real function middle(a,b)
real

Оператор interfaceprogram questioninterface real function middle(a,b) real a,b end function middleend

a,b
end function middle
end interface

write(*,*) middle(3.0,2.0)

END

real function middle(a,b)
real

a,b
middle = (a+b)/2
end function middle

Исправленная версия программы


Слайд 31 Оператор return
program break_function

write(*,*) div(3,0)

contains
integer function div(a,b)

Оператор returnprogram break_functionwrite(*,*) div(3,0)contains integer function div(a,b) integer a,b if (b

integer a,b
if (b == 0) then

div = 0
write(*,*) "ERROR divided by zero"
return
else
div = a/b
end if
end function div
END

Вернуть управление вызывающей
процедуре или головной программе.


Слайд 32 Процедуры как параметры
Универсализация процедур.
основная функция
функции подставляемые
вместо функции fun

Процедуры как параметрыУниверсализация процедур.основная функцияфункции подставляемыевместо функции fun

Слайд 33 Процедуры как параметры
program param_funct
external p, q, s

write(*,*)

Процедуры как параметры program param_functexternal p, q, swrite(*,*) f(0.5, p) !

f(0.5, p) ! p(x) - фактический параметр
write(*,*) f(0.7, q)

! q(x) - фактический параметр
write(*,*) f(1.2, s) ! s(x) - фактический параметр
end
!********************************
real function q(x) ! ---------- функция q(x)
real x
q = x-cos(x)
end function q

real function s(x) ! ---------- функция s(x)
real x
s = sqrt(x)+x
end function s

Слайд 34 Процедуры как параметры
real function p(x) ! ---------- функция

Процедуры как параметрыreal function p(x) ! ---------- функция p(x)real x p

p(x)
real x
p = sin(x)+x
end function p

real function f(x,

fun)

interface ! --- явный интерфейс для внешних функций
real function fun(x)
real x
end function fun
end interface

real x
integer k
f = 0.0
do k = 1,100
f = fun(REAL(k))*x**k+f
end do
end function f

Слайд 35 Процедуры как параметры
Оператор external объявляет, что перечисленные внешние

Процедуры как параметрыОператор external объявляет, что перечисленные внешние процедуры передаются как

процедуры передаются как параметры.
Если хотим передавать стандартные функции как

параметры, то нет смысла писать

program param_funct
external mysin
write(*,*) f(0.5, mysin)
end
!********************************
real function mysin(x) ! ---------- функция q(x)
real x
q = sin(x)
end function mysin


Слайд 36 Процедуры как параметры
Оператор intrinsic объявляет, что перечисленные стандартные

Процедуры как параметрыОператор intrinsic объявляет, что перечисленные стандартные процедуры передаются как

процедуры передаются как параметры.

program param_funct
intrinsic sin
write(*,*) f(0.5,

sin)
end
...

Вместо указания функции в операторе external можно использовать блок interface.


Слайд 37 Процедуры как параметры
program param_funct

interface
real function p(x)

Процедуры как параметрыprogram param_functinterface real function p(x) real x end function

real x
end function p
end interface

interface
real

function f(x, fun)
interface
real function fun(x)
real x
end function fun
end interface
real x
end function
end interface
...

интерфейс
формального параметра-функции

интерфейс
фактического параметра-функции


Слайд 38 Рекурсивные процедуры
Процедура вызывающая сама себя.
recursive – объявление рекурсивной

Рекурсивные процедурыПроцедура вызывающая сама себя.recursive – объявление рекурсивной процедуры.Прямая рекурсия proc

процедуры.
Прямая рекурсия
proc ---> proc ---> proc --->

Косвенная рекурсия
proc

---> sub ---> proc ---> sub --->

Обязательна проверка окончания
рекурсивного вызова.


Слайд 39 Рекурсивный вывод последовательности чисел.
program recurse

call Number(10) !

contains

recursive

Рекурсивный вывод последовательности чисел.program recurse call Number(10) !containsrecursive subroutine Number(N)integer N

subroutine Number(N)
integer N
write(*,*) " N = ", N

if (N == 1) return ! точка останова
call Number(N-1) ! рекурсивный вызов
end subroutine Number

end

Рекурсивные процедуры


Слайд 40 Результирующая переменная, предложение result.
program fact

write(*,*) factorial(10)

contains
recursive

Результирующая переменная, предложение result.program fact write(*,*) factorial(10)contains recursive function factorial(p) result(k)

function factorial(p) result(k)
integer, intent(in) :: p

integer k
if (p == 1) then
k = 1
else
k = p * factorial(p - 1)
end if
end function
end

Рекурсивные процедуры


Слайд 41 Чистые процедуры
Чистые процедуры – процедуры
без побочных эффектов
program

Чистые процедурыЧистые процедуры – процедуры без побочных эффектовprogram side_effect real ::

side_effect
real :: s = 10.0

write(*,*) (f(s)+f(s))/2.0 !

ожидалось 100
! результат 110.5

contains
real function f(x)
real x
f = x*x
x = x+1
end function f

end

Слайд 42 Чистые процедуры
Ключевое слово pure объявляет процедуру чистой.
Для чистых

Чистые процедурыКлючевое слово pure объявляет процедуру чистой.Для чистых процедур характерно ①

процедур характерно
① все формальные параметры функций имеют вид

связи intent(in);
② все формальные параметры подпрограмм имеют вид связи intent(in, out или inout);
③ локальные переменные не имеют атрибут save, не могут быть инициализированы в операторах объявления.
④ отсутствуют операторы В/В, stop.

Все встроенные функции являются чистыми.


Слайд 43 Чистые процедуры
В операторе forall используются только
чистые процедуры.
PROGRAM

Чистые процедурыВ операторе forall используются только чистые процедуры.PROGRAM PURE_FORALLreal :: A(10)

PURE_FORALL
real :: A(10) = -1.0
integer i

forall (i = 1:5,

A(i) < 0)
A(i) = F(A(i))
end forall

contains
real pure function f(x)
real, intent (in) :: x
f = x*x
end function f

END

Слайд 44 Элементные процедуры
Элементные процедуры могут иметь в качестве фактических

Элементные процедурыЭлементные процедуры могут иметь в качестве фактических параметров как скаляры

параметров как скаляры так и массивы.
Элементные функции – чистые

функции, имеющие только скалярные формальные параметры
с видом связи intent(in).
Фактическими параметрами могут быть согласованные массивы.

Пример.
Функции sin, cos, exp, abs - элементные.

Можно записывать:
sin(2.0), sin(a), где a – скаляр
cos(B), abs(A), где A, B - массивы


  • Имя файла: protsedury-naznachenie-protsedur.pptx
  • Количество просмотров: 112
  • Количество скачиваний: 0