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

риложение3. Организация данных

Вывод строки st на экран произойдет так: в первой позиции начальной строки выведется символ '1'; затем прозвучат два звуковых сигнала; далее после выполнения табуляции в строке будут выведены символы '1-1'; после этого будет выполнен переход в первую позицию новой строки экрана и выведется символ '2'; далее последуют завершающие пробелы и null- символ.

Ввосьмеричном коде значение o находится в диапазоне от 0 до 7.

Вшестнадцатеричном коде h принимает значения от 0 до F.

При записи СИ-строк могут быть использованы двойные кавычки, например апостроф может быть задан так:

character quo /"\'"c/

! или так: '\'''c

Также можно задать символьную константу нулевой длины.

character ch /''/

! '' - константа нулевой длины

print *, len(ch), len_trim(ch)

!

1

0

Поскольку символьные строки завершаются null-символом, то при их конкатенации (объединении) этот символ, если не принять специальных мер, окажется внутри результирующей строки, например:

character(5) :: st1 = 'ab'c, st2 = '12'c

 

 

 

character(10) res

 

 

 

res = st1 // st2

! Вернет ab\0 12\0

print *, ichar(res(3:3)), ichar(res(8:8))

!

0

0

Длинная символьная буквальная константа, т. е. константа, которую не удается разместить на одной строке, задается с использованием символов переноса, например:

character(len = 255) :: stlong = 'I am a very, very, very long

&

&the longest in the world symbol constant (indeed very long -

&

&longer any constant you know)'

 

Замечание. В начале строки продолжения символ переноса может быть опущен.

3.6. Задание именованных констант

Защитить данные от изменений в процессе вычислений можно, задав их в виде именованных констант. Именованная константа - это именованный объект данных с атрибутом PARAMETER. Задание атрибута можно выполнить отдельным оператором:

PARAMETER [(] name = const [, name = const ...] [)]

или в операторе объявления типа:

typespec, PARAMETER [, attrs] :: name = const [, name = const] ...

typespec - любая спецификация типа данных.

name - имя константы. Не может быть именем подобъекта.

61

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

const - константное выражение. Выражение может включать имена констант, ранее введенных в той же программной единице. Допустимые операции константного выражения - арифметические и логические. Если тип константного выражения отличается от типа name, то любые операции преобразования типов выполняются автоматически.

attrs - иные возможные атрибуты константы.

Именованная константа может быть массивом или объектом производного типа. В первом случае для ее задания используется конструктор массива, во втором - конструктор производного типа.

При использовании оператора PARAMETER задание именованной логической, символьной и комплексной константы должно выполняться после описания ее типа. Типы целочисленных и вещественных констант могут быть установлены в соответствии с существующими умолчаниями о типах данных. Попытки изменить значение именованной константы при помощи оператора присваивания илиоператора READ приведут к ошибке компиляции.

Именованная константа name не может быть компонентом производного типа данных, элементом массива и ассоциированным объектом данных, примененным, например, в операторах EQUIVALENCE или COMMON. Также именованная константа не может появляться в спецификации управляющего передачей данных формата. При использовании константы в качестве фактического параметра процедуры соответствующему формальному параметру следует задать вид связи INTENT(IN).

Пример 1. Задание именованных констант в операторе PARAMETER.

character(1) bell

 

parameter (bell = '\a'C)

! СИ-строка

parameter (g = 9.81, pi = 3.14159) ! Обрамляющие круглые скобки можно опустить

complex(4) z

! Сначала объявляется тип,

parameter (z = -(12.45, 6.784))

! а затем задается значение

write(*, *) bell

! Звуковой сигнал

write(*, *) (bell, i = 1, 10)

! Продолжительный сигнал

Пример 2. Использование PARAMETER в качестве атрибута.

program pa

 

 

complex(4), parameter :: z = -(12.45, 6.784)

! a - массив-константа

integer(2), parameter :: a(5) = (/ 1, 3, 5, 7, 9 /)

type made

 

! Задание типа made

character(len = 8) bday

 

 

character(len = 5) place

 

 

end type made

 

 

! Задание константы pro типа made

 

type(made), parameter :: pro = made('08/01/90', 'Mircu') write(*,'(1x, a10, 2x, a5)') pro

