Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР11-С++-01-мая-2012.doc
Скачиваний:
18
Добавлен:
15.09.2019
Размер:
2.5 Mб
Скачать

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

Как вы уже знаете, C++ позволяет вашим программам инициализировать переменные при объявлении. То же верно и для массивов. При объявлении массива вы можете указать первоначальные значения, поместив их между левой и правой фигурными скобками, следующими за знаком равенства. Например, следующий оператор инициализирует массив values:

int values[5] = { 100, 200, 300, 400, 500 };

Подобным образом следующее объявление инициализирует массив с плавающей точкой:

float salaries[3] = { 25000.00. 35000.00, 50000.00 };

Если вы не указываете первоначальное значение для какого-либо элемента массива, большинство компиляторов C++ будут инициализировать такой элемент нулем. Например, следующее объявление инициализирует первые три из пяти элементов массива:

int values[5] = { 100, 200, 300 };

Программа не инициализирует элементы values[3] и values[4]. В зависимости от вашего компилятора, эти элементы могут содержать значение 0. Если вы не указываете размер массива, который вы инициализируете при объявлении, C++ распределит достаточно памяти, чтобы вместить все определяемые элементы. Например, следующее объявление создает массив, способяый хранить четыре целочисленных значения:

int numbers[] = { 1, 2, 3, 4 };

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

Примеры инициализации двумерного массива:

int s[l][2]={ {4,5,6}, {7,8,9}};

intf[l][2]={10,H, 12,13,14};

