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

Лабораторная работа 9 Массивы и структуры

Цель работы: изучение массивов и структур.

9.1.Теоретические сведения

9.1.1.Пример массива

Рассмотрим задачу: даны 100 целых чисел, нужно найти их среднее значение.

Для хранения 100 целых чисел нужно создать 100 переменных целого типа. А затем для нахождения среднего значения написать в коде 100 операторов сложения. Эти 100 одинаковых операций можно было бы сделать в цикле, но эти операции нужно выполнять над разными переменными. Для того чтобы записать такую операцию один раз и повторить ее 100 раз в цикле, нужно иметь возможность обращаться к переменной не по имени, а по ее номеру.

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

Решение задачи приведено на рис. 11.

Рис. 11. Пример программы

В 6-й строке осуществляется объявление массива. Идентификатор int указывает на то, что элементы массива будут целого типа, «a» – имя массива, в квадратных скобках указывается количество его элементов. После этого объявления в памяти выделяется место под 100 переменных целого типа, обратиться к каждой из которых можно, указав имя массива и ее индекс.

В 7-й и 8-й строках записан цикл, заполняющий объявленный массив случайными числами. Он повторяется 100 раз, при этом переменная i принимает значения от 0 до 99. В 8-й строке, слева от оператора присваивания, происходит обращение к i‑ому элементу массива «a». В языке С++ для того чтобы обратится к некоторому элементу массива, нужно указать имя массива и его индекс в квадратных скобках.

Необходимо учитывать, что в языке С++ элементы массива нумеруются начиная с 0. В рассматриваемом цикле на первом его шаге значение присваивается элементу a[0], на втором – а[1], а на последнем –a[99]. Массив заполняется случайными числами, выдаваемыми функцией «rand()», т.к. вводить 100 чисел с клавиатуры при запуске программы было бы утомительно.

В 9-й и 10-й строках записан цикл, который подсчитывает сумму элементов массива. В 11-й строке рассчитывается и печатается среднее значение.

9.1.2.Свойства массивов

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

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

float a[10];

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

float a[] = {1, 1.5, 2, 2.5, 3};

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

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

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

Можно сказать, что оператор индексирования a[i] фактически означает сумму адреса первого элемента и числа i, умноженного на размер одного элемента.

Следует отметить два важных последствия такого свойства оператора индексирования.

1. Т.к. первый элемент массива расположен в самом его начале, то он должен иметь индекс 0. Поэтому элементы массива в С++ и нумеруются с 0.

2. Оператор индексирования не сравнивает передаваемый ему индекс с размером массива. Если в программе был создан массив из 10 элементов, а затем произошло обращение к 15-му элементу, компилятор не выдаст сообщения об ошибке. Это может привести к тому, что данные будут записаны в область памяти за пределами массива или даже за пределами программы.

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

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

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