Массивы с большей размерностью

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

...: array [... ] of array ...

Подобная запись достаточно громоздка (несколько раз записывается служебное слово array и т. д. ), но синтаксис языка Паскаля позволяет описывать многомерные массивы проще.

 

<список идентификаторов через запятую> :

Array [ <список диапазонов, через запятую> ] of

<тип элементов>;

Примеры:

1)

М: array[1.. 3] of array [1.. 3] of Real;

Подобное описание эквивалентно следующему:

М: array [1.. 3, 1.. 3] of Real;

В первом случае доступ к элементу осуществляется так:

M[i][j],

а во втором

M[i, j] .

 

2)

Т: array[1 .. 2, 1 .. 3, 1 .. 4] of Integer;

U: array[1 .. 10, 'A' .. 'Z'] of char;

 

Работа с n-мерными массивами заставляет программиста организовать n вложенных циклов. Подробнее остановимся на двумерных массивах. Двумерные массивы используются, в основном, для определения матриц (таблиц) с индексами, изменяющимися по строкам и по столбцам (первый индекс – номер строки, второй - номер столбца).

 

А[1, 1] , А[1, 2] , . . . , A[l, M]

А[2, 1] , А[2, 2] , . . . , А[2, M]

………………………………….

А[N, 1] , A[N,2] , . . . , А[N,M]

 

Здесь приведён пример двух мерного массива с N строками и M столбцами.

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

Примеры:

М[1, 2] := 7;

М[7, 5] := 46;

M[i, j] := 75;

M[k, i] := SQR(M[i, j] + M[j, i] ) ;

 

Ввод элементов двумерного массива по строкам с клавиатуры:

 

for i := 1 to n do

for j:= 1 to m do Read (M[i, j]);

 

или с сообщениями:

 

for i:= 1 to n do

for j:= l to m do

begin

Write('введите М[', i, ', ' , j, '] ');

Readln(M[i, j]);

end;

 

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

 

Writeln(' Матрица'); { Заголовок }

for i:=1 to n do

begin

for j:=1 to m do Write(M[i, j] : 7: 3, ' ') ; { Вывод строки}

Writeln; { Переход на следующую строку }

end;

Часто при работе с двумерными массивами (матрицами) приходится оперировать с элементами, обладающими некоторыми признаками, в частности, связанными с положением элементов относительно диагоналей матрицы. Например, элемент находится на главной диагонали рисунок 8.1a, на побочной диагонали рисунок 8.1б, ниже главной диагонали, ниже побочной и т. д. (рисунки 8.1в÷ж).

Положение этих элементов может быть описано следующими математическими соотношениями для матрицы n∙n:

- на главной диагонали - { M[ i , j ] | i = j }

- выше главной диагонали - { M[ i , j ] | i < j }

- выше главной и выше побочной диагонали –

{ M[ i , j ] | i < j }{ M[ i , j ] | i < n-j+1 } и т. д.

               
   
 
     
   
 
 
 


 

 

a) б) в) г)

           
   
   
 
 
 

 

 


д) е) ж)

Рисунок 8.1

 

Задача. Матрица n*n вводится с клавиатуры, заменить все отрицательные элементы выше главной диагонали их квадратами. Вывести новую матрицу на экран.

program p8_3;

const

n:= 4; { размер матрицы }

var

М: array[1.. n, 1.. n] of integer;

i, j : integer;

begin

{ Ввод элементов матрицы }

for i:= 1 to n do

for j:= 1 to n do

begin

Write('введите М[ ' , i, ', ' , j , '] : ');

Readln(M[i, j ] ) ;

end;

for i: = 1 to n do

for j:= 1 to n do

if i < j then { если элемент выше главной диагонали}

{ и если элемент отрицательный, то заменить его квадратом}

if M[i, j] < 0 then M[i, j] := SQR(M[i, j] ) ;

{ Вывод результатов }

for i:= l to n do

begin

for j:= 1 to n do Write( M[i, j]: 3 , ' ');

Writeln;

end;

end.