Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22-28(29).docx
Скачиваний:
7
Добавлен:
27.09.2019
Размер:
72.89 Кб
Скачать

28. Характеристики массива

Одномерный, двумерный, трехмерный, любой многомерный массив описываются единообразно

  • одномерный массив real X(60) - это вектор из 60 однотипных элементов

  • двумерный массив real T(3,5) - это матрица однотипных элементов из 3 строк и 5 столбцов

  • трехмерный массив real Edr(4,3,2) - это система из 2 матриц, каждая по 4 строки и 3 столбца

В качестве индексов для выбора  элементов массива вместо безликих математических обозначений i,j,k лучше использовать "говорящие" имена вроде str, stl, tbl

Характеристики и атрибуты массива.

  1. Имя массива, как объекта.

  2. Тип массива – одного из базовых типов integer, real, complex, logical, character или определяемого типа type(имя_типа).

  3. Количество измерений или ранг массива – допускается от 1 до 7, причем по каждому измерению указывается пара целых чисел [нижняя:]верхняя границы индекса:

    1. либо диапазон индекса как нижняя:верхняя границы индекса протяженность = верхняя – нижняя + 1 ; протяженность – это неотрицательное число, указывающее на количество возможных значений индекса по выбранному измерению;

    2. либо только верхняя граница, с нижней границей по умолчанию равной 1; в этом случае верхняя граница - это протяженность, например, число строк или число столбцов матрицы.

  4. Форма массива, по-английски Shape – целочисленный вектор, составленный из протяженностей в порядке следования измерений. Форма характеризует порядок размещения элементов в памяти компьютера. Массивы, одинаковые по форме, называют, конформными. Форма измеряется функцией shape(Array).

  5. Число элементов – это произведение протяженностей по всем измерениям массива, измеряется функцией size(Array) size(Array)=product(shape(Array)).

  6. Объем памяти, занимаемый массивом <объем_памяти > = < память на один элемент >* size(array) – ограничивается лишь объемом памяти компьютера.

  7. Когда и как массив размещается в памяти компьютера – статический или динамический (allocatable); в процедуре, дополнительно – динамический автоматический, передаваемый по адресу.

  8. Назначение (intent) массива как аргумента процедуры: intent(in) – входной аргумент, intent(out) – выходной аргумент, intent(inout) – входной-выходной аргумент.

  9. Прочие атрибуты: public | private, pointer | target, parameter, save.

29.Размещение массива в памяти компьютера

Говоря о размещении массива в памяти, следует прояснить:

  • какой объем памяти требуется;

  • в каком порядке элементы массива хранятся в памяти;

  • когда массив размещают в памяти.

Какой объем памяти требуется?

Объем памяти, занимаемый массивом, определяется просто из-за того, что все элементы однотипны и занимают одинаковый объем памяти. <объем_памяти> = <память на один элемент>*size(array) Размер массива ограничивает лишь объем памяти компьютера.

В каком порядке элементы массива хранятся в памяти?

В большинстве случаев программист об этом может не задумываться. Однако, в ряде случаев при передаче массива целиком подразумевается именно этот порядок:

  • при подготовке данных для ввода;

  • при написании форматов вывода;

  • при задании начальных значений для элементов массива.

Порядок хранения стандартизован в Фортране: для одномерного массива – по возрастанию индекса, для матрицы – по столбцам, для многомерного массива – самый быстрый первый индекс, медленнее второй, наконец, последний – самый медленный, каждый из индексов пробегает все значения по возрастанию.

Пример. В каком порядке надо готовить данные?

Всего в трехмерном массиве P(1:2,1:2,1:2) 8 элементов. Его элементы располагаются в памяти, как указано выше, и порядок чтения разъясняется вторым оператором read. Именно в этом порядке и надо готовить данные. Так как read бесформатный, можно, не нарушая порядка следования, либо все числа перечислить в одной строке через пробел или запятую, либо – каждое число – в отдельной строке.

dimension P(1:2,1:2,1:2)

read(1,*) P ! читать весь массив – понимают как

read(1,*) P(1,1,1),P(2,1,1),P(1,2,1),P(2,2,1),P(1,1,2),P(2,1,2),P(1,2,2),P(2,2,2)

Предупреждение. Размещение массива в памяти стандартно и никак не зависит от порядка ввода.

Когда массив размещают в памяти?

Форма статического массива, (предыдущий пример), известна при компиляции – shape(P)=(/2,2,2/); массив размещается в памяти при запуске программы. Форма динамического массива не определена при компиляции, например,

Real,allocatable,Dimension(:,:) :: Matrix, Matr1, Matr2, X(:)

Известно лишь количество измерений массивов: два для Matrix и один для X. Запустив программу, сначала определяют протяженности, а затем динамически размещают массивы в памяти оператором

allocate( X(1:N), Matrix(1:M,1:N),&

Matr1(1:N ,1:M), Matr2(1:N,1:N) )

Освобождают память оператором

deallocate( X, Matrix, Matr1, Matr2 )

Массив как аргумент процедуры должен быть размещен в памяти до входа в процедуру; в нее передается его адрес, независимо от способа написания размерности:

Real,intent,Dimension(1:N)::Mas - в виде переменной N;

Real,intent(in),Dimension(1:10)::Mas - в виде константы 10;

Real,intent(in),Dimension(:)::Mas – без указания размерности;

Real,intent(in),Dimension(*)::Mas-массив, перенимает форму;

Dimension(1:N,1:M) в виде массива с перераспределением памяти между строками и столбцами, например, 3*4=4*3=2*6=6*2=12.

В любом случае количество элементов можно узнать с помощью функции size(array), а для матрицы число строк – size(Matrix,dim=1), число столбцов – size(Matrix, dim=2).

Пример (массивы X, Y, P, Q конформны):

real,dimension(1:11):: X,Y ! массивы X,Y по 11 элементов

real,dimension(-5:5)::P,Q ! P,Q – по 11 элементов с номерами 5,..0,..5

Y=sin(X+0.5)/4 + 2.1; p= Y/2; Q=P-1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]