Урок 6. Массивы
Пять оценок можно хранить в пяти переменных, но тридцать уже неудобно, а сто — невозможно. Для этого есть массив — ряд пронумерованных ячеек одного типа под одним именем.
Описание массива
var
a: array[1..10] of integer;Это десять целых чисел: a[1], a[2], …, a[10]. Число в квадратных скобках — индекс, номер элемента. Диапазон 1..10 задают при описании, и во время работы программы он не меняется. Индексом может быть переменная или выражение: a[i], a[i + 1].
Размер удобно задать константой — тогда его легко поменять в одном месте:
const
MaxN = 100;
var
a: array[1..MaxN] of integer;Помните, что Pascal не различает большие и маленькие буквы: константу N и переменную n в одной программе описать нельзя. Поэтому константа здесь названа MaxN.
Ввод, сумма и среднее
Обычно в задаче сначала вводят количество чисел, а потом сами числа. Массив описывают с запасом, а используют первые n элементов:
program ArraySum;
const
MaxN = 100;
var
a: array[1..MaxN] of integer;
n, i: integer;
s: longint;
begin
readln(n);
for i := 1 to n do
read(a[i]);
s := 0;
for i := 1 to n do
s := s + a[i];
writeln('Сумма: ', s);
writeln('Среднее: ', (s / n):0:2);
end.5
4 8 15 16 23Сумма: 66
Среднее: 13.20read(a[i]) в цикле читает числа по одному, поэтому их можно набрать в одну строку через пробел или каждое с новой строки. Среднее делится через / и выводится с форматом — оно дробное.
Вывод массива
Элементы выводят циклом. Через пробел в одну строку:
for i := 1 to n do
write(a[i], ' ');
writeln;В обратном порядке — тот же цикл с downto: for i := n downto 1 do.
Максимум и его номер
Начальное значение максимума берут из первого элемента, а не ноль: если все числа отрицательные, ноль окажется больше любого из них.
program ArrayMax;
var
a: array[1..100] of integer;
n, i, maxI: integer;
begin
readln(n);
for i := 1 to n do
read(a[i]);
maxI := 1;
for i := 2 to n do
if a[i] > a[maxI] then
maxI := i;
writeln('Максимум: ', a[maxI], ', номер: ', maxI);
end.6
3 -7 12 5 12 0Максимум: 12, номер: 3Программа запоминает номер наибольшего элемента. Знак > оставляет первый из одинаковых максимумов; с >= был бы последний, номер 5. Больше вариантов — в справке Как найти максимум и минимум в массиве.
Подсчёт и поиск
Сколько элементов подходят под условие — заводят счётчик:
program CountEven;
var
a: array[1..100] of integer;
n, i, count: integer;
begin
readln(n);
for i := 1 to n do
read(a[i]);
count := 0;
for i := 1 to n do
if a[i] mod 2 = 0 then
count := count + 1;
writeln('Чётных: ', count);
end.7
5 8 13 2 0 7 10Чётных: 4Есть ли в массиве нужное число и где оно — цикл while, который останавливается на первой находке:
program Search;
var
a: array[1..100] of integer;
n, i, x: integer;
begin
readln(n);
for i := 1 to n do
read(a[i]);
readln(x);
i := 1;
while (i <= n) and (a[i] <> x) do
i := i + 1;
if i <= n then
writeln('Число ', x, ' на месте ', i)
else
writeln('Числа ', x, ' нет');
end.5
10 20 30 40 50
40Число 40 на месте 4В условии (i <= n) and (a[i] <> x) проверка границы стоит первой. Когда i станет больше n, вторая часть уже не проверяется, и программа не заглядывает за конец заполненной части массива.
Случайные числа
Чтобы не вводить данные вручную при проверке программы, массив заполняют случайными числами:
program RandomArray;
var
a: array[1..10] of integer;
i: integer;
begin
randomize;
for i := 1 to 10 do
begin
a[i] := random(100);
write(a[i], ' ');
end;
writeln;
end.random(100) даёт целое от 0 до 99, randomize один раз в начале делает числа разными при каждом запуске. Поэтому вывод у этой программы каждый раз свой. Подробно — в справке Случайные числа: random и randomize.
Двумерный массив
Таблица из строк и столбцов — массив с двумя индексами: b[строка, столбец]. Обходят его двумя вложенными циклами:
program Matrix;
var
b: array[1..3, 1..4] of integer;
i, j: integer;
begin
for i := 1 to 3 do
for j := 1 to 4 do
b[i, j] := i * 10 + j;
for i := 1 to 3 do
begin
for j := 1 to 4 do
write(b[i, j]:4);
writeln;
end;
end. 11 12 13 14
21 22 23 24
31 32 33 34Первая цифра каждого числа — номер строки, вторая — номер столбца.
Выход за границы
Если обратиться к a[0] или a[101] у массива array[1..100], PascalABC.NET остановит программу с ошибкой «Индекс выходит за границы массива». Free Pascal по умолчанию границы не проверяет: программа прочитает чужую память и выдаст странный результат или упадёт. Чтобы Free Pascal тоже проверял индексы, компилируйте с ключом -Cr: fpc -Cr prog.pas. Подробно — в справке Ошибки при выполнении программы.
Частые ошибки
- Цикл до
MaxNвместоn. Массив описан с запасом, а заполнены только первыеnэлементов — в сумму и среднее попадут лишние нули. readln(a[i])вместоread(a[i]), когда числа набраны в одну строку.readlnберёт из строки одно число, а остальные пропускает — программа ждёт новых строк ввода.- Максимум начат с нуля — для отрицательных чисел ответ будет неверным.
- Индекс за границами описания, например
a[0]уarray[1..100](раздел «Выход за границы» выше).
Коротко
a: array[1..N] of тип— N элементов, обращениеa[i].- Заполнение — циклом с
read(a[i]), вывод — циклом сwrite(a[i], ' '). - Сумму обнуляют до цикла, максимум начинают с первого элемента.
- Поиск —
while (i <= n) and (a[i] <> x), граница проверяется первой. - Двумерный массив —
array[1..M, 1..N], обход двумя вложенными циклами.