Название: Информатика. Алгоритмический язык Фортран - учебное пособие (Худяков Д.С., Саблина Г.В.)

Жанр: Информатика

Просмотров: 3010


2.8. обработка массивов

 

Массивом, как уже отмечалось, называется совокупность переменных одного типа, обозначаемая именем с индексами в круглых скобках. Например, вектор с компонентами u1, u2, …, un можно представить одномерным массивом

U(I), 1 £ I £ N,

а матрицу с компонентами  можно представить двумерным массивом

A(I, J), 1 £ I £ N,   1 £ J £ M.

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

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

DIMENSION A(10,30),BK(500),IU(40)

Здесь первый массив – двумерный, а второй и третий – одномерные. Первый индекс в массиве А изменяется от 1 до 10, второй – от 1 до 30. Во втором и третьем массивах индексы изменяются соответственно от 1 до 500 и от 1 до 40.

Описание размерности массива может быть совмещено с описанием типа переменных. Поэтому запись

REAL KLM,XF

INTEGER FR,SS

DIMENSION KLM(15,15),FR(100),XF(10),SS(5,5)

эквивалентна записи

INTEGER FR(100),SS(5,5)

REAL KLM(15,15),XF(10)

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

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

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

PARAMETER(<имя>=<константа>,<имя>=<константа>,...)

Здесь <имя> – символическое имя, образованное по правилам Фортрана. Тогда, например, запись

DIMENSION A1(100,200),A2(100,200),B(200,100)

эквивалентна записи

PARAMETER(N1=100,N2=200)

DIMENSION A1(N1,N2),A2(N1,N2),B(N2,N1)

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

V=A(I,J)+B(3,2*L+7)

В этом случае целые переменные I, J, L должны быть определены в предыдущей части программы.

При вводе и выводе массивов используются два основных способа – ввод-вывод массива по имени или с помощью цикла. Первый способ иллюстрируется примером

DIMENSION А(10),В(3,4)

READ(*,*)A,B

В этом случае должны быть последовательно введены 10 чисел, которые соответствуют элементам массива А, а затем введены 12 чи-сел, которые соответствуют элементам массива В, согласно их последовательности расположения в памяти. Второй способ также ясен из примера

DIMENSION A(10),B(3,4)

READ(*,*) N,L,M,(A(I),I=1,N),

    *((B(I,J),J=1,L),I=1,M)

В этом случае значения переменных N, L, M подчиняются ограничениям N £ 10, L £ 4, M £ 3, поскольку в противном случае мы выйдем за границы расположения элементов массивов. Этот способ удобнее, когда в программе используется меньшее количество элементов массивов, нежели то, которое задано в операторах размерности. В этом примере сначала вводятся три целых числа N, L, M и затем последовательно N элементов массива А, а затем L´M элементов массива В в последовательности

В(1,1),B(1,2),...,В(2,1),В(2,2),...

В этом случае последовательность ввода элементов В не совпадает с порядком их хранения в памяти. Если последний оператор записать как

READ(*,*) N,L,M,(A(I),I=1,N)

    *((B(I,J),I=1,M),J=1,L)

то порядок ввода элементов массива В и порядок их размещения в памяти будет одинаковый.

Вывод массива отличается от их ввода только заменой оператора READ на оператор WRITE.

Рассмотрим следующую задачу.

Дан одномерный массив с количеством элементов N £ 100. Найти сумму элементов этого массива. Соответствующая программа может иметь вид:

DIMENSION A(100)

READ(*,*)N,(A(I),I=1,N)

S=0.0

DO 5 1=1, N

S=S+A(I)

   5 CONTINUE

WRITE(*,*)S

STOP

END