Добавил:
Преподаватель Колледжа информационных технологий Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / МАССИВЫ

.pdf
Скачиваний:
40
Добавлен:
08.05.2022
Размер:
867.93 Кб
Скачать

ГЛАВА 8. МАССИВЫ И СТРОКИ

 

Оглавление

 

§8.1 Определение массива

1

§8.2 Объявление и инициализация статических массивов

2

§8.3 Доступ к данным, хранимым в массиве

4

§8.4 Многомерные массивы

5

§8.5 Передача массивов в функции

10

§8.6 Массивы и циклы

11

§8.1 Определение массива

Ранее мы объявляли переменные для хранения одиночного значения типа int, char или string, даже если использовалось несколько их экземпляров. Однако можно объявить коллекцию объектов, например, 20

целых чисел или стаю котов.

Определение слова массив (array) в словаре довольно близко к тому, что мы хотим понять. Согласно словарю Вебстера, массив — это «группа элементов, формирующих полный набор, например массив солнечных панелей».

Массивы позволяют сохранить в памяти элементы данных одинакового типа в последовательном порядке.

Массив — совокупный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора.

Рассмотрим случай, когда нужно записать результаты тестов 30

студентов в классе. Без использования массива нам придется выделить почти

30одинаковых переменных.

//Выделяем 30 целочисленных переменных int testResultStudent1;

int testResultStudent2; int testResultStudent3;

1

// ...

int testResultStudent30;

С использованием массива всё гораздо проще. Следующая строка эквивалентна коду, приведенному выше:

int testResult[30];

В объявлении переменной массива мы используем квадратные скобки [],

чтобы сообщить компилятору, что это переменная массива (а не обычная переменная), а в скобках — количество выделяемых элементов (это называется длиной или размером массива).

В примере, приведенном выше, мы объявили фиксированный массив с именем testResult и длиной 30. Фиксированный массив (или «массив фиксированной длины») представляет собой массив, размер которого известен во время компиляции. При создании testResult, компилятор выделит 30

целочисленных переменных.

§8.2 Объявление и инициализация статических массивов

§8.2.1 Объявление и инициализация массивов на С++

Для объявления массива на языке программирования С++ используется

следующий синтаксис:

тип_элемента имя_массива [количество_элементов] =

{необязательные исходные значения};

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

int MyNumbers [5] = {34, 56, -21, 5002, 365};

Все элементы массива можно также инициализировать одним

значением:

int MyNumbers [5] = {100};

Здесь все элементы массива MyNumbers инициализируются значением

100.

2

Вы можете также инициализировать только часть элементов массива:

int MyNumbers [5] = {100, 200};

Здесь проинициализированы только первые два элементы массива

MyNumbers. При частичной инициализации массивов некоторые компиляторы инициализируют проигнорированные вами элементы исходным значением 0.

Если исходное количество элементов в массиве неизвестно, можно не указывать его:

int MyNumbers [] = {100, 200, 300};

Приведенный выше код создает массив длиной равной трем.

Массивы, которые мы объявляли до сих пор, называются статическими массивами, поскольку их длина фиксируется программистом во время компиляции. Такой массив не может принять больше данных, чем определил программист.

§8.2.2 Объявление и инициализация массивов на С#

Объявление массива в С# похоже на объявление переменной за тем исключением, что после указания типа ставятся квадратные скобки:

тип_элемента[] имя_массива;

Например, определим массив целых чисел:

int[] numbers;

После определения переменной массива мы можем присвоить ей определенное значение:

int[] numbers = new int[5];

Здесь вначале мы объявили массив nums, который будет хранить данные типа int. Далее используя операцию new, мы выделили память для пяти элементов массива: new int[5]. Число 5 – здесь является длиной массива.

При таком определении все элементы получают значение по умолчанию,

которое предусмотрено для их типа. Для типа int значение по умолчанию - 0.

Также мы сразу можем указать значения для этих элементов:

