Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
26.03.2015
Размер:
234.65 Кб
Скачать

Главная

Массивы

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

Массив (или вектор) – это группа связанных друг с другом элементов одного типа (double, float, int и т.п.) последовательно расположенных в памяти. Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

спецификатор-типа описатель [константное - выражение]; спецификатор-типа описатель [ ];

Описатель – это идентификатор массива. Спецификатор-типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

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

при объявлении массив инициализируется; массив объявлен как формальный параметр функции;

массив объявлен как ссылка на массив, явно определенный в другом файле. Пример определения массива:

int arr[5];

Элементы массива занимают один непрерывный участок памяти компьютера и располагаются последовательно друг за другом (рис. 1).

значение индекса для 2-го элемента

имя массива

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

 

 

 

 

 

 

 

 

12

23

 

1

345

63

 

 

 

 

 

 

 

 

Рис. 1. Расположение элементов массива

Доступ к отдельным элементам массива организуется с использованием номера этого элемента или индекса ([]). Нумерация элементов массива начинается с нуля и заканчивается n – 1, где n – число элементов массива.

1

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

При объявлении автоматических и статических массивов для задания их размеров лучше использовать именованные константы:

const int array_size; int arr[array_size];

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

Инициализация и работа с массивами

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

double d[] = {1, 2, 3, 4, 5}; int n[5] = {2};

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

В заключение рассмотрим задачу: cформировать одномерный статический массив целых чисел, используя датчик случайных чисел (диапазон значений от 0 до 99); подсчитать среднее арифметическое элементов в массиве; удалить элемент с заданным номером. Ниже приведен пример фрагмента листинга программы:

2

const int N = 1000

// N - максимальный размер статического массива

.............................................

int i;

// индекс массива

int array_size;

// переменная для хранения

 

//размера массива

int avg;

//переменная для хранения

 

//среднего арифметического

int arr[N];

// целочисленный статический

 

//массив длины N

int k;

// индекс удаляемого элемента

int rmin = 0, rmax = 99; //диапазон значений

//элементов массива

cout<<"Введите размер массива"<<endl; cin>> array_size<<endl;

// Сгенерировать массив srand((unsigned)time(NULL));

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

{

arr[i] = (int)(((double)rand()/(double)RAND_MAX)* (rmax-rmin)+rmin);

// или arr[i] = rand()%99; cout<<arr[i]<<endl;

}

// Подсчитать среднее арифметическое суммы элементов: avg = 0;

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

{

//т.к. в теле цикла один оператор,

//фиг. скобка - не обязательна avg += arr[i];

}

avg /= array_size;

cout<<"Средний элемент массива"<<avg<<endl;

3

cout<<"Введите номер удаляемого элемента массива"<<endl; cin >>k;

// удалить элемент с номером k, сдвиг элементов массива for(i = k; i < array_size - 1; i++)

{

arr[i] = arr[i+1];

}

array_size--; // уменьшить размер массива

for(i=0;i< array_size; i++) cout<<arr[i]<<endl;

............................................

Рассмотрим еще один пример: пусть необходимо ввести целочисленный массив размера n. Затем удалить из массива все элементы, встречающиеся два и более раз:

//объявление переменных int a[20];

int n;

//инициализация переменных

cout<<"Введите размер массива "<<endl; cin>>n;

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

scanf( "%d",&a[i]); //ввести массив

//обработка for(int k = 0; k < n; k++)

{

for(i = k + 1; i < n; i++)

{

if(a[k] == a[i])

{

for(int l = i; l <n; l++) a[l]=a[l+1];

//удалить повторяющиеся элементы n--;

//скорректировать размер массива

}

}

}

//выводим результат

for(i = 0; i < n; i++) printf( "%d ", a[i]); printf("\n"); // вывести массив

Генерация случайных чисел

4

В приведенном примере массив заполняется случайными числами. Элемент случайности может быть введен в приложения с помощью функции rand из стандартной библиотеки:

i = rand () ;

Функция rand генерирует целое число в диапазоне от 0 до RAND_MAX (символическая константа, определенная в заголовочном файле <stdlib>). Значение RAND_MAX должно быть, по меньшей мере, равно 32767 – максимальное положительное значение двухбайтового целого числа. Для того, чтобы выработать целые числа в заданном диапазоне, используется операция вычисления остатка (%) в сочетании с

rand:

i = rand () % 6 ; // генерирует случайное число от 0 до

Это называется масштабированием, а число 6 называется масштабирующим коэффициентом.

Функция rand, на самом деле, генерирует псевдослучайные числа. Повторный вызов rand производит число, которое кажется случайным. Но то же самое число повторяется при каждом повторении программы. Для рандомизации необходимо использование стандартной библиотечной функции srand. Функция srand получает целый аргумент unsigned и при каждом выполнении программы задает начальное число, которое функция rand использует для генерации последовательности квазислучайных чисел.

Для того, чтобы не вводить каждый раз начальное число, можно использовать оператор:

srand((unsigned)time(NULL));

Для автоматического получения начального числа считываются показания часов. Функция time (с аргументом NULL, как записано в указанном выше операторе) возвращает текущее «календарное время» в секундах. Это значение преобразуется в беззнаковое целое число и используется как начальное значение в генераторе случайных чисел. Прототип функции для time находится в <ctime>.

Функция srand должна вызываться только один раз в программе для достижения желаемого результата рандомизации. Вызов ее более одного раза является избыточным и снижает эффективность программы.

5

Соседние файлы в папке Теория