Массивы относятся к структурированным типам данных. В отличие от простых, структурированные типы определяют наборы однотипных или разнотипных компонент.
В Паскале существуют следующие структурированные типы:
Массив представляет собой фиксированное количество элементов одного и того же типа. Такой способ организации позволяет обозначать все значения этого типа одним именем, а для доступа к отдельным элементам массива использовать это имя и индекс (порядковый номер) необходимого элемента.
Например, пусть для решения какой-либо задачи требуется в программе выделить 7 ячеек памяти и занести в них начальные значения, равные нулю.
Как бы вы это сделали,
используя
простые переменные: |
используя
массив: |
Var a, b, c, d, e, g, h: integer; Begin a:=0; b:=0; c:=0 d:=0; e:=0; g:=0; h:=0; … |
Var a: array [1..7] of integer; p:integer; Begin for p:=1 to 7 do a[p]:=0; … |
В памяти наш массив можно представить следующим образом:
a1, a2, a3, a4, a5, a6, a7 |
Описание массива
var <имя>: array [n1..n2] of <тип элементов>;
- одномерный массив, имеет один размер – количество элементов:
n1 – начальный индекс массива (порядковый номер 1-го элемента),
n2 – конечный индекс массива (порядковый номер последнего элемента),
<тип> - тип элементов массива.
Индексы задаются константами, обычно целого или символьного типа. Тип элементов массива может быть любой.
Пример 1:
var a: array [-2..5] of integer; {8 элементов целого типа} var b: array [0..3] of integer; {4 элемента целого типа }
Доступ к элементам массива осуществляется указанием имени массива, за которым в квадратных скобках указывается значение индекса элемента: имя[индекс]
В качестве индекса можно использовать:
Элементы массива можно использовать везде, где допустимо использование простых переменных. Обычно при работе с массивами используют операторы цикла.
Необходимо следить за тем, чтобы индекс массива не выходил за диапазон, указанный при описании (типичная ошибка).
Пример 1.
Пример 2. Ввести с клавиатуры массив из 10 элементов и вычислить сумму элементов.
var a: array [0..9] of real; s:real; i:integer; begin writeln ('Введите 10 элементов массива'); for i:=0 to 9 do readln (a[i]); s:=0; for i:=0 to 9 do s:=s+a[i]; writeln ('сумма=', s); end.
Пример 3: Ввести с клавиатуры массив положительных чисел (ввод закончить отрицательным числом). Определить максимальный элемент массива.
var m: array [1..1000] of real; p, max: real; i,n: integer; begin i:=1; repeat write('Введите ',i,' элемент'); readln(p); if p>0 then m[i]:=p; i:=i+1; until p<0; n:=i-1; max:=m[1]; for i:=1 to n do if m[i]>max then max:=m[i]; writeln('max = ', max); end.
Пример 4: Сформировать массив из 50 случайных целых чисел, распечатать его и определить номер элемента, ближайшего к среднему арифметическому.
var b: array [1..50] of integer; ras, s: real; num, i: integer; begin randomize; for i:= 1 to 50 do b[i]:=random(100); for i:= 1 to 50 do write(b[i], ' '); s:=0; for i:= 1 to 50 do s:=s+b[i]; s:=s/50; num:=1; ras:=abs(s-b[1]); for i:=2 to 50 do if abs(s-b[i]) < ras then begin ras:=abs(s-b[i]); num:=i; end; writeln('Среднее = ',s,' ближайший элемент b[',num,']=',b[num]); end.
Пример 5: Использование стандартных процедур BREAK и CONTINUE в операторах циклов. В массиве целых чисел найти первое отрицательное число и вывести его на экран.
const n=10; var a: array [1..n] of integer; i: integer; yes: boolean; begin writeln(‘Введите элементы массива’); for i:=1 to n do begin write(‘a[’,i,’]=’); readln(a[i]); end; yes:=false; for i:=1 to n do begin if a[i]>=0 then continue; { continue – возврат на заголовок цикла} writeln(‘первое отрицательно число = ’, a[i]); yes:=true; break; { break – окончание выполнения цикла и переход к следующему оператору программы, в данном примере – к условному оператору if } end; if not yes then writeln(‘Отрицательных чисел нет’); end.
Сортировкой массива называется расстановка элементов массива в возрастающем или убывающем порядке.
Существует множество методов сортировки, рассмотрим два наиболее простых и распространенных метода: метод прямого выбора и метод “пузырька”.
Метод прямого выбора (через поиск максимального и минимального элемента).
Алгоритм сортировки по возрастанию (через поиск минимального элемента):
Пример:
Программа:
var a: array [1..10] of real; i,j: integer; t: real; begin randomize; for i:= 1 to 10 do begin a[i]:=random; write(a[i]:6:3); end; writeln; for i:= 1 to 9 do for j:=i+1 to 10 do if a[i]>a[j] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end; for i:= 1 to 10 do write (a[i]:6:3); end.
Для обмена значениями двух переменных обычно используют дополнительную переменную (дополнительную ячейку памяти), в приведенной выше программе – это переменная t.
Метод “пузырька” (перестановок).
Алгоритм сортировки по возрастанию
Пример:
Программа:
var a: array [1..10] of real; i: integer; t: real; b: boolean; begin randomize; for i:= 1 to 10 do begin a[i]:=random; write(a[i]:6:3); end; writeln; repeat b:=false; for i:= 1 to 9 do if a[i]>a[i+1] then begin t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t; b:=true; end; until b=false; {Если b=false – это значит, что не было ни одной перестановки. Следовательно, массив отсортирован, переходим к выводу отсортированного массива на экран } for i:= 1 to 10 do write(a[i]:6:3); end.
В качестве элементов массива могут быть значения любого типа, в том числе и массивы, например:
vara: array [N1..N2] of array [N3..N4] of real;
Обычно используют более короткую форму записи:
vara: array [N1..N2, N3..N4] of real;- двумерный массив (матрица), имеет два размера:
N1..N2 – диапазон изменения первого индекса (номер строки)
N3..N4 – диапазон изменения второго индекса (номер столбца)
Пример 1:
var a: array [1..3, 1..4] of integer;
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
Пример 2:
var b: array [1..5, 1..5, 1..5] of real;- трехмерный массив
Мы будем использовать только одномерные и двумерные массивы.
Обращение к элементам:a[1,3]:=0;
a[3,2]:=5;
В памяти:
1 |
2 |
3 |
4 |
|
1 |
0 |
|||
2 |
||||
3 |
5 |
Замечание: Размер любого массива не должен превышать 64 кбайта.
Как вычислить размер массива рассмотрим на примере 1. Массив a имеет размер 3x4, т.е. состоит из 12-ти элементов. Элементы массива a целого типа, т.е. каждый элемент занимает 2 байта памяти. Следовательно, весь массив занимает 24 байта памяти.
При обработке матрицы внешний цикл может быть по номеру строки, а внутренний цикл – по номеру столбца матрицы:
for str:= 1 to 3 do for stb:= 1 to 4 do write (a[i,j]);
либо наоборот: внешний цикл - по номеру столбца, а внутренний цикл – по номеру строки матрицы:
for stb:= 1 to 4 do for str:= 1 to 3 do write (a[i,j]);
В результате выполнения 1-го фрагмента программы увидим на экране содержимое элементов массива в следующем порядке: a11 a12 a13 a14 a21 a22 a23 a24 a31 a32 a33 a34
В результате выполнения 2-го фрагмента программы - в другом порядке: a11 a21 a31 a12 a22 a32 a13 a23 a33 a14 a24 a34
Пример 3: Заполнить матрицу размерностью 5х10 целыми случайными числами в диапазоне от 0 до 99 и найти минимальный элемент матрицы и сумму элементов.
var m: array [1..5,1..10] of integer; i,j,s, min: integer; begin randomize; for i:=1 to 5 do begin for j:=1 to 10 do begin m[i,j]:=random(100); write(m[i,j]:4); end; writeln; end; s:=0; min:=m[1,1]; for i:=1 to 5 do for j:=1 to 10 do begin s:=s+m[i,j]; if m[i,j] < min then min:=m[i,j]; end; writeln(‘S = ’,s,’ min = ’,min); end.
Пример 4: Сформировать матрицу размерностью 5х5, где aij=i*j , и вывести ее на экран;
определить сумму элементов каждого столбца матрицы и вывести полученные значения на экран.
var a: array [1..5,1..3] of integer; sum,i,j: integer; begin for i:=1 to 5 do begin for j:=1 to 3 do begin a[i,j]:=i*j; write(a[i,j]:4); end; writeln; end; for j:=1 to 3 do begin sum:=0; for i:=1 to 5 do sum:=sum+ a[i,j]; writeln(‘сумма ’,,j,’-го столбца = ’,sum); end; end.
4.1 Какой оператор является ошибочным?
var a: array [0..5] of integer; p: integer; Begin a[1]:=8; p:=5; a[p+1]:=7;
4.2 Определите значение sum после выполнения программы:
var a: array [1..2,1..3] of integer; p, sum: integer; Begin a[1,1]:= 8; a[1,2]:= - 6; a[1,3]:= 2; a[2,1]:= 4; a[2,2]:= 9; a[2,3]:= - 5; for p:=1 to 2 do sum:= sum + a[p,p]; end.