Вы находитесь на странице: 1из 59

Кафедра менеджмента технологий

Основы алгоритмизации и
программирования на
языках высокого уровня

Холодова Елена Петровна


+375 29 681 63 09
alena-kholadava@yandex.ru
Минск, 2017
Массивы в С++

1. Понятие массива. Объявление массивов.


Доступ к элементам массива.
2. Одномерные и двумерные статические
массивы.
3. Инициализация массивов.
4. Действия над массивами.
5. Сортировка массивов.

2
1. Понятие массива. Объявление
массивов
Массив – это последовательность
переменных одного типа, использующая
одно имя.
Индекс – ссылка на конкретное значение в
массиве.

Массивы удобны для хранения огромного


количества взаимосвязанных значений.
 Для современного программирования
массивы являются фундаментальными объектами.
3
1 2 3 4 5 6

Индексы элементов
0 1 2 3 4 5

4
 Объявление одномерного массива
имеет следующий вид:

тип имя_массива [размер] ;

 Объявление двумерного массива


имеет следующий вид:

тип имя_массива [число строк] [число


столбцов] ;
6
Пример. Объявление одномерного массива v
из трех элементов (v[0], v[l] и v[2]) типа int
int v[3];
Пример. Объявление двумерного массива a
из трех строк и двух столбцов типа double
double a[3][2];

Двумерный массив можно трактовать


как двумерную матрицу.

7
 Обращение к каждому элементу массива
осуществляется с помощью индексов.
 Индекс определяет позицию элемента внутри
массива.
 В С++ все массивы используют ноль в качестве
индекса своего первого элемента!
Пример. Объявление массива my_array и присваивание
значений его элементам.

int my_array [3];


my_array[0] = 12;
my_array[1] = 1245;
my_array[2] = 18094; 8
 Размер массива - целое число, хотя в общем случае может быть и
произвольным константным выражением, величина которого должна
быть определена перед началом выполнения программы.

Обратите внимание на присутствие


Пример. спецификатора const. При объявлении
массива его размерность должна быть
определена:
const int n = 3; целым положительным числом (как в
предыдущем примере)
int my_array [n]; или
целой положительной константой.

my_array[0] = 12;
my_array[1] = 1245;
my_array[2] = 18094; P.S. Объявление int my_array[n] без
предварительной инициализации
переменной n и объявлении ее
константой вызовет ошибку
компиляции. 9
Пример 1. Пример 2.
Размерность двумерного Размерность двумерного
массива определена массива определена
целыми положительными целыми положительными
числами константами

int my_array [3][4]; const int n = 3;


const int m = 4;
int my_array [n][m];

10
Запрещено также объявление массива без
указания размерности (например, int my_array[ ])
за исключением объявления с инициализацией
(см. раздел инициализация массивов). Это
происходит от того, что память под все элементы
массива выделяется на этапе компиляции.
Исключение составляет объявление
массива в динамической памяти.

Память, используемая для хранения массива,


должна оставаться выделенной на все время
существования массива.

11
   В С++ не выполняется
никакой проверки "нарушения
границ" массивов, т.е. ничего не
может помешать программисту
обратиться к массиву за его
пределами: компилятор запустит
такой код на выполнение, но
результаты могут быть
непредсказуемые.

12
2. Одномерные и двумерные
статические массивы
С++ допускает возможность создания многомерных
массивов. Простейшей формой такого массива
является двумерный массив. Для того, чтобы создать
двумерный массив, надо записать:
тип имя [число строк][число столбцов];

Левый индекс нумерует строки, а правый столбцы. В


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

13
14
15
16
Двумерные массивы представляются в виде
матрицы, состоящей из строк и столбцов. Доступ к
элементам массива осуществляется по двум
индексам.
Двумерный массив можно рассматривать как
одномерный массив, содержащий, в свою очередь,
в качестве элементов одномерные массивы!
При этом число строк является размерностью
самого массива, а число столбцов – размерностью
массивов его составляющих.

17
Массив my_array[3][4] – это :
my_array[0][0] my_array[0][1] my_array[0][2] my_array[0][3]

my_array[1][0] my_array[1][1] my_array[1][2] my_array[1][3]

