Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

6. Встроенные процедуры

ATAN(x) - возвращает арктангенс вещественного аргумента x, выраженный в радианах в интервале -π/2 < ATAN(x) < π/2.

ATAND(x) - возвращает арктангенс вещественного аргумента x, выраженный в градусах в интервале -90 < ATAN(x) < 90.

ATAN2(y, x) - возвращает арктангенс (y/x), выраженный в радианах

винтервале -πATAN2(y, x) ≤ π. Аргументы y и x должны быть вещественного типа с одинаковым значением параметра разновидности и не могут одновременно равняться нулю.

ATAN2D(y, x) - возвращает арктангенс (y/x), выраженный в градусах

винтервале -180 ATAN2D(y, x) 180. Аргументы y и x должны быть

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

Диапазон результатов функций ATAN2 и ATAN2D:

Аргументы

Результат (в рад)

Результат (в град.)

 

 

 

y > 0

Результат > 0

Результат > 0

 

 

 

y = 0 и x > 0

Результат = 0

Результат = 0

 

 

 

y = 0 и x < 0

Результат = π

Результат = 180

y < 0

Результат < 0

Результат < 0

 

 

 

x = 0 и y > 0

Результат = π/2

Результат = 90

 

 

 

x = 0 и y < 0

Результат = -π/2

Результат = -90

Гиперболические тригонометрические функции

SINH(x) - гиперболический синус для выраженного в радианах вещественного аргумента x.

COSH(x) - гиперболический косинус для выраженного в радианах вещественного аргумента x.

TANH(x) - гиперболический тангенс для выраженного в радианах вещественного аргумента x.

6.9. Функции для массивов

Встроенные функции для работы с массивами позволяют выполнять вычисления в массивах, получать справочные данные о массиве и преобразовывать массивы. Встроенные функции обработки массивов рассмотрены в разд. 4.12. Помимо встроенных CVF и FPS содержат дополнительные подпрограмму SORTQQ сортировки одномерного массива и целочисленную функцию BSEARCHQQ бинарного поиска в отсортированном массиве. Для их вызова необходимо сослаться на модуль

MSFLIB.

CALL SORTQQ(adrarray, count, size) - сортирует одномерный массив, адрес которого равен adrarray. Для вычисления адреса применяется

181

О. В. Бартеньев. Современный ФОРТРАН

функция LOC. Сортируемый массив не должен быть производного типа. Параметр count имеет вид связи INOUT и при вызове равен числу элементов массива, подлежащих сортировке, а на выходе - числу реально отсортированных элементов. Тип параметров adrarray, count - стандартный целый.

Параметр size является положительной константой стандартного целого типа (size < 32,767), задающей тип и разновидность типа сортируемого массива. В файле msflib.f90 определены следующие константы:

Константа

Типы массива

SRT$INTEGER1

INTEGER(1)

 

 

SRT$INTEGER2

INTEGER(2) или эквивалентный

 

 

SRT$INTEGER4

INTEGER(4) или эквивалентный

 

 

SRT$REAL4

REAL(4) или эквивалентный

SRT$REAL8

REAL(8) или эквивалентный

 

 

Если величина size не является именованной константой приведенной таблицы и меньше чем 32'767, то предполагается, что задан символьный массив, длина элемента которого равна size.

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

Предупреждение. Адрес сортируемого массива должен быть вычислен функцией LOC. Значения параметров count и size должны точно описывать характеристики массива. Если же подпрограмма SORTQQ получила неверные параметры, то будет выполнена попытка сортировки некоторой области памяти. Если память принадлежит текущему процессу, то сортировка будет выполнена, иначе операционная система выполнит функции защиты памяти и остановит вычисления.

BSEARCHQQ(adrkey, adrarray, length, size) - выполняет бинарный поиск значения, которое содержится в переменной, расположенной по адресу adrkey. Поиск выполняется в отсортированном одномерном массиве, первый элемент которого имеет адрес adrarray. Функция возвращает индекс искомого элемента или 0, если элемент не найден. Тип результата и параметров adrkey, adrarray, length и size - стандартный целый. Элементы массива не могут быть производного типа. Параметр length равен числу элементов массива. Смысл параметра size пояснен при рассмотрении подпрограммы SORTQQ.

