Файл: Особенности и примеры использования массивов при разработке программ.pdf
Добавлен: 28.03.2023
Просмотров: 87
Скачиваний: 2
СОДЕРЖАНИЕ
1. Определение и типы массивов
2. Основные операции обработки массивов
2.1 Определение размерности массива, заполнение массива
2.3 Поиск требуемого элемента в массиве
2.5 Сортировка элементов массива
3. Особенности обработки двумерных массивов
4. Обработка квадратных матриц
4.1 Определение диагоналей массива
2.5 Сортировка элементов массива
Существует много алгоритмов сортировки массива, но наиболее простым и понятным является сортировка методом «пузырька», при которой самый «легкий» элемент «всплывает», а самый тяжелый «тонет».
Например,
9 |
-7 |
0 |
-8 |
Элементы |
1 |
2 |
3 |
7 |
Индексы |
Дан массив
Необходимо расположить эти элементы в порядке возрастания, т.е. в результате работы программы необходимо получить массив
-8 |
-7 |
0 |
9 |
Элементы |
1 |
2 |
3 |
7 |
Индексы |
При сортировке методом «пузырька» сравниваются два соседних элемента (mas[i] и mas[i+1]). Если mas[i] > mas[i+1], то происходит перестановка элементов. Визуально процесс сортировки можно представить в виде:
Самый тяжелый элемент «упал»
Рисунок 2. Сортировка методом «пузырька»
Таким образом, для организации сортировки потребуется два цикла, которые выстраиваются в следующем порядке:
(n-размерность массива)
For j:=1 to n do {количество просмотров массива}
For i:=1 to n-1 do {перебор элементов массива}
If mas[i] > mas[i+1] then begin
t:=mas[i];
mas[i]:=mas[i+1];
mas[i+1]:=t;
end;
Как видно из примера для перестановки элементов массива требуется дополнительная переменная, которая служит временным хранилищем значения ячейки массива.
3. Особенности обработки двумерных массивов
Двумерный массив – структура данных, хранящая в себе прямоугольную матрицу. В матрице каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен.
Для описания двумерных массивов используются те же способы, что и для одномерных массивов, но в качестве размерности массива задается двойное значение (Например, [1..10,1..10]).
Таким образом, для создания двумерного целочисленного массива размерностью 5×7 (5 строк, 7 столбцов) необходимо записать:
Способ 1
Type mas=array[1..5,1..7] of integer;
Способ 2
Var mas:array[1..5,1..7] of integer;
Для последовательного перебора всех элементов двумерного массива необходимо использовать т.н. вложенный цикл:
For i:=1 to 5 do {перебор строк матрицы}
For j:=1 to 7 do {перебор столбцов (ячеек) в строке}
Т.е. значение индекса строки (i) увеличится только в том случае, если индекс столбца (j) дойдет до своего конечного значения (в примере j = 7).
При такой организации перебора элементов массива процесс перебора будет проходить по следующей схеме:
11 |
12 |
13 |
14 |
15 |
16 |
17 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
Рисунок 3. Процесс перебора элементов двумерного массива
Ход выполнения:
i = |
j= |
Условие перехода на следующую строку j=7 |
Обрабатываемый элемент |
|
Шаг 1 |
1 |
1 |
нет |
Mas[1,1] |
Шаг 2 |
1 |
2 |
нет |
Mas[1,2] |
Шаг 3 |
1 |
3 |
нет |
Mas[1,3] |
Шаг 4 |
1 |
4 |
нет |
Mas[1,4] |
Шаг 5 |
1 |
5 |
нет |
Mas[1,5] |
Шаг 6 |
1 |
6 |
нет |
Mas[1,6] |
Шаг 7 |
1 |
7 |
да |
Mas[1,7] |
Шаг 8 |
2 |
1 |
нет |
Mas[2,1] |
Шаг 9 |
2 |
2 |
нет |
Mas[2,2] |
Шаг 10 |
2 |
3 |
нет |
Mas[2,3] |
… |
… |
… |
… |
… |
Для того чтобы вывести двумерный массив на экран в виде таблицы необходимо после вывода содержимого каждой строки предусмотреть переход на строку ниже:
For i:=1 to n do
Begin
For j:=1 to n do
Write(mas[i,j],’ ‘);
Writeln;
End;
4. Обработка квадратных матриц
Если количество строк массива равно количеству столбцов, то такой массив называется квадратной матрицей. При работе с квадратной матрицей, в отличие от обычного двумерного массива, можно выделить:
- диагонали (главная, побочная);
- элементы, расположенные над и под диагоналями;
- четверти матрицы.
11 |
12 |
13 |
14 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
41 |
42 |
43 |
44 |
45 |
51 |
52 |
53 |
54 |
55 |
Здесь первая цифра номера элемента обозначает номер строки матрицы (i), вторая цифра – номер столбца (j)
Для определения элементов, входящих в любой из перечисленных разделов, существует формула, основными составляющими которой являются i – номер строки, j – номер столбца и N – размерность массива. Например, для определения элемента с номером 43, расположенного под побочной диагональю можно использовать формулу i+j>N+1, где i=4, j=3, N=5, таким образом, получаем 4+3>5+1.
Рисунок 4. Диагонали двумерного массива
4.1 Определение диагоналей массива
Таким образом, в матрице, представленной в п. 4, элементы с номерами 11, 22, 33, 44 и 55 являются элементами главной диагонали. Элементы с номерами 15, 24, 33, 42, 51 – элементы побочной диагонали.
Расположение элементов, находящихся над или под диагональю, определяется по отношению к одной из диагоналей.
i < j
i+j<N+1
i > j
i+j>N+1
Рисунок 5. Расположение элементов по отношению к диагоналям
Элементы 12, 13, 14, 15, 23, 24, 25, 34, 35 и 45 расположены над главной диагональю, 21, 31, 32, 41, 42, 43, 51, 52, 53, 54 расположены под главной диагональю. Элементы 11, 12, 13, 14, 21, 22, 23, 31, 32 и 41 расположены над побочной диагональю, 25, 34, 35, 43, 44, 45, 54, 53, 54, 55 расположены под побочной диагональю.
4.2 Определение четвертей матрицы
Относительно обеих диагоналей элемент массива может находиться в одной из четвертей.
12, 13, 14, 23 – элементы первой четверти
25, 34, 35, 45 – элементы второй четверти
43, 52, 53, 54 – элементы третьей четверти
21, 31, 32, 41 – элементы четвертой четверти
Рисунок 6. Определение четвертей матрицы
Используя правила, представленные на рисунке 6, очень легко можно программным путем формировать матрицы требуемого вида.
Например, сформировать матрицу N × N вида:
4 |
0 |
0 |
0 |
5 |
1 на главной диагонали – 5; на побочной диагонали – 4; в I четверти – 0; во II четверти – 2; в III четверти – 3; в IV четверти – 1. |
4 |
0 |
5 |
2 |
1 |
1 |
4 |
2 |
2 |
1 |
5 |
3 |
4 |
2 |
5 |
3 |
3 |
3 |
4 |
Var
mas:array[1..100,1..100] of integer; i,j,n:integer;
Begin
Writeln(‘Введите размерность массива’);
Readln(n);
For i:=1 to n do {заполняем массив в соответствии с правилами}
For j:=1 to n do
Begin
If i=j then mas[i,j]:=4;
If i+j<N+1 then mas[i,j]:=5;
If (i<j) and (i+j<N+1) then mas[i,j]:=0;
If (i<j) and (i+j>N+1) then mas[i,j]:=2;
If (i>j) and (i+j>N+1) then mas[i,j]:=3;
If (i>j) and (i+j<N+1) then mas[i,j]:=4;
End;
For i:=1 to n do {выводим полученный массив на экран в виде таблицы}
Begin
For j:=1 to n do
Write(mas[i,j],’ ‘);
Writeln;
End;
End.
5. Открытые массивы
Открытые массивы используются в процедурах и функциях как параметры, у которых не задаются размеры. Фактический размер в этом случае определяется с помощью функций High. Индексация всегда начинается с нуля.
Например,
Вычислить максимальный элемент в массиве
function Max (Var Mas: array of integer): integer;
Var Ma : integer;
i : Byte;
Begin
Ma : = Mas [0];
for i : = 1 to High (Mas) do
if Ma < Mas [i] then
Ma : = Mas [i];
Max : = Ma
End.
6. Примеры решения задач
1. Нахождение сумм и произведений элементов массива.
Пример 1. Задан массив A, содержащий 100 целых чисел. Найти сумму элементов этого массива. Фрагмент кода, решающего эту задачу
// сумма элементов массива A из 100 целых чисел
int A[100];
int suma; // переменная, содержащая сумму
int i; // дополнительная переменная
// ввод массива A
// ...
// Вычисление суммы
suma = 0; // обнулить сумму
for (i=0; i<100; i++)
suma += A[i];
Перебор всех элементов массива выполняется в цикле for.
Переменная sum сохраняет результирующее значение суммы элементов массива. Переменная i есть счетчиком, определяющим индекс элемента массива A[i].
Пример 2. Задан массив B, содержащий 20 вещественных чисел. Найти сумму элементов массива, которые лежат на парных позициях. Считать, что позиции 0, 2, 4 и т.д. есть парными.
// сумма элементов массива B
// лежащих на парных позициях
float B[20];
float sum; // переменная, содержащая сумму
int i; // дополнительная переменная
// ввод массива
// ...
// Вычисление суммы
sum = 0; // обнулить сумму
for (i=0; i<20; i++)
if ((i%2)==0)
sum += B[i];
В этом примере выражение
(i%2)==0
определяет парную позицию (парный индекс) массива B. Если нужно взять нечетные позиции, то нужно написать
(i%2)==1
Пример 3. Задан массив, который содержит 50 целых чисел. Найти сумму положительных элементов массива.
// сумма положительных элементов массива
int A[50];
int sum; // переменная, содержащая сумму
int i; // дополнительная переменная
// ввод массива
// ...
// Вычисление суммы
sum = 0; // обнулить сумму
for (i=0; i<50; i++)
if (A[i]>0)
sum = sum + A[i];
2. Нахождение максимального (минимального) элемента массива.
Пример 1. Задан массив A, содержащий 100 целых чисел. Найти сумму элементов этого массива. Фрагмент кода, решающего эту задачу
// сумма элементов массива A из 100 целых чисел
int A[100];
int suma; // переменная, содержащая сумму
int i; // дополнительная переменная
// ввод массива A
// ...
// Вычисление суммы
suma = 0; // обнулить сумму
for (i=0; i<100; i++)
suma += A[i];
Перебор всех элементов массива выполняется в цикле for.
Переменная sum сохраняет результирующее значение суммы элементов массива. Переменная i есть счетчиком, определяющим индекс элемента массива A[i].
Пример 2. Задан массив B, содержащий 20 вещественных чисел. Найти сумму элементов массива, которые лежат на парных позициях. Считать, что позиции 0, 2, 4 и т.д. есть парными.
// сумма элементов массива B
// лежащих на парных позициях
float B[20];
float sum; // переменная, содержащая сумму
int i; // дополнительная переменная
// ввод массива
// ...
// Вычисление суммы
sum = 0; // обнулить сумму
for (i=0; i<20; i++)
if ((i%2)==0)
sum += B[i];
В этом примере выражение