my_array[2][0] my_array[2][1] my_array[2][2] my_array[2][3]

 В памяти компьютера двумерные


массивы хранятся по строкам.

18
3. Инициализация массивов. Доступ
к элементам массива

В С++ предусмотрено несколько способов


инициализации массивов:
1. Инициализация при объявлении
2. Инициализация в цикле

19
Инициализация одномерных массивов

1. Инициализация при объявлении


а) int my_array [3] = {12, 1245, 18094};
// Важно!! Следующий фрагмент кода не является правильным!!
int my_array [3];
my_array [3]= {12, 1245, 18094}; /*Ошибка
компиляции!! Так инициализировать можно только
при объявлении. */
b) const int n = 3;
int my_array [n] = {12, 1245, 18094};

20
Объявление с инициализацией без указания
размерности. При этом компилятор сам определяет
размерность массива в процессе компиляции.
c) int my_array [ ] = {12, 1245,
18094};
Объявление с инициализацией не всех
элементов. В следующем примере компилятор
инициализирует нулями два оставшихся элемента
массива.
d) int my_array [5] = {12, 1245,
18094}; 21
2. Инициализация в цикле

тип имя_массива[размер];
for (i=0;i<размер;i++) имя_массива[i]= значение;

или

тип имя_массива[размер];
for (i=0;i<=размер-1;i++) имя_массива[i]= значение;

22
23
В программе использован оператор цикла, индексная переменная i
которого пробегает значения от 0 до 5 включительно. Значение 2i
присваивается элементу массива и выводится на экран.
Важной особенностью языка С++ является то, что ячейки памяти, в
которые заносятся значения элементов массива, размещены рядом, то
есть являются смежными. Эта особенность является достаточно
полезной и может успешно использоваться на практике. С этой же
особенностью языка С++ связана потенциальная опасность
использования массивов. Поскольку проверки на предмет выхода за
пределы массива в С++ нет, неверно указанный индекс элемента
массива приводит к тому, что выполняется обращение к одной из
смежных ячеек за пределами массива. Такая ситуация как ошибочная не
идентифицируется, но скажется только на выполнении программы. Но
вот если в такую ячейку значение записывается, то дело может
закончиться не только ошибкой в выполнении программы, но и крахом
всей операционной системы.
24
Пример. В программе осуществляется объявление массива из 5 элементов,
значения которых вводятся пользователем в диалоговом режиме. Затем
введенный массив выводится на экран.

25
Важно!! Работая с массивами, следует иметь в виду
серьезное ограничение:
В С++ недопустимо копировать один массив в другой с
помощью операции присваивания.
Например, следующий фрагмент неправилен:

int our_array [5];


our_array = my_array; /*Ошибка компиляции
*/

 Копирование должно быть поэлементное.

26
Пример. Копирование элементов массива old_price в массив new_price и его вывод.

27
Пример вывод в обратном порядке.

28
Инициализация двумерных массивов

1. Инициализация при объявлении

a) int my_array [4][3] = {


{12, 1245, 18094},
{2, 518, 45},
{45, 67, 45},
{34, 562, 98}
};

Если опустить внутренние фигурные скобки, то результат не


изменится. В любом случае, заполнение массива будет
осуществляться построчно.
29
30
Пример. Создание многомерного массива.

31
32
b) const int n = 4;
const int m=3;
int my_array [n][m] = { {12, 1245, 18094}, {2,
518, 45}, {45, 67, 45}, {34, 562, 98} };

33
Объявление с инициализацией без указания размерности строк.
c) int my_array [ ][3] = { {12, 1245, 18094}, {2,
518, 56}, {45, 67, 45}, {34, 562, 98} };

Можно не указывать размерность, определяющую


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

int my_array [ ][ ] = { {12, 1245, 18094}, {2, 518,


56}, {45, 67, 45}, {34, 562, 98} }; /*Ошибка
компиляции!! */
34
Объявление с инициализацией не всех элементов.
d) int my_array [4][3] = { {12, 1245, 18094},
{2, 518}, {45, 67, 45}, {34, 98} };
Можно пропустить инициализацию значений в любой
строке, при этом значение автоматически будет
инициализировано нулем.

12 1245 18094
2 518 0
45 67 45
34 98 0

