Опубликован: 02.02.2011 | Уровень: для всех | Доступ: платный
Лекция 11:

Массивы: одномерные массивы

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Аннотация: В лекции рассматриваются понятие и виды массивов в языках программирования, определение, объявление, инициализация, способы генерации и вывод одномерных массивов, расположение в памяти элементов массивов, связь между указателями и массивами.
Ключевые слова: вывод, структурированные типы данных, таблица, вектор, матрица, скалярный тип, индекс, многомерный массив, массив, размерность, адрес, компилятор, прямой, доступ, синтаксис, спецификатор, идентификатор, размерность массива, выражение, формальный параметр, целый тип, символьный массив, исполнение, переполнение, время выполнения, оператор присваивания, инициализация, файл, блок данных, компонент, создание таблицы, значение, байт, адресация, переменная, переопределение, одномерный массив, определение, связь, array, указатель, присваивание, ptr, операторы, эквивалентная операция, компьютер, операции, логические выражения, процессы обработки, генератор, вычисленное значение, арифметическая операция, функция, генерация случайных чисел, seed, RAND, псевдослучайное число, тип массива, операция sizeof, входные данные, диапазон

Цель лекции: изучить понятия, особенности внутреннего представления, способов генерации и вывода одномерных массивов, научиться выполнять объявление, инициализацию, генерацию и вывод массивов при решении задач на языке C++.

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

Массив – именованная последовательность областей памяти, хранящих однотипные элементы ( рис. 10.1). Каждая такая область памяти называется элементом массива. Массивы обладают размерностью (большей или равной единице), которой задается число элементов, содержащихся в них, а также измерением, что предполагает возможность описания в программе одно- и многомерных массивов. Количество элементов в массиве называется его размером.

Схематическое представление массивов

Рис. 10.1. Схематическое представление массивов

Простейшим аналогом двумерного массива может быть таблица, а трехмерного – несколько таблиц одинакового размера. Математические объекты типа вектор и матрица – примеры аналогов (соответственно одно- и двумерных) массивов.

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

Элементы массива в С++ нумеруется, начиная с нуля. У одномерных массивов после его имени указывается один индекс (порядковый номер), заключенный в прямоугольные скобки [ ], а у многомерных – несколько, каждый из которых заключается в [ ]. Последнее означает, что многомерный массив создается путем определения массива из элементов типа массив.

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

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

Объявление одномерных массивов

Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата:

Тип ИмяМассива[ВыражениеТипаКонстанты];

или

Тип ИмяМассива[];

ИмяМассиваидентификатор массива.

Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void.

ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если:

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

Например:

  1. int a[100]; //массив из 100 элементов целого типа
  2. double d[14]; // массив из 14 элементов типа double
  3. char s[]="Программирование"; //символьный массив
  4. const int t=5, k=8;
    float wer[2*t+k]; 
    //массив из 2*t+k элементов вещественного типа
  5. int sample[853]; 
    /*массив из элементов sample[0], sample[1], 
      sample[2],...,sample[852] типа int*/
    равносильно объявлению
    const int N_max=853;
    int sample[N_max];
    равносильно объявлению
    #define N_max 853
    ...
    int sample[N_max];

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

Инициализация одномерных массивов

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

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

Например:

float t[5]={1.0, 4.3, 8.1, 3.0, 6.74};
char b[7]={'П','р','и','в','е','т'};
/*в данных примерах длину массива компилятор вычисляет по 
количеству начальных значений, перечисленных в фигурных 
скобках*/
int d[10]={1, 2, 3};
char a[10]="Привет";
/*в данных примерах определяется значение только заданных 
переменных d[0],d[1],d[2] и a[0],a[1],...,d[9], остальные 
элементы не инициализируются*/

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

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

char e1[12] = "read error\n";
char e2[13] = "write error\n";
char e3[18] = "cannot open file\n";

Компилятор С++ сам сформирует нужное значение по количеству инициализирующих данных. В нашем случае под массив e2 будет отведено 13 байтов, включая последний байт с нулевым кодом, завершающий каждую строку. Оператор

printf("%s имеет длину, равную %d\n",e2,sizeof (e2));

выведет на экран

write error
имеет длину, равную 13

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

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Ольга Замятина
Ольга Замятина
Россия, Калиниград, РГУ им. И. Канта, 2009
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