Краткие теоретические сведения. Многомерный массив это массив, элементами которого служат массивы
Многомерный массив это массив, элементами которого служат массивы. Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор
int matr [6][8];
задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно.
Например, массив с описанием int a[4][5] – это массив из 4 указателей типа int*, которые содержат адреса одномерных массивов из 5 целых элементов (см. рис.).
Рис. 1. Организация многомерных массивов
Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j], или более экзотическим способом: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i] является адресом начала i-й строки массива.
При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае размерности при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:
int massZ [][]={ {1, 1}, (0, 2}, {1, 0} };
int massZ [3][2]={1, 1, 0, 2, 1, 0};
Пример. Программа определяет в целочисленной матрице номер строки, которая содержит наибольшее количество элементов, равных нулю.
#include <stdio.h>
int main()
{
const int nstr = 4, nstb=5; // размерность массива
int b[nstr][nstb]; // описание массива
int i, j;
for (i = 0; i<nstr; i++) //Ввод массива
for (j = 0; j<nstb; j++)
scanf(“%d”,&b[i][j]);
int istr = -1, MaxKol=0;
for (i = 0; i<nstr; i++)
{ // просмотр массива по строкам
int Kol =0;
for (j = 0; j<nstb; j++)
if (b[i][j] == 0)Kol++;
if (Kol > MaxKol)
{istr = i; MaxKol = Kol;}
}
printf(“ Исходный массив :\n");
for (i = 0; i<nstr; i++)
{
for (j = 0; j<nstb; j++)
printf("*d ", b[i][j]);
printf("\n");
}
if (istr == -l)
printf("Нулевых элементов нет");
else printf(“Hoмep строки; %d”, istr);
return 0;
}
Номер искомой строки хранится в переменной istr, количество нулевых элементов в текущей (i-й) строке — в переменной Kol, максимальное количество нулевых элементов — в переменной MaxKol. Массив просматривается по строкам, в каждой из них подсчитывается количество нулевых элементов (обратите внимание, что переменная Kol обнуляется перед просмотром каждой строки). Наибольшее количество и номер соответствующей строки запоминаются.
Определение количества элементов массива в программе.
Используется выражение
sizeof(имя_массива) / sizeof (имя_массива[0])
Постановка задачи
Используя функции, решить указанную в варианте задачу. Массив должен передаваться в функцию как параметр.
Варианты
Вариант 1.
В двумерном массиве записаны слова, представляющие собой последовательность цифр, завершающихся 0. Необходимо распечатать слова через запятую, заключив печатную строку в скобки. Длина печатной строки 60 символов. Извлечение слова оформить в виде функции.
Например:
исходные данные - 123023402303450
результат - (123,234,23,345)(23445,234567,1)(23445567767,45)
Вариант 2.
Написать функцию для обмена строк двумерного массива. С ее помощью отсортировать массив по элементам третьего столбца.
Вариант 3.
Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и транспонированную (т. е. полученную поворотом исходной на 90 °).
Вариант 4.
Написать функцию для удаления строки из двумерного массива. Оставшиеся строки должны быть расположены плотно, недостающие элементы заменяются 0. С помощью разработанных функций исключить из массива строки с номерами от А до В.
Вариант 5.
Определить является ли матрица ортонормированной, т. е. такой, что скалярное произведение каждой пары различных строк равно 0, а скалярное произведение строки самой на себя равно 1.
Вариант 6.
Элемент матрицы является седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот: наибольшим в своей строке и наименьшим в своем столбце).Для заданной матрицы определить все седловые точки.
Вариант 7.
Написать процедуру обмена столбца и строки двухмерного массива. С ее помощью поменять местами те строки и столбцы, первые элементы которых совпадают.
Вариант 8.
Написать функцию транспонирования квадратной матрицы (т.е. поворота исходной матрицы на 90 °). С ее помощью определить является ли заданная матрица симметрической. (Матрица называется симметрической, если транспонированная матрица равна исходной).
Вариант 9.
Написать функцию для вычисления суммы элементов квадратной матрицы, которые расположены ниже главной диагонали. С ее помощью найти максимальное значение такой суммы в n матрицах.
Вариант 10.
Написать функцию, проверяющую есть ли отрицательные элементы в указанной строке двумерного массива. Удалить из массива все строки с отрицательными элементами, удаленная строка заполняется 0 и переносится в конец массива.
Вариант 11.
Написать функцию, проверяющую по возрастанию или убыванию упорядочена указанная строка двумерного массива. Упорядочить по возрастанию все строки двумерного массива, которые неупорядочены по убыванию.
Вариант 12.
Написать функцию, для поиска максимального элемента в указанной строке двумерного массива. Сдвинуть в двумерном массиве все строки циклически вправо на количество элементов равное максимальному элементу в этой строке.
Вариант 13.
Определить можно ли в двумерном массиве найти такой столбец, который разбивает массив на два так, что сумма элементов в первом больше, чем сумма элементов во втором. Сам столбец в разбиваемые части не входит.
Вариант 14.
Вычислить произведение всех столбцов массива, у которых первый элемент больше элементов расположенных на главной и побочной диагонали.
Вариант 15.
Задан двумерный массив. Найти сумму элементов первого столбца без одного последнего элемента, сумму элементов второго столбца без двух последних, сумму элементов третьего столбца без трех последних и т. д. Последний столбец не обрабатывается. Среди найденных сумм найти максимальную.
Вариант 16.
Найти минимальный из неповторяющихся элементов двумерного массива.
Вариант 17.
Найти максимальный из повторяющихся элементов двумерного массива.
Вариант 18.
В двумерном массиве найти среднее арифметическое первого столбца и количество элементов в каждом из следующих столбцов, превышающих среднее арифметическое предыдущего столбца.
Вариант 19.
Задан одномерный массив состоящий из N целых чисел. Сформировать на его основе двумерный массив N x N так, чтобы сумма элементов в первом столбце была равна первому элементу одномерного массива, сумма элементов во втором столбце была равна второму элементу одномерного массива и т. д. Нули не использовать.
Вариант 20.
Определить сколько элементов двумерного массива больше любого элемента на главной диагонали.
Задания на уровень выше
Вариант 1.
Задан двумерный массив N x N. Разрешается произвольно переставлять элементы внутри любого столбца. Проверить, можно ли выполнив конечное количество перестановок в столбцах, расположить на побочной диагональ элементы так, чтобы он возрастали.
Вариант 2.
Задан двумерный массив N x M. Найти в нем подмассив 3 х 3, сумма элементов которого максимальна. N и M могут быть не кратны трем.
Вариант 3.
Задан двумерный массив N x N. Последовательно рассматриваются квадратные подмассивы, правый верхний элемент которых лежит на побочной диагонали. В каждом таком подмассиве находится максимальный элемент. Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива. Проверить получилась ли на побочной диагонали убывающая последовательность элементов.
Вариант 4.
Задана строка из N2 цифр. Установить можно ли, разбив строку на подстроки длиной N, записать их в строки двумерного массива N x N по одной цифре в одном элементе так, чтобы они в первом столбце расположились в порядке возрастания.
Вариант 5.
Из двумерного массива в одномерный записали сначала строки в произвольном порядке, затем столбцы в произвольном порядке. Написать программу восстанавливающую исходный двумерный массив по одномерному, если известна размерность двумерного массива и элементы в нем не повторяются.
Содержание отчета
1. Постановка задачи.
2. Вариант задания
3. Текст программы.
4. Результат решения конкретного варианта.
Контрольные вопросы.
1. Понятие многомерного массива. Синтаксис;
2. Особенности использования указателей при работе с многомерными массивами;
3. Инициализация многомерных массивов. Примеры;
4. Определение количества элементов массива.
Лабораторная работа № 6
«ДИНАМИЧЕСКИЕ МАССИВЫ»
Цель: Получение навыков в организации динамических массивов.