35
2. Инициализация в цикле

36
Обратите внимание на использование вложенных циклов for
при инициализации многомерных массивов. Массив
инициализируется построчно.

37
В следующем примере элементам массива присваиваются значения:

0, если сумма индексов элемента образует нечетное число


1, если сумма индексов элемента образует четное число

Результат выполнения показан на рисунке.

38
39
Пример.
Программа, которая инициализирует массив как показано
на рисунке, т.е. заполняет единицами второстепенную
диагональ.

40
41
Пример. Программа, в которой вычисляется скалярное
произведение двух векторов. Каждый вектор реализуется
как одномерный массив из трех элементов. Элементы
векторов вводятся пользователем. В результате
выполнения программы отображается значение
скалярного произведения этих векторов.

42
43
Задания
Вариант 1
Создать программу для вычисления среднего
арифметического элементов массива размерности n. Среднее
арифметическое вычисляется по формуле:
где xi – элементы массива, n –
количество элементов массива.

Вариант 2
Создать программу для вычисления модуля n-мерного вектора,
компоненты которого находятся в массиве. Модуль вектора
вычисляется по формуле:
где ai – компоненты массива.

44
4. Действия над массивами

45
46
47
48

5. Сортировка массивов
■ Сортировка массива методом пузырька

Существует несколько алгоритмов сортировки.


Метод пузырька состоит в следующем. Каждый элемент
массива сравнивается с соседним, и если первый из
сравниваемых элементов больше второго, эти элементы
меняются местами.
После однократного перебора всех элементов самый
большой элемент оказывается последним в массиве. Еще раз
перебрав элементы массива (последний можно не трогать -
он и так самый большой), на предпоследнее место
перемещаем второй по величине элемент и так далее.
Продолжая эту процедуру необходимое количество раз,
добиваемся ситуации, когда элементы массива размещены в
порядке возрастания.
7 6 4 8 5 3 9 1
1шаг
6 7
2 шаг
4 7
3 шаг
7 8
4 шаг
5 8
5 шаг
3 5
6 шаг
5 9
7 шаг
1 9
Новый массив

6 4 7 5 3 5 1 9

49
50
В начале программы инициализируется числовая константа, которая
определяет размер массива. Далее случайными числами в диапазоне от 0 до 19
включительно заполняется массив. Одновременно с этим соответствующие
элементы выводятся на экран для того, чтобы исходный массив можно было
сравнить с отсортированным массивом.
Сортировка массива реализуется через два вложенных цикла. Внешний
цикл for (j=l; j<= (m-1); j++) обеспечивает необходимое количество циклов
перебора элементов массива. Через внутренний цикл for (i=0; i<m-j ; i++)
реализуется непосредственно перебор элементов массива. Причем верхняя
граница для индекса элементов, которые определяются переменной i, зависит
от количества переборов элементов массива, то есть от индексной переменной
внешнего цикла.
В рамках двойного оператора цикла выполняется условный оператор, в
котором сравниваются смежные элементы массива. Если значение элемента с
меньшим индексом превышает следующий за ним элемент, они меняются
местами. После сортировки массив выводится на экран.
Как правило, метод пузырька используют при сортировке не очень
больших по размеру массивов. Данный метод, на самом деле, является не
очень продуктивным с точки зрения времени выполнения программы, поэтому
при работе с большими массивами лучше использовать иные подходы.
51
Результат выполнения программы

52
■ Сортировка одномерного массива методом выбора

Алгоритм состоит в том, что выбирается


наименьший элемент массива и меняется местами с
первым элементом, затем рассматриваются
элементы, начиная со второго, и наименьший из них
меняется местами со вторым элементом, и так далее
n-1 раз (при последнем проходе цикла при
необходимости меняются местами предпоследний и
последний элементы массива).

53
Процесс обмена элементов массива с номерами i и imin
через переменную а на i-м проходе цикла
проиллюстрирован на рисунке.
Цифры около стрелок обозначают порядок действий.

54
55
■ Сортировка методом выбора двумерного массива
построчно

56
57
Сортировка методом выбора двумерного
массива целиком

58
59
Задание
Рассчитать коэффициент вариации уровня выполнения плана
розничного товарооборота.

60