int[] nums2 = new int[4] { 1, 2, 3, 5 };

3

int[] nums3 = new int[] { 1, 2, 3, 5 }; int[] nums4 = new[] { 1, 2, 3, 5 }; int[] nums5 = { 1, 2, 3, 5 };

Все перечисленные выше способы будут равноценны.

§8.3 Доступ к данным, хранимым в массиве

Каждая из переменных в массиве называется элементом. Элементы не имеют своих собственных уникальных имен.

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

Для доступа к элементам массива используется имя массива вместе с

оператором индекса [] и параметром-индексом, и который сообщает компилятору, какой элемент мы хотим выбрать.

В вышеприведенном примере первым элементом в нашем массиве является testResult[0], второй — testResult[1], десятый — testResult[9], последний — testResult[29]. Хорошо, что уже не нужно отслеживать и помнить кучу разных (хоть и похожих) имен переменных — для доступа к разным элементам нужно изменять только индекс.

В массиве длиной элементы массива будут пронумерованы от 0 до

− 1! Это называется диапазоном массива.

Индексы массивов всегда должны быть интегрального типа данных (т.е.

типа char, short, int, long, long long, bool и т.д.). Эти индексы могут быть либо константными значениями, либо неконстантными значениями.

Здесь мы можем наблюдать как определение, так и индексирование массива:

Листинг 8.1.

1#include <iostream>

2using namespace std;

4

3

int main()

4

{

5

int array[5]; // массив из пяти чисел

6

array[0] = 3; // индекс первого элемента - 0 (нулевой

 

элемент)

7

array[1] = 2;

8

array[2] = 4;

9

array[3] = 8;

10

array[4] = 12; // индекс последнего элемента - 4

11

cout << "The array element with the smallest index has

 

the value " << array[0] << "\n";

12

cout << "The sum of the first 5 numbers is " << array[0]

 

+ array[1] + array[2] + array[3] + array[4] << "\n";

13

return 0;

14

}

Результат выполнения программы:

The array element with the smallest index has the value 3

The sum of the first 5 numbers is 29

Синтаксис присвоения целого числа элементу в этом массиве очень похож на присвоение значения целочисленной переменной.

§8.4 Многомерные массивы

Массивы, которые мы рассматривали до сих пор, напоминали книги на полке. Может быть больше книг на более длинной полке или меньше на более короткой. Таким образом, длина полки — единственная размерность,

определяющая ее емкость, следовательно, она одномерна.

Но что, если нам теперь нужно использовать массив для моделирования солнечных панелей, как показано на рисунке 8.1? Солнечные панели будут распространяться в двух размерностях: по длине и ширине.

5

Рисунок 8.1

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

каждый из которых является сам массивом из трех элементов, иными словами,

как массив из массивов.

В зависимости от необходимости и характера приложения вы также можете создавать в памяти многомерные (трехмерные, четырехмерные и т.д.)

массивы.

§8.4.1 Объявление и инициализация многомерных массивы на С++

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

представляющий солнечные панели на рисунке 8.1, можно объявить так:

int SolarPanels [2][3];

Обратите внимание, что на рисунке 8.1 каждой из шести панелей присвоен номер от 0 до 5. Если бы пришлось инициализировать целочисленный массив в том же порядке, то это выглядело бы так:

int SolarPanels [2][3] = {{0, 1, 2}, {3, 4, 5}};

Синтаксис инициализации подобен используемому при инициализации одномерных массивов. Обратите внимание: это не два массива, это два его

6

ряда по три элемента в каждом ряде. Если бы этот массив состоял из трех рядов и трех столбцов, его объявление и инициализация выглядели бы таким образом:

