Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
02.05.2014
Размер:
868.35 Кб
Скачать

19. Ввод двухмерного массива

DIMENSION A(3,5)

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

Первый способ ввода массивов:

READ(5,*)A

Означает, что введённые числовые значения будут заполнять массив в той очерёдности, в какой этот массив располагается в памяти ЭВМ.

Недостаткитакого ввода:

  • ввод элементов необходимо производить по столбцам, так как двухмерный массив располагается в памяти ЭВМ по столбцам.

  • необходимо вводить числа до тех пор, пока массив не заполнится (даже если в нём 1000х1000 элементов);

  • если вводятся несколько массивов, то сначала полностью заполнится первый массив, затем, без предупреждения, будут заполняться остальные массивы:

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

Достоинство: Самый простой способ записи ввода массивов.

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

Второй способ ввода массивов:

READ(5,*)((A(I,J),I=1,3),J=1,5)

Здесь ввод массива осуществляется при помощи неявных вложенных циклов типа DO, где переменная внутреннего циклаIизменяется от 1 до 3 с шагом 1 и переменная внешнего циклаJтакже изменяется от 1 до 5 с шагом 1.

Данные неявные циклы DOв обычном (явном) виде можно записать:

DO 7 J=1,5

DO 7 I=1,3

  1. READ(5,*) A(I,J)

Тогда необходимо будет вводить по одному числу в строке.

Достоинства:

  • таким способом можно ввести весь массив целиком или часть этого массива.

Недостатки:

  • ввод элементов необходимо производить по столбцам;

  • нет возможности задавать количество вводимых элементов.

Третий способ ввода массивов:

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

READ(5,*) ((A(I,J),J=1,5),I=1,3)

При такой записи внутренним циклом является второй индекс, он быстрее изменяется и заполнение массива идёт по строкам.

Недостаток:

– нет возможности задавать количество вводимых элементов.

Достоинство:

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

Четвертый способ ввода массивов:

READ(5,*) M,N,((A(I,J),J=1,N),I=1,M)

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

Фрагменты задач с двухмерными массивами

Мини задачи с массивом А(3,5):

1). Найти сумму элементов двухмерного массива А(3,5)

DIMENSION A(3,5)

READ(5,*)A

S=0.

DO 18 J=1,5

DO 8 I=1,3

  1. S=S+A(I,J)

18 CONTINUE

Вначале происходит обнуление переменной S, которой и будет присваиваться вычисляемая сумма (в противном случае может возникнуть ситуация, когда переменнаяSуже имеет некоторое значение, и расчеты будут неправильными). Внешний цикл обеспечивает циклическое изменение номера столбца от 1 до 5. Во внутреннем цикле происходит суммирование элементов 1–3 текущего столбца с предыдущим значениемS.

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

2). Найти сумму всех положительных элементов

DIMENSION A(3,5)

S=0.

DO 18 I=1,3

DO 8 J=1,5

8 IF(A(I,J).GT.0.) S=S+A(I,J)

  1. CONTINUE

Программа по двум циклам (внешний – по Iи внутренний – поJ) перебирает все элементы массива и сравнивает их с нулём (IF(A(I,J).GT.0.)). Если анализируемый элемент массива больше нуля, то происходит суммирование положительных элементов массива путём прибавления их к переменнойS. В отличие от предыдущего примера очередность обработки элементов массива идет по строкам.

3). Найти максимальное значение массива

AM=A(1,1)

DO 18 J=1,5

DO 8 I=1,3

8 AM=AMAX1(AM,A(I,J)) Или: IF(A(I,J).GT.AM) AM=A(I,J)

  1. CONTINUE

Программа анализирует все элементы массива. Цель анализа – найти число, которое больше переменной AMи присвоить это число той же переменной АМ. Таким образом, переменная АМ постепенно меняет своё значение по возрастающей, пока не станет равна самому большому элементу анализируемого массива. Далее переменнуюAMможно вывести на дисплей или дальше использовать в программе, как самый большой элемент массива.

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

AMI=A(1,1)

DO 8 J=1,5

DO 8 I=1,3

IF (A(I,J).GT.AMI) GO TO 8

С Используется способ обратной логики.

AMI=A(I,J)

NSTR=I

NSTB=J

8 CONTINUE

Результатом работы программы будут три числа: AMI– минимальный элемент массива;NSTR– хранит номер строки минимального элемента;NSTB– хранит номер столбца минимального элемента.

Следует помнить,что после окончания циклов значения у переменныхIиJбудут больше, чем конечные значения в циклеDO. Они будут равныJ=6,I=4.

5). Транспонировать матрицу (т.е. b11=a11,b12=a21).

DIMENSION A(3,5),B(5,3)

DO 11 L=1,5

DO 11 K=1,3

  1. B(L,K)=A(K,L)

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

+

а21

а31

а41

а51

+

+

+

+

+

S=0.

DO 15 I=1,3

DO 15 J=1,IВнутренний цикл изменяется от 1 до I

  1. S=S+A(I,J)

7). Найти сумму элементов, находящихся на главной диагонали

S=0.

DO 16 I=1,3

16 S=S+A(I,I) Следует обратить внимание что, первый и второй индексы могут быть одинаковыми.

Так как элементы, лежащие на главной диагонали, всегда имеют одинаковые номер строки и номер столбца, то достаточно сделать изменение номера строки и номера столбца по одному циклу (будут анализироваться элементы А(1,1), А(2,2) и т.д.).

8). Вычислить произведение всех элементов, за исключением тех, что стоят под побочной диагональю и на диагонали.

PR=1.

DO 12 I=1,3

+

+

+

+

+

+

+

+

+

Цикл, в котором изменяется номер строки

D0 12 J=1,5-I

Цикл, в котором изменяется номер столбца (если в произведение включить побочную диагональ, то J=1,6–I).

12 PR=PR*A(I,J)

9). Найти количество положительных элементов каждого столбца массива. Все эти значения записать в отдельный массив.

Решение: во внутреннем цикле, в котором будет осуществляться перебор номеров строк, будет подсчитываться количество положительных элементов. Количество этих циклов – 3. Внешний цикл будет повторяться 5 раз, а внутри этого цикла будут осуществляться операции по нахождению количества элементов в каждом столбце.

REAL A(3,5), B(5)

READ(5,*) A

C Внешний цикл

DO 15 N=1,5

C Внутренний цикл

B(N)=0.

DO 16 M=1,3

  1. IF(A(M,N).GT.0.) B(N)=B(N)+1

  1. CONTINUE

В данном примере количество положительных элементов записано в массив с именем В. Это массив вещественного типа. Лучше, если количество (числа целые) будут записываться в массив целого типа. Например, К.

10). Поменять местами последний и первый столбцы массива.

REAL A(3,5)

READ(5,*) A

DO 17 I=1,3

C=A(I,1)

A(I,1)=A(I,5)

17 A(I,5)=C

11). Найти сумму элементов каждой строки, и записать их в массив.

REAL A(3,5), C(3)

READ (5,*)A

DO 10 I=1,3 Внешний цикл перебирает строки

C(I)=0.

DO 9 J=1,5 Внутренний цикл перебирает столбцы

  1. C(I)=C(I)+A(I,J) Суммирование элементов одной строки, перебирая номера столбцов

  2. CONTINUE

Соседние файлы в папке Программирование на Фортране