русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Массивы


Дата добавления: 2015-09-15; просмотров: 1224; Нарушение авторских прав


Вопрос 24

Массивы. Динамические массивы.

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

float a [10]; // описание массива из 10 вещественных чисел

 

ВНИМАНИЕ

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

 

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

int b[5] = {3, 2, 1}; // b[0]=3, b[l]=2, b[2]=l, b[3]=0, b[4]=0

Размерность массива вместе с типом его элементов определяет объем памяти, не­обходимый для размещения массива, которое выполняется на этапе компиляции, поэтому размерность может быть задана только целой положительной констан­той или константным выражением. Если при описании массива не указана раз­мерность, должен присутствовать инициализатор, в этом случае компилятор вы­делит память по количеству инициализирующих значений. В дальнейшем мы увидим, что размерность может быть опущена также в списке формальных пара­метров (см. раздел «Параметры функции», с. 77).



Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках. В следующем примере подсчитывается сумма элементов массива.

#include <iostream.h>

int main(){

const int n = 10;

int i, sum;

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

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

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

return 0;

}

 

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

 

ВНИМАНИЕ

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

 

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

#include <iostream.h>

int main(){

const int n = 20; // количество элементов массива

int b[n]; // описание массива

int i;

for (i = 0; i<n; i++) cin >> b[i]; // ввод массива

for (i = 0; i<n-l; i++){ // n-1 раз ищем наименьший элемент

// принимаем за наименьший первый из рассматриваемых элементов:

int imin = i;

// поиск номера минимального элемента из неупорядоченных:

for (int j = i + 1; j<n; j++)

// если нашли меньший элемент, запоминаем его номер:

if (b[j] < b[imin]) imin = j;

int a = b[i]; // обмен элементов

b[i] = b[imin]; // с номерами

b[imin] = a; // i и imin

}

// вывод упорядоченного массива:

for (i = 0; i<n; i++) cout << b[i] << ' ';

return 0;

}

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

Идентификатор массива является константным указателем на его нулевой эле­мент. Например, для массива из предыдущего листинга имя b – это то же самое, что &b[0], а к i-му элементу массива можно обратиться, используя выражение *(b+i). Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель. Следующий фрагмент программы копирует все эле­менты массива а в массив b:

int а[100], b[100];

int *pa = a; // или int *p = &a[0];

int *pb = b;

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

*pb++ = *pa++; // или pb[i] = pa[i];

Динамические массивысоздают с помощью операции new, при этом необходимо указать тип и размерность, например:

int n = 100;

float *р = new float [n];

В этой строке создается переменная-указатель на float, в динамической памяти отводится непрерывная область, достаточная для размещения 100 элементов ве­щественного типа, и адрес ее начала записывается в указатель р. Динамические массивы нельзя при создании инициализировать, и они не обнуляются.

Преимущество динамических массивов состоит в том, что размерность может быть переменной, то есть объем памяти, выделяемой под массив, определяется на этапе выполнения программы. Доступ к элементам динамического массива осу­ществляется точно так же, как к статическим, например, к элементу номер 5 при­веденного выше массива можно обратиться как р[5] или *(р+5).

Альтернативный способ создания динамического массива — использование функции mallос библиотеки С:

int n = 100;

float *q = (float *) malloc (n * sizeof(float));

Операция преобразования типа, записанная перед обращением к функции malloc, требуется потому, что функция возвращает значение указателя типа void*, а ини­циализируется указатель на float.

Память, зарезервированная под динамический массив с помощью new[], должна освобождаться оператором delete[], а память, выделенная функцией mallос — посредством функции free, например:

delete []p; free (q);

 

При несоответствии способов выделения и освобождения памяти результат не определен. Размерность массива в операции delete не указывается, но квадрат­ные скобки обязательны.

 

Многомерные массивызадаются указанием каждого измерения в квадратных скобках, например, оператор

int matr [6][8];

задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного мас­сива указываются все его индексы, например, matr[i][j], или более экзотиче­ским способом: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i]является адресом начала i-й строки массива.

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

int mass2 [][2] = {{1,1},{0,2},{1,0}};

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

 



<== предыдущая лекция | следующая лекция ==>
Порядок формирования цен на ЛС, ИМН, ИМТ и другие товары аптечного ассортимента. | ВОПРОС 1. Назначение и структурная схема электронного выпрямителя


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.