В предыдущих уроках мы с вами рассматривали задачи, в которых использовалось небольшое количество данных. Для каждого мы создавали отдельную ячейку памяти с уникальным именем. Однако зачастую приходится работать с большим количеством однотипных данных. Им такие требуются отдельные ячейки памяти — это понятно и естественно (два литра воды не поместятся в один стакан).
А вот указывать для каждой ячейки отдельное имя — неудобно. Как быть?
Один из методов решения такой: выделим для этих данных область последовательных ячеек памяти и назовем всю область общим именем. А для того, чтобы к каждой ячейке можно было обратиться, пронумеруем ячейки по порядку. Таким образом, для обращения к определенной ячейке нужно указать название всей конструкции и номер ячейки в ней.
Хранение однотипных данных в виде таблицы
Массив — это совокупность однотипных данных, хранящихся в последовательных ячейках памяти и имеющих общее имя. Ячейки называются элементами массива. Все элементы пронумерованы по порядку, и этот номер называется индексом элемента массива.
Все элементы массива имеют один и тот же тип. Сам массив при этом имеет имя — одно для всех элементов. Для обращения к конкретному элементу массива необходимо указать имя массива и (в квадратных скобках) индекс элемента.
Простейший вид массива — одномерный массив (рис. 8.1).
Рис. 8.1. Условное изображение одномерного массива в виде строки
А — имя массива, числа в клетках таблицы — элементы массива. Рассмотрим запись А[3] = -8.
В этой записи: А — имя массива, 3 — номер элемента массива (индекс), А[3] — обозначение 3-го элемента массива, -8 — значение 3-го элемента массива.
Основные действия по работе с массивами
Нам предстоит научиться выполнять ряд наиболее распространенных действий с массивами:
описание; заполнение массива случайными числами; заполнение массива с клавиатуры; вывод на экран; поиск максимального элемента; вычисление суммы всех элементов массива; вычисление количества положительных элементов.
Здесь <тип компонентов> — это тип данных, который имеет каждый элемент массива, а <тип индекса> — границы изменения индекса.
Например: var A: array [1..10] of integer;
Здесь тип индекса — интервальный, изменяется в интервале от 1 до 10, тип данных (элементов массива) — целый.
Заполнение массива случайными числами и вывод массива на экран
Рассмотрим задачу, в которой требуется с помощью датчика случайных чисел создать одномерный массив и вывести его на экран. Блок-схема алгоритма показана на рис. 8.2.
Рис. 8.2. Блок-схема алгоритма заполнения одномерного массива случайными числами и вывода массива на экран
Пример 8.1. Основные действия по работе с массивами
Program Massivl; uses Crt; const { Раздел описания констант, то есть постоянных величин, определяемых в программе заранее и не изменяющихся по ходу выполнения программы } N=10; { Имена констант не используются для имен переменных величин (из раздела var) } var A: array [1..N] of integer; { 1..N - тип индекса. Для индекса выбран интервальный тип, то есть интервал целых чисел от 1 до N, где N определено в разделе const } i: ihteger; { Переменная, хранящая индекс элемента массива, к которому идет обращение } begin {II. Задание значений элементов массива как случайных чисел } Randomize; { Инициализация датчика случайных чисел } { Задание элементов массива: } for i:=1 to N do { Переменная i изменяется в цикле от 1 до N, то есть мы по очереди перебираем все элементы массива } A[i]:=Random(100); { В очередной элемент массива A[i] записываем случайное число от 0 до 99, обратите внимание: i - номер элемента массива (принято говорить "индекс"), A[i] - значение элемента массива } { III. Вывод элементов массива на экран в одну строку } ClrScr; writeln('Введенный массив:'); for i:=l to N do write(A[i]:4); { На каждый элемент массива выделяется по 4 позиции строки, чтобы они не склеивались при выводе!} writeln { Этот "пустой" оператор вывода отработает только один раз и переведет курсор на новую строку для дальнейшей работы } readln end.
В данном примере мы заполнили массив случайными числами от 0 до 99. Это обеспечила нам функция random(100). А если нам нужно получить случайные числа в другом диапазоне — например, не от нуля? Расчет нужно сделать такой: функция random(N) выдаст N различных чисел от 0 до N - 1. Если нам нужно, чтобы наименьшим числом диапазона было К, значит, необходимо прибавить это К к random(N). Наибольшее число, которое будет выдавать в этом случае формула random(N) + К, будет наибольшим числом диапазона.
Пусть, например, нам требуются случайные числа в диапазоне -100...+100. Считаем, сколько различных чисел в этом диапазоне: 100 положительных, 100 отрицательных и ноль. Итого 201. Формула тут проста: вычесть из большего меньшее и прибавить 1. Значит, N = 201, а К = -100. То есть получаем формулу random(201) -100.
ЗАМЕЧАНИЕ
К сожалению, в таком виде формула работать не будет — при запуске программа «вылетит» с сообщением об ошибке. Это от «излишнего ума», который проявляет здесь среда Паскаль. Дело в том, что Паскаль считает тип этого выражения по функции random. А она имеет тип word . Иными словами, беззнаковый. При попытке вычесть 100 из числа, меньшего 100, получаем отрицательный результат, что Паскаль не устраивает. Самый простой способ обойти эту напасть — паменять местами уменьшаемое (random) и вычитаемое, то есть написать: -100 + random(201). Тогда Паскаль будет считать тип этого выражения как integer по первому числу (-100), и оишбки не возникнет.
Задание 8.1. Оформите эту программу так, чтобы задание массива и вывод его элементов на экран выполнялись в одном цикле. Вам понадобится составной оператор для тела цикла begin ... end.
Задание 8.2. Добавьте в программу задания 8.1 новый цикл вывода элементов массива в обратном порядке (начиная с последнего). Попробуйте выполнить то же задание без введения нового цикла.
ЗАПОМНИТЕ!
Массив — это множество ячеек памяти. Поэтому любое действие с массивом заключаемся в том, чтобы перебрать все эти ячейки или, по крайней мере, какую-то их часть. Это значит, что любое действие с массивами должно содержать в себе цикл, в котором перебираются элементы массива. Если вы пишете программу с массивом и не написали цикла (for, while или repeat) — значит, вы ошиблись.