На предыдущих занятиях переменные объявлялись по одной. Между тем, достаточно часто возникает необходимость объявить набор объектов, например 20 переменных типа int. Обычно такой набор хранят в массивах.
Массив – это набор элементов, способных хранить одинаковый тип данных. Каждый элемент хранения называется элементом массива.
Объявляя массив, необходимо сначала указать тип хранимых данных, а затем имя массива и его размер. Размером массива называется число его элементов, указываемое в квадратных скобках. Вот синтаксис для создания массива:
тип имя [количество элементов];
Например: long LongArray[25];
Здесь объявлен массив из 25 элементов типа long с именем LongArray. “Увидев” это объявление, компилятор зарезервирует область памяти, достаточную для хранения 25 пепеменных типа long. Поскольку каждой переменной типа long необходимо 4 байта, весь объявленный набор займет непрерывную область памяти размером 100 байт.
Элементы массива
К каждому из элементов массива можно обратиться по его номеру, расположенному в квадратных скобках после имени массива. Номера элементов массива начинаются с нуля. Следовательно, первым элементом массива LongArray будет LongArray[0], вторым - LongArray[1] и т.д.
Например, массив SomeArray[3] состоит из трех элементов: SomeArray[0], SomeArray[1] и SomeArray[2]. В общем случае SomeArray[n], состоящий из n элементов, содержит элементы от SomeArray[0] до SomeArray[n-1].
Рассмотрим премер, демонстрирующий, как объявить массив из 5 целых чисел и заполнить его значениями.
В строке 9 объявлен массив myArray из пяти целочисленных переменных. В строке 11 начинается цикл от 0 до 4, перечисляющий все пять элементов массива. Пользователь предлагается ввести значение, сохраняемое в соответствующем элементе массива.
Первое значение сохраняется в myArray[0], второе – в myArray[1] и т.д. второй цикл выводит каждое значение на экран.
Вывести массив в обратном порядке!
Инициализация массивов
Небольшой массив переменных встроеных типов, например int, можно инициализировать при объявлении массива. Для этого после имени массива размещают знак равенства (=) и заключенный в фигурные скобки список значений, отделяемых запятой. Например:
int IntegerArray[6] = {10, 20, 30, 40, 50, 60};
здесь объявлен массив IntegerArray из пяти целочисленных элементов, которым присвоены значения IntegerArray[0] – 10, IntegerArray[1] – 20 и т.д.
Если размер массива не указан, но список значений присутствует, то будет создан и инициализирован массив достаточного размера, чтобы содержать все перечисленные значения. Таким образом, эта строка аналогична предыдущей:
int IntegerArray[] = {10, 20, 30, 40, 50, 60};
Нельзя инициализировать количество элементов, превосходящее объявленный размер массива.
int IntegerArray[5] = {10, 20, 30, 40, 50, 60};
такая строка приведет к ошибке компиляции, поскольку объявлен массив для 5 элементов, а инициализировать пытались 6. Но следующая запись вполне допустима.
int IntegerArray[5] = {10, 20};
Здесь в не инициализированных элементах будет храниться машинный мусор.
Размерность массива должна быть константой или константным выражением. Рекомндуется размерность массива вводить как константу, в общем.
Расмотрим еще один пример создания одномерного массива.
В массиве из n элементов найти количество положительных элементов между минимальным и максимальным элементами массива.
Определить, является ли заданный текст правильной записью целого числа (возможно, со знаком).
19 строчка j==10
Многомерные массивы
Можно создать многомерные массивы. Массив может иметь любое число размерностей, но в большинстве случаев достаточно иметь одну или две.
Примером двумерного массива может служить шахматная доска. Одна размерность предоставляет собой восемь рядов по горизонтали; другая – восемь по вертикали.
Инициализация многомерных массивов
Предположим мы объявили двумерный массив:
int Array[5][3];
Инициализировать такой массив можно следующим образом:
int Array[5][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
чтобы было понятней, значения при инициализации можно разделитьт фигурными скобками. Например:
int Array[5][3] = { {1,2,3},
{4,5,6},
{7,8,9},
{10,11,12},
{13,14,15} };
Компилятор проигнорирует внутренние фигурные скобки, но они сделают набор чисел нагляднее и понятнее.
Вне зависимости от фигурных скобок, кождое значение следует отделять запятой.
Рассмотрим пример создания двумерного массива.
В стоке 11 обьявлен массив размерностью n на n, где n, в нашем случае равняется трем. В строке 12 пользователю предлогается заполнить этот массив значениями, а именно ввести 9 значений. В строках 16-21 каждый четный элемент массива заменяется 0, а нечетный - 1.
Далее преобразованная матрица выводится на экран.
При обьявлении массива компилятору точно указывают, сколько объектов планируется в нем сохранить. Компилятор зарезервирует память для всенх объктов массива, даже если они не будут использованы. Если известно заранее, сколько элементов должен хранить массив, то никаких проблем не возникает. Но если количество элементов массив неизвестно, придется применять иные средства организации данных.
Найти матрицу С равную сумме двух матриц А и В и матрицу D равную разности матриц А и В. Матрицы одинаковой размерности.
#include "stdafx.h"
#include "iostream"
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
setlocale(LC_ALL, "Russian");
int i, j;
const int n = 3, m = 4;
double a[n][m], b[n][m], c[n][m], d[n][m];
cout << "Введите матрицу А (" << n << "x" << m << "): \n";
for(i = 0; i < n; i++)
for (j = 0; j < m; j++)
cin >> a[i][j];
cout << "\nВведите матрицу B (" << n << "x" << m << "): \n";
for(i = 0; i < n; i++)
for (j = 0; j < m; j++)
cin >> b[i][j];
for(i = 0; i < n; i++)
for (j = 0; j < m; j++)
c[i][j]= a[i][j] + b[i][j];
for(i = 0; i < n; i++)
for (j = 0; j < m; j++)
d[i][j]= a[i][j] - b[i][j];
cout << "\nМатрица C: ";
for(i = 0; i < n; i++)
{
cout << "\n";
for (j = 0; j < m; j++)
cout << c[i][j] << "\t";
}
cout << "\nМатрица D: ";
for(i = 0; i < n; i++)
{
cout << "\n";
for (j = 0; j < m; j++)
cout << d[i][j] << "\t";
}
cout << "\n";
system("pause");
return 0;
}
В целочисленной матрице найти номер строки, содержащей минимальное количество нулевых элементов.
Сортировка массивов
Сортировка – это размещение объектов в определенном порядке (по возрастанию или по убыванию).
Вообще говоря, это большая и сложная тема, в которой известно много различных алгоритмов. Критерии оценки эффективности этих алгоритмов могут включать следующие параметры:
ü количество шагов алгоритма, необходимых для упорядочения;
ü количество сравнений элементов;
ü количество перестановок, выполняемых при сортировке.
Мы рассмотрим только три простейшие схемы сортировки.
Метод "пузырька"
По-видимому, самым простым методом сортировки является так называемый метод "пузырька". Чтобы уяснить его идею, представьте, что массив (таблица) расположен вертикально. Элементы с меньшим значением всплывают вверх наподобие пузырьков. При первом проходе вдоль массива, начиная проход "снизу", берется первый элемент и поочередно сравнивается с последующими. При этом:
если встречается более "тяжелый" (с большим значением) элемент, то они меняются местами;
при встрече с более "легким" элементом, последний становится "эталоном" для сравнения, и все следующие сравниваются с ним .
В результате наименьший элемент оказывается в самом верху массива.
Расположим массив сверху вниз, от нулевого элемента - к последнему. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.
После нулевого прохода по массиву "вверху" оказывается самый "легкий" элемент - отсюда аналогия с пузырьком. Следующий проход делается до второго сверху элемента, таким образом, второй по величине элемент поднимается на правильную позицию...
Делаем проходы по все уменьшающейся нижней части массива до тех пор, пока в ней не останется только один элемент. На этом сортировка заканчивается, так как последовательность упорядочена по возрастанию.
Заметим, что при втором и последующих проходах, нет необходимости рассматривать ранее "всплывшие" элементы, т.к. они заведомо меньше оставшихся. Другими словами, во время i-го прохода не проверяются элементы, стоящие на позициях выше j.