- •Оглавление
- •Блок-схемы линейных алгоритмов
- •Блок-схемы разветвляющихся алгоритмов
- •Блок-схемы циклических алгоритмов
- •Линейные алгоритмы
- •Условный оператор
- •Оператор выбора
- •Оператор цикла
- •Массивы
- •Двумерные массивы
- •Пользовательские функции
- •Указатели
- •Символьные массивы
- •Структуры
- •Поразрядные операции
- •Аргументы по умолчанию
- •Перегрузка функций
- •Перегрузка операций
-
Двумерные массивы
Массивы в языке C/C++ могут иметь несколько измерений (несколько индексов) – это многомерные массивы (часто применяются для представления таблиц, например, матриц) – массивы массивов.
Для идентификации элемента указывают два индекса:
- идентифицирующий строку элемента;
- идентифицирующий столбец.
Если индексов 2 – массивы называются двумерными.
Многомерные массивы объявляются следующим образом:
тип идент[колич_элем][колич_элем]...;
Например, объявляется двумерный массив b типа int, состоящий из двух строк и двух столбцов:
int b[2][2];
Ниже объявляется трехмерный (3 на 4 на 3) массив xxx типа int:
int xxx[3][4][3];
При инициализации при объявлении многомерных массивов значения рекомендуется группировать в фигурных скобках (инициализировать каждый одномерный массив, входящий в многомерный массив, отдельным списком инициализации):
int b[2][2] = {{1, 2}, {3, 4}};
В следующем примере после инициализации в массиве b[0] будут содержаться значения 1, 0, а в массиве b[1] – значения 3, 4:
int b[2][2] = {{1}, {3, 4}};
Обрабатывать многомерные массивы удобно, например, при помощи вложенных циклов. Следующий фрагмент программы может быть использован для вывода содержимого некоторого двумерного массива array2[2][3] на экран:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf_s("%d ", array2[i][j]);
}
printf_s("\n");
}
Здесь счетчик i фиксирует строку массива, и при фиксированном значении i счётчик j изменяет свое значение, «проходя» по всем элементам строки. При использовании массивов большей мерности следует использовать циклы с большим вложением.
Задание: написать программу, выполняющую действия, описанные в задании.
Пример: определить, является ли заданная матрица (предполагается, что задана бинарная матрица) матрицей перестановки – такой бинарной матрицей, в каждой строке и столбце которой находится лишь один единичный элемент.
#include <stdio.h>
/* определение символической константы N со значением
10 при помощи директивы #define */
#define N 10
/* основная функци */
void main(void) {
/* объявление двумерного массива matrix размером N на
N и инициализация его списком значений */
int matrix[N][N] =
{
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
};
/* объявление переменной для хранения суммы элементов
в строке */
int rows;
/* объявление переменной для хранения суммы элементов
в столбце */
int cols;
/* объявление переменной для хранения признака того,
что строка или столбец не являются содержащими
нули на всех позициях, кроме одной */
int flag;
/* цикл по всем строкам (столбцам) */
for (int i = 0; i < N; i++) {
/* для каждой новой строки (столбца) выполняется
обнуление сумм значений элементов строки
(столбца) и сброс флага */
rows = 0;
cols = 0;
flag = 0;
/* цикл по всем элементам конкретной строки
(столбца) */
for (int j = 0; j < N; j++) {
/* вычисление суммы элементов в строке i */
rows += matrix[i][j];
/* вычисление суммы элементов в столбце j */
cols += matrix[j][i];
}
/* если сумма элементов в текущей строке не равна
1 или сумма элементов в текущем столбце не
равна 1 */
if (rows != 1 || cols != 1) {
/* установить значение влага в 1 */
flag = 1;
/* иначе немедленно выйти из цикла */
break;
}
}
/* если в ходе проверки флаг был установлен в 1 */
if (flag == 1) {
/* вывести сообщение о том, что исходная матрица –
не матрица перестановок*/
printf_s("Исходная матрица NOT является матрицей
перестановок.\n");
} else {
/* иначе вывести о том, что исходная матрица –
матрица перестановок*/
printf_s("Исходная матрица является матрицей
перестановок.\n");
}
}
1. Определить, является ли заданная матрица бинарной – состоящей из 0 и 1.
2. Вычислить сумму максимальных элементов каждого столбца матрицы.
3. Построить
матрицу альтернанса размерности (5, 6)
такую, что каждый элемента матрицы
,
где
;
.
4. Вывести на экран количество положительных элементов каждого столбца матрицы.
5. Определить, является ли заданная матрица антидиагональной – такой, что все элементы, лежащие вне побочной диагонали, равны 0.
6. Найти сумму элементов той строки матрицы, в которой расположен минимальный элемент матрицы.
7. Определить, является ли заданная матрица бисимметричной – симметричной как относительно главной диагонали, так и относительно побочной диагонали.
8. Найти среднее арифметическое наименьшего и наибольшего значений элементов матрицы
9. Определить,
является ли заданная матрица
центросимметричной – симметричной
относительно своего центра, то есть
.
10. Найти столбец матрицы с максимальной суммой элементов. Если таких столбцов несколько, вывести номер правого из них.
11. Определить,
является ли заданная матрица
диагонально-доминирующей. То есть такой,
что
для всех значений
.
12. Определить, имеются ли в двумерном массиве одинаковые элементы.
13. Определить, является ли заданная матрица Z-матрицей – такой, что её недиагональные элементы меньше или равны нулю.
14. Найти индексы последнего четного элемента в каждой строке матрицы.
15. Определить, является ли заданная матрица нижнетреугольной – такой, что все элементы выше главной диагонали нулевые.
16. Каждый столбец матрицы заменить суммой столбцов, находящихся справа, включая сам стролбец.
17. Определить, является ли заданная матрица трёхдиагональной – такой, что все её ненулевые элементы располагаются на трёх диагоналях: главной, первой сверху и первой снизу.
18. Каждую строку матрицы заменить суммой нижележащих строк, включая саму строку.
19. Определить, является ли заданная матрица матрицей Фробениуса – такой, которая получается из единичной при помощи сдвига и добавления нового столбца.
20. Все элементы матрицы, имеющие максимальное значение, заменить на 0.
