Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двумерные массивы (справка).doc
Скачиваний:
2
Добавлен:
17.08.2019
Размер:
144.38 Кб
Скачать

Динамические массивы

В динамической области памяти можно создавать двумерные массивы с помощью операции new или функции malloc. Остановимся на первом варианте, поскольку он более безопасен и прост в использовании.

При выделении памяти сразу под весь массив количество строк (самую левую раз­мерность) можно задавать с помощью переменной или выражения, а количество столбцов должно быть константным выражением, то есть явно определено до вы­полнения программы. После слова new записывается тип создаваемого массива, а за­тем — его размерности в квадратных скобках (аналогично описанию «обычных», нединамических массивов), например:

В этом фрагменте показано два способа создания динамического массива. В опе­раторе 1 адрес начала выделенного с помощью new участка памяти присваивается переменной а, определенной как указатель на массив из n*m элементов типа int. Имен­но такой тип значения возвращает в данном случае операция new. Скобки необхо­димы, поскольку без них конструкция интерпретировалась бы как массив указате­лей.

В операторе 2 адрес начала выделенного участка памяти присваивается перемен­ной b, которая описана как «указатель на указатель на int», поэтому перед присва­иванием требуется выполнить преобразование типа.

Строго говоря, по стандарту в этом случае рекомендуется применять другую опе­рацию преобразования но старые компиляторы могут ее не поддерживать:

Обращение к элементам динамических массивов производится точно так же, как к элементам «обычных», с помощью конструкции вида a[i ][j].

Поскольку для доступа к элементу массива применяется две опе­рации раз адресации, то переменная, в которой хранится адрес начала массива, долж­на быть указателем на указатель.

Более универсальный и безопасный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, при­веден ниже:

В операторе 1 объявляется переменная типа «указатель на указатель на int» и вы­деляется память под массив указателей на строки массива (количество строк — nrow). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваи­вается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из ncol элементов типа int (рис.2).

Рис..2. Схема динамической области памяти, выделяемой под массивы

ВНИМАНИЕ

Освобождение памяти из-под массива с любым количеством измерений выполняется с по­мощью операции del ete [].

Задача 2. Номер столбца из положительных элементов

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

Блок-схема алгоритма приведена на рис. 3. Для решения этой задачи матрицу необходимо просматривать по столбцам. При этом быстрее меняется первый ин­декс (номер строки). Сделать вывод о том, что какой-либо столбец содержит толь­ко положительные элементы, можно только после просмотра столбца целиком; зато если в процессе просмотра встретился отрицательный элемент, можно сразу пере­ходить к следующему столбцу.

Рис. 3. Блок-схема алгоритма решения задачи 2

Эта логика реализуется с помощью переменной-флага all_posit, которая перед началом просмотра каждого столбца устанавливается в значение true, а при на­хождении отрицательного элемента «опрокидывается» в false. Если все элементы столбца положительны, флаг не опрокинется и останется истинным, что будет яв­ляться признаком присутствия в матрице искомого столбца.

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

В программе необходимо предусмотреть случай, когда ни один столбец не удов­летворяет условию. Для этого переменной nun, в которой будет храниться номер искомого столбца, присваивается начальное значение, не входящее в множество значений, допустимых для индекса, например -1. Перед выводом результата его значение анализируется. Если оно после просмотра матрицы сохранилось неиз­менным, то есть осталось равным -1, то столбцов, удовлетворяющих заданному условию, в матрице нет.