Объявление многомерных массивов
Многомерные массивы определяются аналогично одномерным массивам. Количество элементов по каждому измерению указывается отдельно в квадратных скобках:
int A1 [5] [3]; //Двумерный массив, элементами которого являются
// значения типаint
double D [10] [15] [3]; //Трехмерный массив, элементами которого являются
// значения типаdouble
Здесь массив A1представляет собой обычную двумерную матрицу из 5-ти строк и 3–х столбцов.
Массив D – трехмерный массив, который можно представить как трехмерный параллелограмм, навранный из 3-х двумерных матриц.
Общее число элементов в многомерном массиве определяется как произведение количества элементов по каждому измерению. Так, например, массив D содержит 10 * 15 * 3 = 450 элементов типа double, а объем памяти, требующийся для этого массива, будет равен 450 * 4 = 1800 байтам.
Массивы с большим, чем 3, количеством измерений используются достаточно редко. Одной из причин этого является быстрый рост объема памяти, необходимой для размещения таких массивов.
В следующей таблице показана схема размещения элементов массива A1 в памяти:
i | |||||||||||||||
j | |||||||||||||||
A1[i][j] |
Так же как и в одномерном массиве, элементы многомерных массивов располагаются друг за другом в непрерывном участке памяти.
При определении многомерные массивы могут инициализироваться определенными значениями. Для получения массива A1с теми значениями элементов, которые приведены в таблице, можно инициализировать массив следующим образом:
int A1 [5] [3] =
{
1, 1, 1,
2, 4, 8,
3, 9, 27,
4, 16, 64,
5, 25, 125
};
или так:
int A1 [ ] [3] =
{
1, 1, 1,
2, 4, 8,
3, 9, 27,
4, 16, 64,
5, 25, 125
};
Во втором определении опущен размер массива по первому индексу, при этом автоматически ему назначается значение 5 в соответствии с инициализирующими значениями. Размеры массивов по второму и по следующим индексам опускать нельзя.
Для доступа к определенному элементу многомерного массива необходимо указать в квадратных скобках конкретные значения всех индексов этого элемента. Например:
cout << A1 [1] [2];// На экран выведено значение 8
Ввод-вывод массивов
Ранее были рассмотрены приемы ввода-вывода простых предопределенных типов данных (int, double, charи bool) с помощью потоков ввода и вывода. Стандартные потоки ввода и вывода не “умеют” работать с массивами, поэтому ввод и вывод массивов необходимо реализовывать самостоятельно, обрабатывая массивы поэлементно.
Большинство алгоритмов по обработке массивов реализуются с помощью циклов. Ввод и вывод массивов не являются исключением.
Начнем с рассмотрения операций вывода значений элементов массивов на экран.
Вывод массивов
Простейший циклический алгоритм вывода значений элементов некоторого одномерного массива выглядит так:
const int n = 10;
short A[n];
…
//Для использования setw()необходимо включить #include <iomanip>
for (int i = 0; i < n; ++i)
cout << setw(8) << left << A[i];
cout << endl;
На каждом шаге этого цикла в поток вывода отправляется очередной i-й элемент массива, при этомустанавливается ширина поля вывода, равная 8 позициям, выравнивание по левому краю. После окончания цикла вывода всех n элементов массива осуществляется переход на следующую строку экрана.
Обратим внимание на то, что в программах выгоднее задавать размеры массивов через именованные константы (в данном примере – константа n), для того чтобы использовать эти же константы для управления работой циклов. При необходимости изменить размеры массива достаточно будет поменять значение этой константы. При этом все циклы, использующие для управления своей работой эту константу, автоматически приспособятся к изменившимся размерам обрабатываемого массива.
Вывод двумерных массивов, как правило, осуществляется в табличной форме. Реализация такого алгоритма может быть, например, такой:
const int n = 10, m = 10;
short A [n] [m];
…
for (int i = 0; i < n; ++i)
// Выводим i-ю строку массива
{
for (int j = 0; j < m; ++j)
// Выводим j-й элемент i-й строки массива
cout << setw(7) << right << A [i] [j];
cout << endl;
}
Здесь используются вложенные циклы. Обратите внимание, что внутренний (вложенный) цикл практически идентичен циклу, реализующему вывод элементов одномерного массива.
Ввод массивов
Ввод массивов также осуществляется с помощью циклических алгоритмов.
Простейший алгоритм ввода значений элементов одномерного массива может выглядеть так:
const int n = 10;
short A[n];
…
cout << "Введите " << n << " целых чисел: \n"
for (int i = 0; i < n; ++i)
cin >> A [i];
cin.sync(); //Очистка потока ввода от возможных лишних введенных чисел
В этом фрагменте ввод значений элементов массива можно осуществлять и в виде строки целых чисел, разделенных пробелами или символами табуляции, и по одному значению с помощью клавиши Enter. Обратите внимание на последнюю строку этого фрагмента. Эта инструкция очищает поток ввода от оставшихся в нем данных. Если в потоке ввода после окончания цикла останутся какие-либо данные (например, мы ввели не 10 требуемых значений, а ошибочно 11 чисел), то следующие за циклом инструкции ввода возьмут их из потока, что может привести к неправильной работе программы.
Следующий фрагмент обеспечивает ввод значений элементов массива с указанием номеров вводящихся элементов:
const int n = 10;
short A[n];
…
cout << "Введите " << n << " целых чисел: \n"
for (int i = 0; i < n; ++i)
{
cout << i + 1 << ": ";
cin >> arr[i];
cin.sync(); //Очистка потока ввода от возможных лишних введенных чисел
}
При заполнении двумерных массивов ввод значений элементов лучше осуществлять в табличной форме:
const int n = 10, m = 5;
short A [n] [m];
…
cout << "Введите " << n << " строк из "<< m << " целых чисел: \n"
for (int i = 0; i < n; ++i)
{
cout << "Строка " << i + 1 << ": ";
// Вводим поэлементно значения i-й строки массива
for (int j = 0; j < m; ++j)
cin >> A [i] [j];
//Очищаем поток ввода от возможных лишних введенных чисел
Cin.sync();
}
Дата добавления: 2019-02-07; просмотров: 357;