Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek6-7.doc
Скачиваний:
5
Добавлен:
15.11.2018
Размер:
98.3 Кб
Скачать

Массив констант

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

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

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

cIntArray[5] = 111; // Ошибка.

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

const char cCH[] = "0123456789";

char CH[] = "0123456789";

CH[15] = 'X';

/* Выполнение этого оператора ведет к изменению строки cCH. */

cout << cCH << endl;

Транслятор не занимается проверкой корректности выполняемых операций. На этапе выполнения программы язык C++ не предоставляет никаких средств защиты данных.

ПРИМЕР

В следующем примере подсчитывается сумма элементов массива.

#include <iostream.h>

int main(){

const int n = 10;

int marks[n] = {3, 4, 5, 4, 4};

for (int i = 0, sum = 0; i<n; i++) sum += marks[i];

std::cout << "Сумма элементов: " << sum;}

МНОГОМЕРНЫЙ МАССИВ

Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы.

Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности.

int MyArray1[10]; // Одномерный массив размерности 10.

int MyArray2[20][10]; // 20 одномерных массивов размерности 10.

int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10.

По крайней мере, для Borland C++ 4.5, элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы

MyArray1[0],

MyArray2[0][0],

MyArray3[0][0][0],

затем элементы

MyArray1[1],

MyArray2[0][1],

MyArray3[0][0][1]

и т.д.

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

int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};

Начальные значения получают следующие элементы трехмерного массива:

MyArray[0][0][0] == 0

MyArray[0][0][1] == 1

MyArray[0][0][2] == 2

MyArray[0][1][0] == 3

MyArray[0][1][1] == 4

MyArray[0][1][2] == 5

MyArray[0][2][0] == 6

MyArray[0][2][1] == 7

MyArray[0][2][2] == 8

MyArray[1][0][0] == 9

MyArray[1][0][1] == 10

MyArray[1][0][2] == 11

Остальные элементы массива получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементам присваиваются неопределенные значения).

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

int MyArray[3][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100},{3000,3100,3200}}

};

В результате выполнения этого оператора определения будут означены следующие элементы массива MyArray:

MyArray[0][0][0] == 0

MyArray[0][0][1] == 1

MyArray[1][0][0] == 100

MyArray[1][1][0] == 200

MyArray[1][1][1] == 210

MyArray[1][2][0] == 300

MyArray[2][0][0] == 1000

MyArray[2][1][0] == 2000

MyArray[2][1][1] == 2100

MyArray[2][2][0] == 3000

MyArray[2][2][1] == 3100

MyArray[2][2][2] == 3200

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

int MyArray[ ][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100}}

};

Транслятор понимает, что речь идет об определении массива размерности 3*3*3.

А в таком случае

int MyArray[ ][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100}},

{{10000}}

};

предполагается размерность 4*3*3. В результате MyArray оказывается массивом из четырех частично проинициализированных двумерных массивов. Следует помнить, что в C++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом.

ПРИМЕР

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

#include <stdio.h>

int main(){

const int nstr = 4, nstb = 5;//Размерности массива

int b[nstr][nstb];

int i, j;

for (i = 0; i<nstr; i++)//Ввод массива

for (j = 0; j<nstb; j++) scanf("%d", &b[i][j]);

int istr = -1, MaxKol = 0;

for (i=0; i<nstr; i++){//Просмотр массива по строкам

int Kol = 0ж

for (j = 0; j<nstb; j++)if (b[i][j]==0)Kol++;

if (Kol>MaxKol){istr = i; MaxKol = Kol;}

}

printf(" Исходный массив:\n"); for (i = 0; i<nstr; i++){

for (j = 0; j<nstb; j++)printf("%d ", b[i][j]);

printf("\n");}

if (-1 == istr)printf("Нулевых элементов нет");

else printf("Номер строки: %d", istr);

return 0;}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]