Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2183 / 522 | Длительность: 24:14:00
Лекция 5:

Массивы

Аннотация: Эта глава является ключевой в изучении программирования на С(С++). В ней описаны методы построения алгоритмов и программ с использованием статических и динамических массивов. В заключительном параграфе главы на большом количестве примеров рассматривается совместное использование указателей, динамических массивов и функций пользователя при решении сложных задач обработки массивов.

5.1 Статические массивы в С(С++)

Часто для работы с множеством однотипных данных (целочисленными значениями, строками, датами и т.п.) оказывается удобным использовать массивы. Например, можно создать массив для хранения фамилий студентов, обучающихся в одной группе. Вместо создания переменных для каждого студента, например Студент1, Студент2 и т.д., достаточно создать один массив, где каждой фамилии из списка будет присвоен порядковый номер. Таким образом, можно дать следующее определение. Массив — структурированный тип данных, состоящий из фиксированного числа элементов одного типа.

Массив в табл. 5.1 имеет 8 элементов, каждый элемент сохраняет число вещественного типа. Элементы в массиве пронумерованы (нумерация массивов начинается с нуля). Такого рода массив, представляющий собой просто набор данных одного и того же типа, называют простым или одномерным массивом. Для доступа к данным, хранящимся в определённом элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.

Таблица 5.1. Одномерный числовой массив
№ элемента массива 0 1 2 3 4 5 6 7
Значение 13.65 -0.95 16.78 8.09 -11.76 9.07 5.13 -25.64

Если возникает необходимость хранения данных в виде матриц, в формате строк и столбцов, то необходимо использовать двумерные массивы. В табл. 5.2 приведён пример массива, состоящего из четырёх строк и пяти столбцов. Это двумерный массив. Строки в нём можно считать первым измерением, а столбцы вторым. Для доступа к данным, хранящимся в этом массиве, необходимо указать имя массива и два индекса, первый должен соответствовать номеру строки, а второй номеру столбца, где хранится необходимый элемент.

Таблица 5.2. Двумерный числовой массив
1.5 -0.9 1.8 7.09 -1.76
3.6 0.5 6.7 0.09 -1.33
13.65 0.95 16.78 8.09 -11.76
7.5 0.95 7.3 8.9 0.11

Если при описании массива определён его размер, то массив называют статическим. Рассмотрим работу с одномерными статическими массивами в языке С(С++). Двумерные массивы подробно описаны в следующей главе.

5.1.1 Описание статических массивов

Описать статический массив в С(С++) можно так:

тип имя_переменной [размерность];

размерность — количество элементов в массиве. Например:

int x[10]; //Описание массива из 10 целых чисел. Первый
//элемент массива имеет индекс 0, последний 9.
float a[20]; //Описание массива из 20 вещественных чисел.
//Первый элемент массива имеет индекс 0, последний 19.

Размерность массива и тип его элементов определяют объём памяти, который необходим для хранения массива. Рассмотрим ещё один пример описания массива:

const int n=15; //Определена целая положительная константа.
double B[n]; //Описан массив из 15 вещественных чисел.

При описании статического массива в качестве размерности можно использовать целое положительное число или предопределённую константу.

Элементы массива в С(С++) нумеруются с нуля. Первый элемент всегда имеет номер ноль, а номер последнего элемента на единицу меньше заданной при его описании размерности:

char C[5]; //Описан массив из 5 символов, нумерация от 0 до 4.

5.1.2 Основные операции над массивами

Доступ к каждому элементу массива осуществляется с помощью индекса — порядкового номера элемента. Для обращения к элементу массива указывают его имя, а затем в квадратных скобках индекс:

имя_массива [индекс]

Например:

const int n=15;
double C[n], S;
S=C[0]+C[n-1]; //Сумма первого и последнего элементов массива С.

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

тип имя_переменной[размерность]={элемент_0, элемент_1, ...};

Например:

float a[6] = { 1.2, ( float ) 3/4, 5./6, 6.1 };
//Формируется массив из шести вещественных чисел, значения элементам присваиваются по
//порядку. Элементы, значения которых не указаны (в данном случае a[4], a[5]), обнуляются:
//a[0]=1.2, a[1]=(float)3/4, a[2]=5./6, a[3]=6.1, a[4]=0, a[5]=0,
//для элементов a[1] и a[2] выполняется преобразование типов.

Рассмотрим, как хранится массив в памяти компьютера. Предположим, была описана переменная:

double x[30];

это значит, что в памяти компьютера выделяется место для хранения 30 элементов типа double. При этом адрес выделенного участка памяти хранится в переменной x. Таким образом, к значению нулевого элемента массива можно обратится двумя способами:

  1. В соответствии с синтаксисом языка С(С++) записать x[0].
  2. Применить операцию *x, так как адрес начала массива хранится в переменной x (по существу x — указатель на double).

Если к значению x добавить единицу (число 1), то мы сместимся на один элемент типа double. Таким образом, x+1 — адрес элемента массива x с индексом 1. К первому элементу массива x также можно обратиться двумя способами: x[1] или *(x+1). Аналогично, к элементу с индексом 2 можно обращаться либо x[2], либо *(x+2). Таким образом, получается, что к элементу с индексом i можно обращаться x[i] или *(x+i).

При обработке массива (независимо от способа обращения x[i] или *(x+i)) программист сам должен контролировать, существует ли элемент массива x[i] (или *(x+i)) и не вышла ли программа за границы массива.

Особенностью статических массивов является определение размера при написании текста программы. При необходимости увеличить размер массива, необходимо изменить текст программы и перекомпилировать её. При динамическом выделении памяти для массивов в С(С++) можно использовать указатели и операторы (функции) выделения памяти.

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?