До выполнения поиска массив должен быть отсортирован по возрастанию значений его элементов.

182

! Поиск всех равных ke элементов
! Вычислим, сколько раз в массиве a ! встречается число ke
! Запомним размер массива a
! Заполним массив a случайным образом
! Адрес массива a
! Сортировка массива a

6. Встроенные процедуры

Предупреждение. Адреса сортируемого массива и элемента должны быть вычислены функцией LOC. Значения параметров count и size должны точно описывать характеристики массива. К тому же искомый элемент должен иметь тот же тип и разновидность типа, что и массив, в котором выполняется поиск. Эти характеристики задаются параметром size. Если же функция BSEARCHQQ получила неверные параметры, то, если память принадлежит текущему процессу, будет выполнена попытка поиска в некоторой области памяти, иначе операционная система выполнит функции защиты памяти и остановит вычисления.

Пример. Найти в массиве все равные заданному значению элементы. Для решения предварительно отсортируем массив, а далее выполним

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

use msflib

integer(4) a(20000), n, n2, ada, i, k integer(4) :: ke = 234

real(4) rv

n = size(a); n2 = n do i = 1, n

call random(rv)

a(i) = int(rv * 1000.0) end do

ada = loc(a)

call sortqq(ada, n, SRT$INTEGER4) if(n .ne. n2 ) stop 'Sorting error'

k = bsearchqq(loc(ke), ada, n, SRT$INTEGER4) if(k == 0) then

print *, 'Элемент ke = ', ke, ' не найден' stop

end if i = k

do while(a(i) == ke .and. i <= n)

print *, 'Элемент с индексом i = ', i, ' равен ke; ke = ', ke i = i + 1

end do

print *, 'Всего найдено элементов: ', i - k ! 21 end

На самом деле результат неверен. Действительно, вычислим nke - число равных ke элементов в цикле

nke = 0

 

do i = 1, size(a)

 

if(a(i) == ke) nke = nke + 1

 

end do

 

print *, nke

! 28

183

О. В. Бартеньев. Современный ФОРТРАН

Оказывается, что nke = 28, а не 21, как это было найдено выше. Дело в том, что BSEARCHQQ в общем случае находит в упорядоченном векторе не первый равный заданному числу элемент, а один из последующих. Чтобы вернуться к первому искомому элементу, в программу после вызова BSEARCHQQ нужно добавить код

if(k > 1) then

! Если в векторе есть элемент, равный ke,

it = k

! выполним перемещение назад, корректируя

do k = it, 1, -1

! величину k - позицию первого равного ke элемента

if(a(k) /= ke) exit

 

end do

 

k = k + 1

 

end if

 

6.10. Справочные функции для любых типов

ALLOCATED(array) - возвращает .TRUE., если память выделена под массив array, .FALSE. - если не выделена. Параметр array должен иметь атрибут ALLOCATABLE. Результат будет неопределенным, если не определен статус массива array. Результат имеет стандартный логический тип.

Пример:

real, allocatable :: a(:)

...

if(.not. allocated(a)) allocate(a(10))

ASSOCIATED(pointer [, target]). Параметр pointer должен быть ссылкой. Состояние привязки pointer не должно быть неопределенным. Если параметр target опущен, то функция ASSOCIATED возвращает .TRUE., если ссылка pointer прикреплена к какому-либо адресату. Если параметр target задан и имеет атрибут TARGET, то результат равен .TRUE., если ссылка pointer прикреплена к target. Если target задан и имеет атрибут POINTER, то результат равен .TRUE., если как pointer, так и target прикреплены к одному адресату. При этом состояние привязки ссылки target не должно быть неопределенным. Во всех других случаях результат равен .FALSE. Результат имеет стандартный логический тип. В случае массивов .TRUE. возвращается, если совпадают формы аргументов и если элементы ссылки в порядке их следования прикреплены к соответствующим элементам адресата.

Пример:

real, pointer :: a(:), b(:), c(:)

 

real, target :: e(10)

 

a => e

! Назначение ссылки

b => e

 

c => e(1:10:2)

! Ссылка прикрепляется к сечению массива

print *, associated(a, e)

! T

184