charp[2][2]={{1n'},{y}};

Массив s инициализируется полностью заданными значениями. В массиве f из его шести значений (размер массива f — 2 строки и 3 столбца) инициализируется только первые 5 элементов (это элементы с индексами 0,0 0,1 0,2 1,0 1,1). В массиве р инициализируются только 2 элемента: р[0][0]='п'и рШГ01=У.

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

Если задан размер массива, то значения, не заданные явно, определяются в зависимости от класса памяти.

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

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

void some_function(int array[], int number_of_elements);

Следующая программа ARRAYFUN.CPP передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:

#include <iostream.h>

void show_array (int array [] , int number_of_elements)

{

   int i;

   for (i = 0; i < number_of_elements; i++) cout << array[i] << ' ';

   cout << endl;

}

int main()

{

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

   int big_numbers[3] = { 1000, 2000, 3000 };

   show_array(little_numbers, 5);

   show_array(big_numbers, 3);

}

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

show_array(little_numbers, 5);

Следующая программа GETARRAY.CPP использует функцию get_values, чтобы присвоить три значения массиву numbers:

#include <iostream.h>

void get_values(int array[], int number_of_elements)

{

   int i;

   for (i = 0; i < number_of_elements; i++)

   {

       cout “ "Введите значение " << i << ": ";

       cin ” array [i];

   }

}

int main()

{

   int numbers[3];

   get_values(numbers, 3);

   cout << "Значения массива" << endl;

   for (int i = 0; i < 3; i++)

   cout << numbers [i] << endl;

}

Как видите, программа передает массив в функцию по имени. Функция в свою очередь присваивает массиву элементы. Из ЛР №14 вы узнаете, что, пока ваша программа не передаст параметры в функцию с помощью адреса, функция не может изменить эти параметры. Однако, как можно заметить в данном случае, функция get_values изменяет параметр-массив numbers. Как вы узнаете из ЛР №15, C++ действительно передает массивы в функцию, используя указатели. Таким образом, функция может изменить элементы массива, если ей это нужно.

1.7. Двумерные массивы в С++

До этого момента мы рассматривали одномерные массивы, которыми не всегда можно ограничиться. Стандартом С определены многомерные массивы. При этом двумерный массив рассматриваются как массив элементов, каж­дый из которых является одномерным массивом. Трехмерный - как массив, элементами которого являются двумерные массивы и т.д.

Например, после объявления

int a[5][6][7];

в программе могут появиться выражения:

а[i] [j] [k] _ объект типа int;

а[2][0] - объект типа int* - одномерный массив из 7 целых;

а[1] - двумерный массив из 6*7 = 42 целых;

а - сам трехмерный массив.

Так как элементом массива а является двумерный подмассив раз­мером 6*7, то при выполнении выражения а + 1 происходит смещение на величину элемента массива а, т.е. переход от а[0] к а[1]. Значение адреса при этом увеличивается на 6*7*sizeof(int) =84.

Для двумерного массива mas выражение mas[i][j] интерпретиру­ется как *(*(mas+i)+j). Здесь mas[i] - константный указатель на i-ю строку массива mas.

В памяти массивы хранятся по строкам, т.е. при обращении к эле­ментам в порядке их размещения в памяти быстрее всего меняется са­мый правый индекс.

Так, для массива с[2][3] его шесть элементов расположены в па­мяти так:

с[0][0] с[0][1] с[0][2] с[1][0] с[1][1] с[1][2].

Простейшая форма многомерного массива — двухмерный массив. Двумерный массив – это массив, каждый элемент которого имеет два индекса.

Двумерные массивы еще называются матрицей.

Простейший пример двумерного массива – таблица.

Допустим, необходимо обработать некоторые данные из таблицы. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. То есть, визуально, двумерный массив - это обычная таблица, со строками и столбцами. Фактически двумерный массив - это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m x n показана ниже (рис. 11.4), где, m - количество строк двумерного массива;  n - количество столбцов двумерного массива;  m*n - количество элементов массива.

Рис. 11. 4. Двумерный массив в С++

Синтаксис объявления двумерного массива

/*тип данных*/ /*имя массива*/[/*количество строк*/][/*количество столбцов*/];

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

тип данных;

имя массива.

После чего, в первых квадратных скобках указывается количество строк двумерного массива, во вторых квадратных скобках - количество столбцов двумерного массива. Двумерный массив визуально отличается от одномерного второй парой квадратных скобок. Рассмотрим пример объявления двумерного массива. Допустим нам необходимо объявить двумерный массив, с количеством элементов, равным 15. В таком случае двумерный массив может иметь три строки и пять столбцов или пять строк и три столбца.

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

int a[5][3];

a - имя целочисленного массива

   - число в первых квадратных скобках указывает количество строк двумерного массива, в данном случае их 5;

   -число во вторых квадратных скобках указывает количество столбцов двумерного массива, в данном случае их 3.

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

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

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

Примеры инициализации двумерного массива:

а) создается 15 элементов массива с именем а типа int:

int a[5][3] = { {4, 7, 8}, {9, 66, -1}, {5, -5, 0}, {3, -3, 30}, {1, 1, 1} };

В данном массиве 5 строк, 3 столбца; после знака присвоить ставятся общие фигурные скобочки, внутри которых ставится столько пар фигурных скобочек, сколько должно быть строк в двумерном массиве, причём эти скобки разделяются запятыми. В каждой паре фигурных скобок записывать через запятую элементы двумерного массива. Во всех фигурных скобках количество элементов должно совпадать. Так как в массиве пять строк, то и внутренних пар скобочек тоже пять. Во внутренних скобах записаны по три элемента, так как количество столбцов - три. Графически наш массив будет выглядеть, как двумерная таблица (рис. 10. 5).

Рис. 11.5. Графическая иллюстрация двумерного массива в С++

В каждой ячейке двумерного массива a показано значение, в нижнем правом углу показан адрес данной ячейки. Адресом ячейки двумерного массива является имя  массива, номер строки и номер столбца.

б) создается 6 элементов массива с именем temp типа int:

int temp[2][3] = {

{ 3, 5, 4 },

{ 7, 4, 8 }

};

Доступ к элементам массива

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

Примеры доступа к элементам двумерного массива:

num [0][1]=100; //записать в элемент num(0,1) число 100

test[1][1]=0,5; // в элемент test(1,1) записать 0,5

test[9][9]=10; // в элемент test(9,9) записать число 10