int SolarPanels [3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

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

Компилятор раскладывает многомерный массив в области памяти, которая расширяется только в одном направлении. Если инициализировать тот же массив SolarPanels следующим образом, то результат был бы неизменен.

int SolarPanels [2][3] = {0, 1, 2, 3, 4, 5};

Для простоты понимания механизма получения доступа к элементам многомерного массива будет считать многомерный массив массивом массивов.

Как пример рассмотрим массив солнечных панелей из 2 рядов и 3

столбцов. Его можно представить как массив, состоящий из двух элементов,

каждый и которых является массивом, состоящим из трех целых чисел.

Когда необходимо получить доступ к целому числу в этом массиве,

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

Рассмотрим следующий массив:7

int SolarPanels [2][3] = {{0, 1, 2}, {3, 4, 5}};

Он инициализирован способом, который можно рассматривать как два массива, каждый из которых содержит три числа. Здесь целочисленный элемент со значением 1 находится в позиции [0][1], а элемент со значением 5

находится в позиции [1][2].

В коде программы обращение к элементам массива происходит по имени массива с указанием позиции элемента.

cout << SolarPanels[1][2] << endl; // 5

7

§8.4.2 Объявление и инициализация многомерных массивы на С#

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

таких массивов количество измерений (то есть ранг) больше 1.

Массивы, которые имеют два измерения (ранг равен 2), называют двухмерными. Например, создадим одномерный и двухмерный массивы,

которые имеют одинаковые элементы:

int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 }; int[,] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };

Визуально оба массива можно представить следующим образом:

Одномерный массив nums1

0

1

2

3

4

5

 

 

 

 

 

 

Двухмерный массив nums2

0

1

2

 

 

 

3

4

5

 

 

 

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

int[,] nums1;

int[,] nums2 = new int[2, 3];

int[,] nums3 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums4 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums5 = new [,]{ { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums6 = { { 0, 1, 2 }, { 3, 4, 5 } };

Массивы могут иметь и большее количество измерений. Объявление

трехмерного массива могло бы выглядеть так:

int[,,] nums3 = new int[2, 3, 4];

8

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

От многомерных массивов надо отличать массив массивов или так называемый «зубчатый массив»:

int[][] nums = new int[3][]; nums[0] = new int[2] { 1, 2 };

//выделяем память для первого подмассива nums[1] = new int[3] { 1, 2, 3 };

//выделяем память для второго подмассива

nums[2] = new int[5] { 1, 2, 3, 4, 5 };

// выделяем память для третьего подмассива

Здесь две группы квадратных скобок указывают, что это массив массивов, то есть такой массив, который в свою очередь содержит в себе другие массивы. Причем длина массива указывается только в первых квадратных скобках, все последующие квадратные скобки должны быть пусты: new int[3][]. В данном случае у нас массив nums содержит три массива.

Причем размерность каждого из этих массивов может не совпадать.

Зубчатый массив nums

1 2

1 2 3

1

2

3

4

5

 

 

 

 

 

Примеры массивов представлены на рисунке 8.1.

9

 

Рисунок 8.1. Примеры массивов

 

Причем можно использовать в качестве массивов и многомерные:

 

 

1

int[][,] nums = new int[3][,]

 

 

2

{

 

 

3

new int[,] { {1,2}, {3,4} },

 

 

4

new int[,] { {1,2}, {3,6} },

 

 

5

new int[,] { {1,2}, {3,5}, {8, 13} }

 

 

6

};

 

 

Так здесь у нас массив из трех массивов, причем каждый из этих

массивов представляет двухмерный массив.

Суммируем основные понятия массивов:

Ранг (rank): количество измерений массива

Длина измерения (dimension length): длина отдельного измерения

массива

Длина массива (array length): количество всех элементов массива Например, возьмем массив

int[,] numbers = new int[3, 4];

Массив numbers двухмерный, то есть он имеет два измерения, поэтому его ранг равен 2. Длина первого измерения - 3, длина второго измерения - 4.

Длина массива (то есть общее количество элементов) - 12.

§8.5 Передача массивов в функции

Если функция принимает в качестве параметра массив, то фактически в эту функцию передается указатель на первый элемент массива. То есть, как и

10