Многомерные массивы широко используются в статистике и математике, такие массивы имеют более одного измерения (индекса). Таким образом, двумерный массив представляет собой набор данных одинакового типа, в котором доступ к любому его элементу осуществляется по двум индексам: номеру строки и номеру столбца. Количество индексов определяет размерность массива. Размермассива – количество элементов в массиве, например двумерного, равно произведению числа строк на число столбцов. Двумерные массивы являются логической структурой данных удобной для решения задач связанных с обработкой величин зависящих от двух параметров.
Физически (в памяти ЭВМ) массив должен хранится как одномерный, т.к. память ЭВМ имеет линейную организацию, в которой для доступа к ячейке памяти используется один параметр – адрес. Поэтому при хранении двумерного массива в памяти компьютера осуществляется преобразование двухиндексной ссылки к линейной, допустим, при хранении по строкам так: адрес_элемента_аij = базовый_адрес + (i-1)*количество_элементов_в_строке + j.
В языках программирования элемент многомерного массива обозначается именем массива с индексами. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Обращаться к элементам массива можно в произвольном порядке, задавая значения индексов. Причем, первый индекс всегда нумерует строки, второй столбцы.
Для того, чтобы обработать (присвоить значения, ввести значения, вывести значения элементов) все элементы массива нужно организовать вложенные циклы, в которых перебираются все комбинации значений индексов. Вложенные циклы представляют собой конструкцию, в которой один (или несколько циклов) полностью содержится в теле другого цикла.
Рассмотрим пример алгоритма реализующего ввод двумерного массива по строкам. В этом примере элементы массива обрабатываются по строкам, т.е. в таком порядке: a11, a12, a13,..., a1m, a21, a22,...,a2m, ...Здесь для каждого значения счетчика внешнего цикла i,вложенный цикл выполняется заданное количество (m) раз. Поэтому тело вложенного цикла выполняется n* m раз.
Рассмотрим некоторые алгоритмы обработки двумерных массивов.
Определить сумму элементов в каждой строке массива А, содержащего n строк и m столбцов. Исходными данными для решения являются целочисленные переменные n и m, а также элементы массива А. Результатом решения будет одномерный массив S, содержащий столько элементов каково количество строк в массиве А. Для ввода всех элементов исходного массива нужно организовать цикл в цикле (вложенные циклы). Подобная же конструкция требуется и для обработки всех элементов массива. В соответствии с этим схема алгоритма может иметь вид.
Как видно из блок-схемы, внешний цикл (счетчик цикла переменная i) «перебирает» все строки массива, а внутренний цикл (счетчик цикла переменная j) суммирует все элементы каждой строки (сумма элементов каждой строки накапливается в соответствующих элементах одномерного массива S).
Определить min элемент в каждом столбце массива А, содержащего n строк и m столбцов. Исходными данными для решения являются целочисленные переменные n и m, а также элементы массива А. Результатом решения будут значения минимальных элементов для каждого столбца массива. Представим блок-схему алгоритма.
В данном алгоритме переменной Ме перед вложенным циклом присваивается очень большое значение для того, чтобы в цикле при первом же сравнении выполнялось условие, по которому переменной Ме присваивается значение первого элемента рассматриваемого столбца. Тело внешнего цикла заканчивается выводом номера столбца и значения минимального элемента в этом столбце.
Задание.
1. Разработать алгоритм и написать программу, реализующую вычисление произведения двух матриц (двумерных массивов). Элемент нового массива (произведения): Cij = Aik*Bkj
2. Разработать алгоритм и написать программу, реализующую вычисления сумм элементов столбцов матрицы с четными номерами.
3. Разработать алгоритм и написать программу, в результате выполнения которой строка с минимальным элементом матрицы поменяется местами со строкой с максимальным элементом матрицы.