Опубликован: 26.06.2003 | Доступ: свободный | Студентов: 36764 / 5417 | Оценка: 4.07 / 3.80 | Длительность: 15:08:00
ISBN: 978-5-9556-0017-8
Лекция 8:

Производные типы данных

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Аннотация: Создание и использование массивов, структур, объединений, указателей. Адресная арифметика. Строки и литералы.

Массивы

Массив – это коллекция нескольких величин одного и того же типа. Простейшим примером массива может служить набор из двенадцати целых чисел, соответствующих числу дней в каждом календарном месяце:

int days[12];  
days[0] = 31;     // январь
days[1] = 28;     // февраль
days[2] = 31;     // март
days[3] = 30;     // апрель
days[4] = 31;     // май
days[5] = 30;     // июнь
days[6] = 31;     // июль
days[7] = 31;     // август
days[8] = 30;     // сентябрь
days[9] = 31;     // октябрь
days[10] = 30;    // ноябрь
days[11] = 31;    // декабрь

В первой строчке мы объявили массив из 12 элементов типа int и дали ему имя days. Остальные строки примера – присваивания значений элементам массива. Для того, чтобы обратиться к определенному элементу массива, используют операцию индексации []. Как видно из примера, первый элемент массива имеет индекс 0, соответственно, последний – 11.

При объявлении массива его размер должен быть известен в момент компиляции, поэтому в качестве размера можно указывать только целую константу. При обращении же к элементу массива в роли значения индекса может выступать любая переменная или выражение, которое вычисляется во время выполнения программы и преобразуется к целому значению.

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

for (int i = 0; i < 12; i++) {
     cout << days[i];
}

Следует отметить, что при выполнении программы границы массива не контролируются. Если мы ошиблись и вместо 12 в приведенном выше цикле написали 13, то компилятор не выдаст ошибку. При выполнении программа попытается напечатать 13 -е число. Что при этом случится, вообще говоря, не определено. Быть может, произойдет сбой программы. Более вероятно, что будет напечатано какое-то случайное 13 -е число. Выход индексов за границы массива – довольно распространенная ошибка, которую иногда очень трудно обнаружить. В дальнейшем при изучении классов мы рассмотрим, как можно переопределить операцию [] и добавить контроль за индексами.

Отсутствие контроля индексов налагает на программиста большую ответственность. С другой стороны, индексация – настолько часто используемая операция, что наличие контроля, несомненно, повлияло бы на производительность программ.

Рассмотрим еще один пример. Предположим, что имеется массив из 100 целых чисел, и его необходимо отсортировать, т.е. расположить в порядке возрастания. Сортировка методом "пузырька" – наиболее простая и распространенная – будет выглядеть следующим образом:

int array[100];
. . .
for (int i = 0; i < 99; i++ ) {
     for (int j = i + 1; j < 100; j++) {
          if (array[j] < array[i] ) {
               int tmp = array[j];
               array[j] = array[i];
               array[i] = tmp;
          }
     }
}

В приведенных примерах у массивов имеется только один индекс. Такие одномерные массивы часто называются векторами. Имеется возможность определить массивы с несколькими индексами или размерностями. Например, объявление

int m[10][5];

представляет матрицу целых чисел размером 10 на 5. По-другому интерпретировать приведенное выше объявление можно как массив из 10 элементов, каждый из которых – вектор целых чисел длиной 5. Общее количество целых чисел в массиве   m равно 50.

Обращение к элементам многомерных массивов аналогично обращению к элементам векторов: m[1][2] обращается к третьему элементу второй строки матрицы m.

Количество размерностей в массиве может быть произвольным. Как и в случае с вектором, при объявлении многомерного массива все его размеры должны быть заданы константами.

При объявлении массива можно присвоить начальные значения его элементам ( инициализировать   массив ). Для вектора это будет выглядеть следующим образом:

int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

При инициализации многомерных массивов каждая размерность должна быть заключена в фигурные скобки:

double temp[2][3] = {
     { 3.2, 3.3, 3.4 },
     { 4.1, 3.9, 3.9 } };

Интересной особенностью инициализации многомерных массивов является возможность не задавать размеры всех измерений массива, кроме самого последнего. Приведенный выше пример можно переписать так:

double temp[][3] = {
     { 3.2, 3.3, 3.4 },
     { 4.1, 3.9, 3.9 } };
// Вычислить размер пропущенной размерности
const int size_first = sizeof (temp) / sizeof 
                       (double[3]);
< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?

Маргарита Башкатова
Маргарита Башкатова
Дарья Ильина
Дарья Ильина
Россия, Барнаул, Алтайский Государственный университет, 2016
Игорь Хан
Игорь Хан
Узбекистан, Ташкент, Ташкентский педагогический институт иностранных языков, 1990