end program pa

62

риложение3. Организация данных

3.7. Задание начальных значений переменных. Оператор DATA

В Фортране существует две возможности задания начальных значений переменных: в операторах объявления типа и оператором DATA. Начальные значения присваиваются переменным на этапе компиляции программы. Синтаксис оператора DATA:

DATA список имен /список значений/

&

[, список имен /список значений/] ...

 

Список имен - список переменных, их подобъектов и циклических списков. Элементы списка разделяются запятыми. Индексы элементов массивов и подстрок в списке имен должны быть целочисленными константными выражениями.

Список значений - список констант и/или повторяющихся констант, разделенных запятыми.

Повторяющаяся константа - элемент вида n*val, где n - целая положительная константа (буквальная или именованная); * - символповторитель. Такой элемент в списке значений означает, что n подряд расположенных переменных в списке имен получат в результате выполнения оператора DATA значение val.

Пример:

real(4) a(6, 7), d, r, eps, cmax

 

character st*6, sth*20, chr

 

integer(4) m, n

 

logical(1) flag, yesno

 

data a /1, 2, 3, 4, 5, 6, 7, 35*0/,

&

d, r /4, 6.7/,

&

eps /1.0e-8/, cmax /2.4e12/

 

data st /'Error!'/, chr /'Y'/, m, n /6, 7/

 

data sth /18hHollerith constant/

 

data flag, yesno /.true., .false./

 

При большом числе инициализируемых переменных следует для улучшения читаемости программы использовать строки продолжения или несколько операторов DATA.

Переменные производного типа инициализируются посредством применения в DATA конструктора производного типа (разд. 3.9.2.1) или путем инициализации их отдельных компонентов:

type pair

 

real x, y

 

end type pair

! Используем для инициализации pt1

type(pair) pt1, pt2

data pt1 / pair(1.0, 1.0) /

! конструктор структуры

63

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

data pt2.x, pt2.y / 2.0, 2.0 /

! Инициализации отдельных компонентов

print '(1x, 4f5.1)', pt1, pt2

! 1.0 1.0 2.0 2.0

Переменные, явно получившие атрибут AUTOMATIC, не могут появляться в операторе DATA.

При необходимости тип данных каждого числового или логического элемента в списке значений преобразовывается в тип, заданный для соответствующей переменной в списке имен. Например, для инициализации вещественной переменной можно использовать целую буквальную константу.

Число значений в каждом списке значений должно совпадать с числом элементов в соответствующем списке имен. Нельзя дважды в операторе DATA инициализировать одну и ту же переменную.

Инициализация элементов двумерного массива выполняется по столбцам, например:

real a(3, 2)

data a / 1, 2, 3, 4, 5, 6 / ! Эта запись эквивалентна следующей data a(1,1), a(2,1), a(3,1), a(3,2), a(2,2), a(3,2) /1, 2, 3, 4, 5, 6/

Если символьный элемент в списке значений короче, чем соответствующая переменная или элемент массива в списке имен, его размер увеличивается до длины переменной посредством добавления завершающих пробелов. Если же символьный элемент длиннее соответствующей переменной, то избыточные символы отсекаются.

Формальные параметры, переменные неименованных common-блоков и имена функций не могут появляться в операторе DATA. Переменные именованных common-блоков могут появляться в операторе DATA, если он используется в программной единице BLOCK DATA.

Оператор DATA может содержать в списке имен циклические списки: (dolist, dovar = start, stop [, inc])

dolist - элемент массива, индексом которого является переменная dovar. start, stop, inc - целочисленные константные выражения, определяющие диапазон и шаг изменения dovar. Если выражение inc отсутствует, то шаг

устанавливается равным единице.

При использовании циклического списка можно выполнить инициализацию части массива. Возможна организация вложенных циклических списков.

Пример:

integer(4) a(20), b(5, 30), c(15, 15), row, col

 

integer, parameter :: rma = 10, cma = 5

 

data (a(i), i = 4, 16, 2) / 4, 6, 8, 10, 12, 14, 16/

&

((b(i, j), j = 1, 12), i = 1, 2) /24 * -3/

&

((c(row, col), row = 1, rma), col = 1, cma) / 50 * 10/

64