Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 4.doc
Скачиваний:
2
Добавлен:
04.11.2018
Размер:
169.47 Кб
Скачать

4.5 Многомерные массивы

Массив, у которого r≥2, где r – ранг массива, называют многомерным. Зал кинотеатра может служит примером многомерного массива (r=2), где местоположение кресла характеризуется двумя параметрами: номером ряда и номером кресла в этом ряду. С математической точки зрения примером многомерного (а именно двумерного) массива может служить матрица размерности m×n.

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

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

real x(9,9),y(9,9)

Или

real, dimension (9,9):: x,y

или

integer, parameter :: n=2, m=3

real, dimension (1..n,1..m):: x,y

Данное описание описывает матрицу следующего вида

a (1,1)

a(1,2)

a(1,3)

a(2,1)

a(2,2)

a(2,3)

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

a(1,1)

a(2,1)

a(1,2)

a(2,2)

a(1,3)

a(2,3)

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

K=4

X(k,k)=7 ! четвертому элементу массива в

!четвертой строке присвоено значение 7

i=8

j=5

X(I,j)=12 ! пятому элементу массива в восьмой

!строке присвоено значение 12

Например X(1,2)=5; То есть в 1-ю строку и 2-й столбец помещен элемент со значением 5.

Ввод/вывод элементов многомерного массива

Ввод/вывод элементов многомерного массива можно осуществлять следующими способами:

  1. read *,a  ! ввод всех элементов массива

!(согласно его описанию)

Столбцы заполняются сверху вниз. В этом случае значения вводятся в массив по столбцам слева направо.

  1. do i=1,n

read*,(a(i,j),j=1,n) 

enddo

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

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

do i=1,n

do j=1,n

print ‘(a,i2,a,i2,a)’,’a(’,I,’,’,j,’)=’

read*,a(I,j)

end do

enddo

  1. print *,a  ! вывод всех элементов массива

!(согласно его описанию) в том виде,

!как он хранится в памяти

  1. Для лучшего зрительного восприятия двумерный массив рекомендуется выво Ввод/вывод элементов дить в виде матрицы по строкам.

do i=1,n

write(*,*),(a(i,j),j=1,n) 

enddo

В примере цикл по i позволяет перемещаться по строкам, а скрытый цикл по j перемещает по столбцам.

do i=1, n

do j=1, n

write(*,’(100(f5.2))’), a(I,j)

enddo

write(*,*)

enddo

Здесь скрытый цикл по j выделен явно и является вложенным в цикл по i.

4.6 Примеры решения задач с использованием двумерных Способы ввода/вывода одномерных массивов массивов

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

Рассмотрим фрагмент программы обработки элементов двумерного массива (на рис.4.4 приведена схема алгоритма фрагмента программы):

Рис. 4.4 Блок-схема фрагмента программы обработки элементов двумерного массива

X=a(1,3)

N1=1

N=3

do i=1, N

do j=1, N

If (a(i,j))<x then

X=a(I,j)

N1=i

Endif

Enddo

Enddo

Пусть матрица A имеет вид .

На каждом шаге переменная x будет принимать следующие значения:

x=a1,3=47, N1=1, n=3

i=1 j=1 a1,1=5<x true x=5

i=1 j=2 a1,2=60<x false

i=1 j=3 a1,3=47<x false

i=2 j= 1 a1,1=14<x false

i=2 j= 2 a2,2=9<x false

i=2 j= 3 a2,3=16<x false

i=3 j= 1 a3,1=19<x false

j= 2 a3,2=2<x true -> x= a3,2=2

j= 3 a3,3=13<x false

После выполнения фрагмента программы x=2.

Данный фрагмент программы реализует алгоритм поиска минимального элемента в двумерном массиве. В случае, если надо выполнить анализ не всего массива, а элементов, расположенных на побочной диагонали и под ней параметр вложенного цикла j (счетчик по столбцам) меняется от N-i+1 до N для каждого i, где i это номер строки. Если рассматривается часть матрицы на главной диагонали и над ней, то j меняется от i до n.

Пример: В квадратной матрице посчитать сумму элементов главной диагонали и произведение элементов побочной диагонали (рис. 4.5).

Рис. 4.5 Квадратная матрица, выбор элементов главной побочной диагоналей квадратной матрицы

Элементы главной диагонали имеют одинаковые индексы.

Поэтому для суммирования элементов можно использовать цикл

Summa=0

Do i=1, n

Summa=summa+a(i,i)

enddo

В элементах побочной диагонали индекс i увеличивается, а j уменьшается. То есть j=N-i+1, где i – номер строки, j – номер столбца, n – размерность матрицы.

Pr=1

Do i=1,n

Pr=pr*a(I, n-i+1)

enddo

Объединяя оба цикла в один получаем программу

Program diag

Integer, parameter :: m=5

Integer a(m,m), summa, proizv, I,j

! summa – сумма элементов главной диагонали

! proizv – произведение элементов побочной диагонали

! I,j – счетчики циклов

Do i=1,m

Write (*,’(a, i2,a,$)), ‘Vvedite elementi’, I, ‘-go riada’

Read(*,*), (a(I,j), j=1,m)

Enddo

Summa=0

Do i=1, n

Summa=summa+a(i,i)

Enddo

Pr=1

Do i=1,n

Pr=pr*a(I, n-i+1)

enddo

print ’(a,i2,a,i2)’,’summa=’,summa,’ proizv=’,proizv

end program diag

Результат работы программы

Vvedite elementi 1-go riada 1 2 0 0 5

Vvedite elementi 2-go riada 1 3 4 4 1

Vvedite elementi 3-go riada 2 0 2 2 3

Vvedite elementi 4-go riada 1 1 2 1 1

Vvedite elementi 5-go riada 1 1 1 1 0

summa= 7 proizv=40

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