Шпаргалки по Fortrany (massiv)

Посмотреть архив целиком

Массив - это объект данных, который содержит конечное число скаляр­ных

данных одного типа. В отличие от простой переменной массив облада­ет атрибутом DIMENSION.

Массивы заданной формы

Границы размерностей массивов - формальных параметров могут определяться передаваемыми в процедуру

значениями других параметров. Так, в рассмотренной в разд. 6.3.1 задаче пользовательская функция md

имеет синтаксис

result = md(d,n)

где d - массив - формальный параметр заданной формы; an- целочисленный скаляр, используемый

для задания размера массива d.

функция вызывается 3 раза:

а = md(a, na); mb = md(b, nb); me = md(c, nc)

При каждом вызове фактическим параметром является массив той же формы, что

и массив - формальный параметр. Передаваемые размерности пассивов имеют разные значения.

Однако форма ассоциируемых при вызове процедуры массивов факти­ческих и формальных

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

Так это происходит при создании подпрограммы обмена содержимого двух многомерных массивов:

integer, parameter :: n = 5, m = 10, k = m*n

real a(m, n) /k*1.0/, b(m, n) /k*2.0/

call swap(a, b, m, n)

write(*, *) b

end

subroutine swap(a, b, m, n)



integer m, n

real a(m*n), b(m*n) ! а и b – массивы заданной формы)

real c(size(a)) ! с - автоматический массив

с = а

a= b

end subroutine swap

В общем случае для формального параметра - массива могут вычислять­ся как нижняя,

так и верхняя границы размерности. Общий вид размерно­сти таких массивов:

[нижняя граница] : [верхняя граница]

Нижняя и верхняя границы - целочисленные описательные выражения. Вычисленные

границы массива фиксируются на время выполнения проце­дуры и не меняются при

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

При работе с такими массивами необходимо следить, чтобы размер мас­сива - формального

параметра не превосходил размера ассоциированного с ним массива - фактического параметра.

Если фактическим параметром является многомерный массив и соот­ветствующим ему формальным

параметром является массив заданной формы с тем же числом измерений, то для правильного

ассоциирования необ­ходимо указать размерности массива - формального параметра такими же,

Как и у массива - фактического параметра. Исключение может составлять верхняя граница последней

размерности массива, которая может меньше соответствующей границы массива - фактического параметра.

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

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

Массивы, перенимающие форму

Такие массивы - формальные параметры перенимают форму у соответ­ствующего фактического

параметра. В результате ранг и форма фактического и формального параметров совпадают. При описании

формы фор­мального параметра каждая размерность имеет вид: [нижняя граница] :

где нижняя граница - это целое описательное выражение, которое може! зависеть от данных в процедуре

или других параметров. Если нижняя гра­ница опущена, то ее значение по умолчанию равно единице.

Например» ПРИ вызове

real х(0:3, 0:6, 0:8)

interface

subroutine asub(a)

real a(:, :, :)

end

end interface

call asub(x)

Соответствующий перенимающий форму массив объявляется так:

subroutine asub(a)

real a(:, :, :)

prnt *, lbound(a, 3), ubound(a, 3) ! 1 9

Так как нижняя граница в описании массива а отсутствует, то после вызова подпрограммы в ней будет

определен массив а(4, 7, 9). Если нужно сохранить соответствие границ, то массив а следует объявить так:

real a(0:, 0:, 0:)

В интерфейсном блоке по-прежнему массив а можно объявить:

real а(:, :, :)

Процедуры, содержащие в качестве формальных параметров перенимающие форму массивы,

должны обладать явно заданным интерфейсом.

Сортировка

Основное назначение сортировки - обеспечить быстрый поиск данных. Помимо этого, в отсортированном

файле или массиве гораздо быстрее вы­полнять многие вычисления.

Сортировка методом пузырька

Сортировка методом пузырька наиболее проста для реализации, но име­ет по сравнению

с другими методами наименьшую вычислительную эффек­тивность.

Не теряя общности, будем для простоты изложения в дальнейшем рас­сматривать задачу

сортировки массива х целых чисел, в котором первые я чисел должны быть

отсортированы так, чтобы хi <= Xj для 1 <=i <= j <= п.

Идея сортировки методом пузырька состоит в том, чтобы просмотреть мас­сив последовательно

несколько раз. Один просмотр состоит из сравнения каж­дого элемента массива со следующим

за ним элементом (xi сравнивается с xj+1) и обмена этих двух элементов,

если они располагаются не в нужном порядке (если Xi >xi+1)

Быстрая сортировка

Рассмотрим массив х

25 37 12 33 48 57 92 86

В нем число 48 характеризуется тем, что, во-первых, все расположенные левее него числа меньше 48

и, во-вторых, числа, расположенные правее него больше 48. Назовем такое число разделителем массива

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

и для чисел после него. Кроме того, сам разделитель нахо­дится в нужной позиции, то есть в

дальнейшей сортировке он уже не рас­сматривается.

Размещаемые массивы

рассмотренный массив marks является статическим - его размер не может быть изменен в процессе вычислений,

поэтому мы вынуждены задать 6го размер с некоторым запасом (чтобы иметь возможность использовать массив

для любой студенческой группы). Это приводит к тому, что про­грамма, как правило, занимает больше памяти,

чем это требуется на самом деле. Подобного перерасхода памяти можно избежать, если применить ди­намический

массив и каждый раз выделять под него столько памяти, Сколько нужно. Работа с динамическим массивом происходит так:

выполняется объявление размещаемого массива. В отличие от статиче­ских размещаемые массивы объявляются с атрибутом ALLOCATABLE.

Кроме того, каждое измерение размещаемого массива задается в виде

двоеточия, например:
in
teger, allocatable, dimension(:) :: marks

определяется размер массива;

  • оператором ALLOCATE выделяется память под массив;

  • после выполнения вычислений выделенная память освобождается. Это

  • выполняется оператором DEALLOCATE;

  • после этого массиву вновь может быть выделена свежая область памяти.

При размещении массива параметр STAT= позволяет узнать, удалось ли разместить массив.

Этот параметр может быть опущен, но тогда любая не­удача при выделении памяти приведет к ошибке этапа исполнения и остановке

программы. Параметр указывается в операторе ALLOCATE последним. При удачном выделении памяти целочисленная статусная переменная

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

недостаток памяти или "попытка разместить ранее размещенный и не освобожденный оператором DEALLOCATE объект.

Аналогичную роль играет необязательный параметр STAT= и в операторе DEALLOCATE.

Сечение массива

В Фортране можно получить доступ не только к отдельному элементу массива, но и к некоторому подмножеству его элементов.

Такое подмноже­ство элементов массива называется сечением массива. Сечение массива мо­жет быть получено в результате применения

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

Индексный триплет имеет вид: [нижняя граница] : [верхняя граница] [.шаг]

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

отрицательным, но не может равняться нулю. Все параметры триплета являются необяза­тельными.

Индексный триплет задает последовательность индексов, в которой пер­вый элемент равен его нижней границе,

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

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

верхней и шаг положите­лен или нижняя граница меньше верхней и шаг отрицателен, то последова­тельность является пустой.

Пример.
real a(1:10);,

а(3:7:2) = 3.0 ! Триплет задает сечение массива с элементами
! а(3), а(5), а(7), которые получат значение 3.0
а(7:3:-2) = 3.0 ! Элементы а(7), а(5), а(3) получат значение 3.0






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