Полная форма объявления одномерного массива
Описание типа задаётся следующим образом:
TYPE
<имя_типа> = ARRAY [ < нач_индекс..кон_индекс > ] OF <тип_данных>;
VAR
<Имя_массива> : < имя_типа >;
Здесь <имя_типа> - правильный идентификатор;
ARRAY, OF – зарезервированные слова (массив, из);
[ < нач_индекс..кон_индекс > ] – список из одного или нескольких индексных типов, разделённых запятыми;
<тип_данных> - базовый тип.
Обычно в качестве индексного типа используется тип-диапазон, в котором задаются границы изменения индексов. В общем случае диапазон допустимых значений индекса задаётся любым конечным скалярным типом.
Например,
Type mass = array [1..5] of integer;
Var R : Mass;
Данный способ описания массива применяется при работе с подпрограммами: для передачи процедуре или функции параметров одного типа.
Доступ к элементам массива
Выполнить операцию над массивом означает выполнить действия над элементами этого массива. Элементы массива называются также переменными с индексами. Получить доступ к каждому элементу-ячейке массива можно путём указания индекса в квадратных скобках.
Например, k := R[1] + R[5]; R[3] := 34;
Здесь, в первом случае переменной k присваивается сумма значений элементов массива R с порядковыми номерами 1 и 5. Во втором примере элементу массива R с порядковым номером 3 присваивается значение 34.
В качестве индекса может использоваться выражение, результатом которого является целое число.
Например, R[2*I] – элементы массива с чётным индексом; R[2*I-1] – элементы массива с нечётным индексом.
Все операции по формированию элементов массива, обработке массива, выводу на печать выполняются в цикле с параметром.
В частности, для ввода и вывода числовых значений массива используются циклы:
FOR I := 1 TO 10 DO READ (A[I]);
FOR I := 1 TO 10 DO WRITE (A[I]);
В операторах присваивания можно использовать не только элементы массивов, но и массивы в целом. Оператор вида A := B выглядит лаконичнее и выполняется быстрее цикла for i :=1 to n do A[i] := B[i]. Используя в операторах присваивания массивы, следует помнить, что такая конструкция приводит к копированию всего массива! Массивы в целом можно использовать в логических отношениях равенства (=) и неравенства (<>). Другие операции отношения применяются только к отдельным элементам массива.
Элементы массива могут вводиться с клавиатуры или формироваться случайным образом.
В последнем случае используется функция – генератор случайных чисел Random. Эта функция согласно определённому алгоритму при каждом обращении к ней возвращает случайное число – либо вещественное, из интервала [0..1], если аргумент отсутствует, либо целое, если задан целочисленный аргумент. Чтобы эта функция работала корректно, рекомендуется вначале её инициализировать, вызвав процедуру Randomize без параметров.
Например,
randomize;
for i := 1 to 10 do R[i] := random; (из интервала [0..1])
или
randomize;
for i := 1 to 10 do R[i] := random(11); (из интервала [0..10])
Условия чётности и нечётности элемента массива:
If R[i] mod 2 = 0 then …
If odd (R[i]) then …или
If odd (R[i]) = false then …
If R[i] mod 2 <>0 then …
If not odd (R[i]) then …или
If odd (R[i]) = true then …
Задача 7.1.В массиве, состоящем из пяти элементов подсчитать количество положительных и отрицательных элементов. Положительные элементы записать в один одномерный массив, а отрицательные – в другой.
Блок-схема алгоритма
Листинг программы
PROGRAM TASK1;
USES CRT;
CONST N = 50;
VAR
A, B, C : ARRAY [1..N] OF INTEGER;
I, K, L : INTEGER;
BEGIN
CLRSCR;
WRITE (‘Введите размерность массива <=50’);
READLN (N);
FOR I := 1 TO N DO READLN (A[I]);
K := 0;
L := 0;
FOR I :=1 TO N DO
BEGIN
IF A[I] < 0 THEN
BEGIN
K := K + 1;
B[K] := A[I];
END
ELSE
BEGIN
L:= L + 1;
C[L] := A[I];
END;
END;
WRITELN (‘Отрицательные элементы массива ’);
FOR I := 1 TO K DO WRIETLN (B[I]);
WRITELN (‘Положительные элементы массива’);
FOR I := 1 TO L DO WRIETLN (C[I]);
WRITELN (‘Кол-во отрицательных элементов ’);
WRITELN (K);
WRITELN (‘Кол-во положительных элементов ’);
WRITELN (L);
READLN;
END.
Задача 7.2.Найти максимальный элемент и значение индекса этого максимального элемента целочисленного одномерного массива, сформированного случайным образом.
Примечание.Данная задача решается перебором всех элементов массива и сравнением их с «пробным» значением, избранным на роль максимального элемента. Если сравниваемый элемент при этом окажется больше по величине, он становиться «пробным» и все последующие значения сравниваются именно с ним.
Алгоритм решения программы №1:
1. Сформировать случайный целочисленный массив R;
2. Присвоить вспомогательной переменной max значение первого элемента массива;
3. Для каждого элемента массива, начиная со второго и заканчивая последним, проверить выполнение условия max > R[i]. Если оно выполнено, то продолжать перебор, иначе присвоить max := R[i]и index = i и продолжать перебор.
Блок-схема алгоритма
Листинг программы
PROGRAM TASK2;
USES CRT;
CONST N = 100;
VAR R : ARRAY [1..N] OF INTEGER;
I, MAX, INDEX : INTEGER;
BEGIN
CLRSCR;
RANDOMIZE;
FOR I:=1 TO N DO R[I]:=random(11);
MAX := R[1];
INDEX := 1;
FOR I l= 2 TO N DO IF MAX < R[I] THEN
BEGIN
MAX := R[I];
INDEX := I;
END;
WRITELN (‘Значение ’, INDEX, ‘-го максимального элемента равно ’, R[INDEX]);
WRITELN (‘Для завершения работы нажмите <Enter>’);
READLN;
END.
Алгоритм решения программы №2:
1. Сформировать случайный целочисленный массив R;
2. Присвоить вспомогательной переменной index порядковый номер первого элемента массива, то есть 1;
3. Для каждого элемента массива, начиная со второго и заканчивая последним, проверить выполнение условия R[index] > R[i]. Если оно выполнено, то продолжать перебор, иначе присвоить index:=i и продолжать перебор.
Листинг программы
PROGRAM TASK2;
USES CRT;
CONST N = 100;
VAR R : ARRAY [1..N] OF INTEGER;
I, INDEX : INTEGER;
BEGIN
CLRSCR;
RANDOMIZE;
FOR I := 1 TO N DO R[I] := random (11)-5;
INDEX := 1;
FOR I= 2 TO N DO
IF R[INDEX] < R[I]
THEN INDEX := I;
WRITELN (‘Значение ’, INDEX, ‘-го максимального элемента равно ’, R[INDEX]);
WRITELN (‘Для завершения работы нажмите <Enter>’);
READLN;
END.
Блок-схема алгоритма
Задача 7.3.Сформировать элементы массива случайным образом и вывести на экран в обратном порядке.
Листинг программы
USES CRT;
VAR A : ARRAY [1..100] OF INTEGER; I : INTEGER;
BEGIN
CLRSCR;
RANDOMIZE;
WRITELN (‘Сформированный массив: ’);
FOR I := 1 TO 100 DO
BEGIN
A[I] := RANDOM (11) - 6; {[-6..4]}
WRITE (‘A[’, I, ‘]= ’, A[I]:3, ‘’:2);
END;
READLN; {Enter}
WRITELN (‘Изменённый массив: ’);
FOR I := 100 DOWNTO 1 DO WRITE (‘A[’, I, ‘]= ’, A[I]:3, ‘’:2);
READLN;
END.
Задача 7.4.Сформировать массив случайным образом, состоящим из 1000 элементов, числа находятся в диапазоне от 150 до 250. Сосчитать количество чисел больших 200.
Листинг программы
USES CRT;
VAR A : ARRAY [1..1000] OF INTEGER;
I, K: INTEGER;
BEGIN
CLRSCR;
RANDOMIZE;
WRITELN (‘Сформированный массив:’);
FOR I := 1 TO 1000 DO
BEGIN
A[I] := RANDOM (101) +150; {[150..250]}
WRITE (‘A[’, I, ‘]= ’, A[I]:3, ‘’:2);
END;
READLN; {Enter}
K := 0;
FOR I := 1 TO 1000 DO IF A[I] > 200 THEN K := K +1;
WRITELN (‘Количество элементов >200 = ’, K:2);
READLN;
END.
Вопросы для самопроверки
1. Дайте определение массива?
2. Как осуществляется объявление массива в разделе Var (1 способ)?
3. Каким образом можно объявить массив в разделе Var, если создан новый тип массива в разделе Type (2 способ)?
4. Что необходимо знать, чтобы обратиться к определённому элементу массива?
5. Объясните назначение 2-го способа объявления массива?
6. Как организовать ввод и вывод элементов массива?
7. Как можно реализовать формирование элементов массива случайным способом?
Лабораторная работа №7_1