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

4. Массивы

type wip

 

real val

 

integer, pointer :: ival

 

end type wip

 

type(wip) elem, list(20)

 

allocate(elem%ival)

! Правильно

allocate(list(5)%ival)

! Правильно

allocate(list(1:15:2)%ival)

! Ошибка

4.6. Присваивание массивов

Как было показано выше, массив может быть определен при инициализации в операторах объявления типа или в операторе DATA. Также значения элементов массива можно изменить, присвоив массиву или его сечению результат выражения. Операндом такого выражения может быть конструктор массива. Например:

real b(5), pi /3.141593/

 

 

 

 

 

integer a(5)

 

 

 

 

 

b = tan(pi / 4)

! Присваивание значения выражения всему массиву

b(3) = -1.0

! Присваивание значения третьему элементу массива

write(*,'(7f5.1)') b

! 1.0

1.0 -1.0 1.0 1.0

a = 2 * (/ 1, 2, 3, 4, 5 /)

! Конструктор массива как операнд выражения

write(*, *) a

!

2

4

6

8 10

Конструктор массива задает одномерный массив и имеет вид: (/ список-значений /)

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

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

Неявный цикл конструктора массива имеет вид: (выражение | неявный цикл, dovar = start, stop [, inc])

dovar - целочисленная скалярная переменная (параметр цикла).

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

Неявный цикл добавляет в список значений

MAX(stop - start + INT(inc / inc), 0)

элементов. Выражение может содержать dovar. Возможна организация вложенных неявных циклов.

Если в списке появляется многомерный массив, то его значения берутся в порядке их размещения в памяти ЭВМ. Конструктор массива позволяет сгенерировать значения одномерного массива. При задании значений

119

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

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

Пример 1. Элементы списка - массивы и простой скаляр.

integer b(7), c(2, 3), i, j

 

 

 

 

 

 

 

 

 

 

 

integer a(3) / 3, 2, 1 /

 

 

 

 

 

 

 

 

 

 

 

b = (/ a, a, mod(a(1), 2) /)

 

! В списке одномерный массив и скаляр

write(*,'(10i3)') b

 

 

!

3

2

1

3

2

1

1

 

 

data ((c(i, j), j = 1, 3), i = 1, 2) /3*1, 3*2/

 

 

 

 

 

 

 

b = (/ c, -1 /)

 

 

 

! В списке двумерный массив и скаляр

write(*, '(10i3)') b

 

 

!

1

2

1

2 1 2 -1

 

 

 

Пример 2. Элементы списка - неявные циклы.

 

 

 

 

integer a(5), i, k

 

 

 

 

 

 

 

 

 

 

 

 

real :: r(7)

 

 

 

 

 

 

 

 

 

 

 

 

 

real, parameter :: pi = 3.141593

 

 

 

 

 

 

 

 

 

 

logical fl(10)

 

 

 

 

 

 

 

 

 

 

 

 

 

a = (/ (i, i = 1, 5) /)

 

 

 

 

 

 

 

 

 

 

 

 

write(*, *) a

 

 

 

!

1

2

3

4

5

 

 

 

 

r = (/(cos(real(k) * pi / 180.0), k = 1, 14, 2)/)

 

 

 

 

 

 

write(*, '(10f5.1)') r

 

 

!

1.0

1.0

1.0

1.0

 

1.0

1.0

1.0

fl = (/(.true., k = 1, 5), (.false., k = 6, 10)/)

 

 

 

 

 

 

 

write(*, *) fl

 

 

 

!

T

T

T

T T F F F F F

 

Пример 3. Присваивание значений двумерному массиву.

 

integer

a(5, 2), i, j

 

 

! Элементы списка в конструкторе массива b -

integer

b(3, 4)

 

 

 

! вложенные неявные циклы

 

 

a = reshape(source = (/ (2*i, i = 2, 11) /), shape = (/ 5, 2 /))

 

 

 

b = reshape((/ ((i*j, i = 1,3), j = 3, 6) /), shape = (/ 3, 4 /))

 

 

 

 

write(*, '(10i3)') a

 

 

 

 

 

 

 

 

 

 

 

 

write(*, '(4i3)') ((b(i, j), j = 1, 4), i = 1, 3)

 

 

 

 

 

 

 

 

Результат:

 

 

 

 

 

 

 

 

 

 

 

 

4

6

8

10

12

14

16

 

18

20

22

 

 

 

 

 

3

4

5

6

 

 

 

 

 

 

 

 

 

 

 

 

6

8

10

12

 

 

 

 

 

 

 

 

 

 

 

 

9

12

15

18

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример 4. Смесь неявного списка и простых значений.

 

integer a(10), i

 

 

 

 

 

 

 

 

 

 

 

 

 

a = (/ 4, 7, (2*i, i = 1, 8) /)

 

 

 

 

 

 

 

 

 

 

 

write(*, '(10i3)') a

 

 

!

4

7

2

4

6

8

10

12

14 16

Помимо использования в конструкторе массива функции RESHAPE, присваивание значений многомерному массиву можно также выполнить, последовательно применив несколько конструкторов массива, каждый раз определяя линейное сечение массива, например:

120