Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие для студентов1.doc
Скачиваний:
0
Добавлен:
08.01.2020
Размер:
1.88 Mб
Скачать

12. Двумерные массивы

12.1. Матрицы

Если в массиве хранится таблица значений, то такой массив называют двумерным, а его элементы нумеруются двумя индексами – номером строки и номером столбца, на пересечении которых находится данный элемент.

В памяти компьютера все элементы массива занимают одну непрерывную область. Двумерный массив располагается в памяти по строкам.

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

.

12.2. Описание двумерного массива

Для двумерных массивов:

var

a : array[1..n ,1..m] of <тип>;

Где a – имя массива;

n, m – количество строк и столбцов в массиве;

<тип> – тип элементов массива.

Количество элементов в массиве - n m.

Например:

var

mas: array [1…10,1..10] of real;

begin

Описан массив mas, содержащий 100 элементов вещественного типа (10 строк и 10 столбцов).

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

Например:

const

n = 5, m=5;

var

mas: array[1…n,1..m] of real;

begin

Описан массив mas, содержащий 25 элементов целого типа (5 строк и 5 столбцов).

Каждый элемент массива определяется с помощью двух индексов, стоящих справа от имени в квадратных скобках.

a[i, j] – элемент стоящий на пересечении i-ой строки и j-го столбца.

a[i, i] – элементы главной диагонали.

a[i, 2] – элементы второго столбца.

Индекс может быть переменной, константой, арифметическим выражением целого типа.

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

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

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

i=j

(номер строки равен номеру столбца).

Все элементы побочной диагонали удовлетворяют условию:

i+j=n+1

(n – количество строк и столбцов).

Элементы, расположенные над главной диагональю удовлетворяют условию:

i<j

(номер строки строго меньше номера столбца).

Элементы, расположенные под главной диагональю удовлетворяют условию:

i>j

(номер строки строго больше номера столбца).

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

for i:=1 to n do

for j:=1 to m do

readln(a[i]);

Данный фрагмент позволит ввести элементы массива по строкам.

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

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

for i:=1 to n do

begin

for j:=1 to n do

write(a[I,j],‘ ‘);

writeln;

end;

Данный фрагмент позволит вывести элементы массива в виде матрицы.

12.3. Обработка двумерных массивов

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

Задача.

Составить программу подсчета суммы и произведения элементов двумерного массива вещественных чисел.

Таблица идентификаторов

Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк

n

3

Количество столбцов

m

4

Индексы массива

I,j

5

Сумма элементов

s

6

Произведение элементов

p

program matr;

uses

crt;

var

a:array [1...10, 1...10] of real;

i, j, n, m: integer;

s,p :real;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i, j]);

s:=0; p:=1;

{ поиск суммы и произведения }

for i:=1 to n do

for j:=1 to m do

begin

s:=s + a[i,j];

p:=p * a[i,j];

end;

writeln(‘ Сумма элементов s=’,s:8:3);

writeln(‘ Произведение элементов p=’,p:8:3);

readln;

end.

Задача.

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

Таблица идентификаторов

Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк и столбцов

n

3

Индексы массива

I,j

4

Сумма элементов над главной диагональю

s

program matr_1;

uses

crt;

var

a:array [1..10, 1..10] of real;

i, j, n, m : integer;

s,p : real;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i,j]);

for i:=1 to 3 do

for j:=i +1 to 3 do

s:=s+a[i,j];

writeln('Сумма элементов s=', s);

readln;

end.

Для ввода элементов массива используются вложенные циклы с указанием номера вводимого элемента.

Для поиска суммы элементов над главной диагональю во внутреннем цикле задан закон изменения параметра внутреннего цикла:

j:=i+1.

Задача.

Задана целочисленная квадратная матрица. Определить является ли она симметричной относительно главной диагонали.

Таблица идентификаторов

Наименование переменной

Обозначения в программе

1

Имя массива

a

2

Количество строк и столбцов

n

3

Индексы массива

I,j

4

Флажок

f

program matr_2;

uses

crt;

var

a : array [1..10, 1..10] of integer;

i, j, n, f : integer;

begin

clrscr;

writeln(‘ Введите n<=10 ’);

readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to n do

readln(a[i,j]);

f:=0

for i:=1 to n do

for j:=i to n do

if a[i,j]<>a[j,i] then f:=1;

if f=0 then writeln(‘ матрица симметрична’)

else writeln (‘матрица не симметрична’);

readln;

end.

При решении этой задачи сравниваются элементы расположенные над главной диагональю ( a[ i,j ] ) с элементами, расположенными под главной диагональю ( a[ j,i ] ) .

Задача.

Задана матрица вещественных чисел. Образовать одномерный массив, где каждый j – й элемент равен произведению элементов j-ого столбца двумерного массива.

Таблица идентификаторов

Наименование переменной

Обозначения в программе

1

Имя двумерного массива

a

2

Имя одномерного массива

b

3

Количество строк

n

4

Количество столбцов

m

5

Индексы массива

I,j

program matr_3;

uses crt;

var

a: array [1...10, 1...10] of integer;

b: array [ 1..10 ] of integer;

i, j, n, f : integer;

begin

clrscr;

writeln(‘ Введите n<=10 , m<=10 ’); readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln (a[i, j]);

writeln(‘ Исходная матрица ’);

for i:=1 to n do

begin

for j:= 1 to n do

write( a[I,j] , ‘ ‘);

writeln;

end;

writeln(‘ Образованный одномерный массив ’);

for j:=1 to m do

begin

b[ j ]:=1;

{ накапливается произведение элементов j столбца }

for i:=1 to n do

b[ j ]:= b[ j ] * a[ i, j ];

write( b[ j] , ‘ ‘);

end;

readln;

end.

Задача.

Задана целочисленная матрица a(m*n). Упорядочить элементы каждой строки по возрастанию.

Таблица идентификаторов

Наименование переменной

Обозначения в программе

1

Имя двумерного массива

a

2

Количество строк, столбцов

n, m

3

Индексы массива

I,j

4

Флажок

f

5

Дополнительная переменная для обмена соседних элементов

p

program mart_4;

uses crt;

var

a: array[1...10, 1...10] of integer;

i,j,n,f : integer;

begin clrscr;

writeln(‘ Введите n<=10 , m<=10 ’); readln (n,m);

writeln(‘ Введите элементы массива по строкам ’);

for i:=1 to n do

for j:=1 to m do

readln(a[i, j]);

writeln(‘ Исходная матрица ’);

for i:=1 to n do

begin

for j:=1 to n do

write(a[I,j],‘ ‘);

writeln;

end;

{ переход от строки к строке }

for i:=1 to n do

{ сортировка i-ой строки }

repeat

f:=0;

for j:=1to m-1 do

if a[i,j]>a[i,j+1] then

begin p:=a[i,j]; a[i,j]=a[i,j+1]; a[i,j+1]:=p; f:=1; end;

until f=0;

writeln(‘ Преобразованная матрица ’);

for i:=1 to n do

begin

for j:= 1 to n do

write( a[I,j] , ‘ ‘);

writeln;

end;

readln;

end.

f =0 – признак того, что все элементы данной строки упорядочены.