- •Вложенные циклы и двумерные массивы
- •Инициализация двумерного массива
- •Использование двумерного массива
- •Операторы Ветвления
- •Оператор if
- •If (проверочное-условие)
- •Оператор if else
- •Форматирование операторов if else
- •Конструкция if else if else
- •Условные операции и предотвращение ошибок
- •Логические выражения
- •Операция ?:
- •Оператор switch
- •Использование перечислителей в качестве меток
- •Операторы break и continue
Вложенные циклы и двумерные массивы
Цикл for — это естественный инструмент для обработки массивов. Теперь мы сделаем еще один шаг и посмотрим, как цикл for, внутри которого находится еще один цикл for (вложенные циклы), может применяться для обработки двумерных массивов.
Для начала давайте посмотрим, что собой представляет двумерный массив. Массивы, которые мы использовали до сих пор в этой главе, относятся к одномерным массивам, потому что каждый из них можно визуализировать как одну строку данных. Двумерный массив можно визуально представить в виде таблицы, состоящей из строк и столбцов. Двумерный массив можно использовать, например, для представления квартальных показателей по продажам в разных регионах, причем каждая строка данных будет представлять один регион. Или же можно применить двумерный массив для представления положения робота на поле компьютерной игры.
В C++ не предусмотрен специальный тип представления двумерных массивов. Вместо этого создается массив, каждый элемент которого является массивом.
Например, предположим, что требуется сохранить данные о максимальной температуре в четырех городах за четырехлетний период. В этом случае можно объявить массив следующим образом:
int maxtemps[4][5];
Это объявление означает, что max terms является массивом из четырех элементов. Каждый из этих элементов сам является массивом из пяти элементов (рис. 5.5). Массив maxterms можно интерпретировать как представление четырех строк, по пять значений температуры в каждой.
Выражение maxtemps [0] означает первый элемент массива maxtemps. Таким образом, maxtemps [0] — сам по себе массив из пяти int. Первым элементом массива maxtemps [0] является maxtemps [0] [0], и этот элемент имеет тип int. Таким образом, для доступа к элементам int должны использоваться два индекса. Первый индекс можно представлять как строку таблицы, а второй — как ее столбец (рис. 5.6).
Предположим, что требуется распечатать все содержимое массива. В этом случае можно использовать цикл for для прохода по строкам и второй вложенный цикл for — для прохода по столбцам:
for (int row = 0; row < 4; row+ + ){
for (int col = 0; col < 5; ++col)
cout << maxtemps [row] [col] << "\t"; cout << endl;
}
Для каждого значения row вложенный цикл for проходит по значениям col. Этот пример печатает символ табуляции (\t в нотации управляющих символов C++) после каждого значения и символ новой строки после каждой полной строки.
Инициализация двумерного массива
При создании двумерного массива имеется возможность инициализировать каждый его элемент. Прием основан на способе инициализации одномерного массива. Вспомните, что это делается указанием разделенного запятыми списка элементов, заключенного в фигурные скобки:
// Инициализация одномерного массива
int btus [ 5 ] = {23, 26, 24, 31, 28};
В двумерном массиве каждый элемент сам по себе является массивом, поэтому инициализировать каждый элемент можно так, как показано в предыдущем примере. То есть инициализация состоит из разделенной запятыми последовательности одномерных инициализаций, каждая из которых заключена в фигурные скобки:
int maxtemps[4][5] = // двумерный массив
{96, 100, 87, 101, 105}, // значения для maxtemps[0]
{96, 98, 91, 107, 104}, // значения для maxtemps[1]
{97, 101, 93, 108, 107}, // значения для maxtemps[2]
{98, 103, 95, 109, 108} // значения для maxtemps [3]
Массив maxtemps содержит четыре строки по пять чисел в каждой.
Выражение { 96, 100, 87, 101, 105} инициализирует первую строку, представляемую как maxtemps [0]. Стиль размещения каждой строки данных в отдельной строке кода улучшает читабельность.