End function integ
! Процедуры, описывающие подынтегральные функции real function f1 (x) implicit none real, intent(in):: x f1=cos(x)**2 End function f1 real function f2 (x) implicit none real, intent(in)::x f2=1./x End function f2 !Главная программа Program main implicit none real a, b, sq, integ integer n real, external:: f1, f2!описание внешних функций read *, a, b, n sq=abs (integ (f1, a, b, n)- integ (f2, a, b, n)) print '(A, F5.1, A, F5.2, A, F10.2)',& 'площадь между 2 кривыми на отр. от', a, 'до', b, ' =', sq End program main Пример программы вариант 2 Теперь видоизменим проект. Используя знания о модулях, создадим, как один из вариантов проект, в который поместим модуль общих для вычисления интеграла описаний (a, b, n) global, и модуль metod, содержащий модульную процедуру (в нее поместим метод вычисления интеграла). Главную программу и описания подынтегральных функций поместим в разные файлы или эти процедуры могут быть помещены в одном файле с главной программой. ! Модуль общих описаний. !В него включим пределы интегрирования, число разбиений участка интегрирования. Module global implicit none real a, b integer n End module global !Модуль в котором помещена модульная процедура Module metod use global Contains real function integ (f)! функция не имеет параметров (a, b n), implicit none!т.к. они используются как глобальные integer I!данные, описанные в модуле real h, f, s s=0 h=(b-a)/n do i = 1, n s=s+f(a+i*h) Enddo integ =s*h end function integ End module metod real function f1 (x) implicit none real, intent(in):: x f1=cos(x)**2 End function f1 real function f2 (x) implicit none real, intent(in):: x f2=1./x End function f2
!Главная программа. Program main Use global Use metod implicit none real, external:: f1, f2 !объявление в операторе описания типа real sq read *, a, b, n sq=abs (integ (f1)-integ (f2)) print '(A,F10.2)', 'пл. между 2 кривыми =', sq End program main Модульная процедура, в которую помещен метод дает возможность не описывать интерфейс этой процедуры, т.к. к модульной процедуре явный интерфейс. Все проверки соответствия формальных и фактических параметров будут выявлены уже на этапе компиляции. В модуле global можно задать начальные значения переменным a, b, n с помощью оператора Data или в операторах описания real a/.1/, b/.5/ integer n/100/. Пример программы вариант 3 Составим теперь другой вариант проекта ( pr_ext_1 ). Напишем два модуля (разместим их в разных файлах). Поместим в модуль I_Face_F интерфейсный блок для подынтегральных функций f1 и f2., а в модуль I_Face_Int - интерфейсный блок для функции, вычисляющей значение интеграла. Организация 2 –х модулей исключительно из-за разделения функций. Процедуру (функцию), вычисляющую значение интеграла оформим в виде внешней процедуры и при выполнении поместим в отдельный файл. Главную программу и описание подынтегральных функций также поместим в отдельные файлы (у нас проект будет состоять из 4 файлов). Процедура, для которой написан интерфейсный блок, обладает всегда явным интерфейсом (ошибки в типах параметров будут выявлены уже на этапе компиляции). В этом случае, заданные в интерфейсном блоке процедуры обладают автоматически атрибутом external, и их можно использовать в качестве параметров процедур без дополнительного объявления ( в главной программе не требуется объявления external f). Объявлять тип функции, вычисляющей значение интеграла, не требуется. Однако, в интерфейсном блоке в модуле I_Face_Int при описании типов формальных параметров и видов связи, обязательно надо указать real, external:: f, без атрибута intent(in). !Модули интерфейсов ( заголовочный файл ) !модуль интерфейсов подынтегральных функций Module I_Face_F Interface real function f1 (x) implicit none real,intent(in)::x End function f1 real function f2 (x) implicit none real,intent(in)::x End function f2 end interface End module I_Face_F !модуль интерфейса функции для вычисления интеграла Module I_Face_Int interface real function integ (f, a, b, n) implicit none real,intent(in):: a, b integer,intent(in):: n real, external:: f End function integ end interface End module I_Face_Int Описания подынтегральных функций !описание 1 функции real function f1 (x) implicit none real,intent(in)::x f1=cos(x)**2
|