Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 357.docx
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.75 Mб
Скачать

16.2 Приемы работы со статическим многомерным массивом

Матрицы, у которых число строк равно числу столбцов называются квадратными a(n,n) квадратная матрица.

Квадратная матрица имеет главную и побочную диагонали. Например:

на главной диагонали лежат элементы 1, 5, 9, на побочной – 3, 5, 7.

Для элемента a[i,j]:

Если i=j – элементы расположены на главной диагонали;

Если i>j – элементы расположены ниже главной диагонали;

Если i<j – элементы расположены выше главной диагонали;

Если i+j=n-1 – элементы расположены на побочной диагонали;

Если i+j<n-1 - элементы расположены над побочной диагональю;

Если i+j>n-1 – элементы расположены под побочной диагональю.

В двумерном массиве два индекса (один для строки и один для столбца), то есть для того, чтобы пройтись по всему массиву потребуется два вложенных цикла for.

Дан двумерный массив int A[n][n]. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний угол (то есть тем элементам A[i][j], для которых i==j) присвоить значение 1, элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4):

1 0 0 0

2 1 0 0

2 2 1 0

2 2 2 1

Элементы, которые лежат выше главной диагонали – это элементы A[i][j], для которых i<j, а для элементов ниже главной диагонали i>j. Таким образом, можно сравнивать значения i и j и по ним определять значение A[i][j]. Получается следующий алгоритм:

for (i = 0; i < n; ++i)

{

for (j = 0; j < n; ++j)

{

if (i < j)

{

A[i][j] = 0;

}

else if (i > j)

{

A[i][j] = 2;

}

else

{

A[i][j] = 1;

}

}

}

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

Сначала заполняется главная диагональ, для чего необходим один цикл:

for (i = 0; i < n; ++i)

{

A[i][i] = 1;

}

Затем заполняются значением 0 все элементы выше главной диагонали, для чего необходимо в каждой из строк с номером i присвоить значение элементам A[i][j] для j=i+1, ..., n-1. Здесь надо применить вложенные циклы:

for (i = 0; i < n; ++i)

{

for (j = i + 1; j < n; ++j)

{

A[i][j] = 0;

}

}

Аналогично присваиваивается значение 2 элементам A[i][j] для j=0, ..., i-1:

for (i = 0; i < n; ++i)

{

for (j = 0; j < i; ++j)

{

A[i][j] = 2;

}

}

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

for (i = 0; i < n; ++i)

{ // Заполняем строку с номером i

for (j = 0; j < i; ++j)

{

A[i][j] = 2; // Сначала пишем 2 ниже диагонали

}

A[i][j] = 1; // После завершения предыдущего цикла i==j, пишем 1

for (++j; j < n; ++j) // Цикл начинаем с увеличения j на 1

{

A[i][j] = 0; // Записываем 0 выше диагонали

}}

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