Перестановка двух элементов
Пример
Поменять местами значения двух элементов с номерами k1 и k2 (где k1 и k2 вводятся с клавиатуры).
Решение
Опишем процедуру, которой будем передавать номера переставляемых элементов и массив.
Program Example_108;
Procedure Swap(k1, k2: Integer;
Varm: myarray);
Var x: Integer;
Begin
x:=m[k1]; m[k1]:=m[k2]; m[k2]:=x;
End;
Примечание. Задача о перестановке двух элементов с заданными свойствами сводится к этой задаче − надо только найти их номера.
Перестановка нескольких
Элементов (части) массива
Пример
Дан одномерный массив А, состоящий из 2n элементов. Поменять местами его половины.
Решение
Пусть массив А состоит из 10 элементов, то есть n=5: 1, 12, 23, 3, 7, 13, 27, 6, 9, 11. Тогда если мы поменяем местами его половины, то получим такой массив А: 13, 27, 6, 9, 11, 1, 12, 23, 3, 7. Заметим, что мы меняем местами элементы с номерами 1 и n+1, 2 и n+2 и так далее; последняя пара − n и 2n. Легко заметить и то, что элемент с номером i меняется местами с элементом с номером n+i. Поэтому, используя процедуру Swap из примера, можно в основной программе применить цикл:
Program Example_109;
...
For i:=1 To n div 2 Do
Swap(i, i+n div 2, A);
ДВУХМЕРНЫЕ МАССИВЫ
Описание. Работа с элементами
Двухмерные массивы можно представить в виде прямоугольной таблицы или матрицы.
Рассмотрим матрицу А размерностью 2х3 (состоящую из двух строк по три элемента в каждой):
a11 a12 a13
A=
a21 a22 a23
Положение каждого элемента определяется двумя числами: номером строки, в которой находится элемент, и номером столбца. Например, а12 − это элемент, стоящий в первой строке и во втором столбце.
Имеется несколько способов объявления двухмерных массивов.
Способ 1. В Паскале двухмерный массив можно описать как одномерный, элементами которого являются одномерные массивы. Например, для матрицы А, приведенной выше:
Const n=2; m=3;
Type omyarray=Array[1..m] Of real;
dmyarray=Array[1..n] Of omyarray;
Var v: omyarray;
a: dmyarray;
В данном случае переменная v объявлена как одномерный массив из трех элементов вещественного типа. Переменная а описана как двухмерный массив из двух строк, в каждой по три элемента.
Способ 2. Описание массива А можно сократить, исключив определение типа omyarray в определении типа dmyarray:
Const n=2; m=3;
Type dmyarray=Array[1..n] Of Array[1..m]
Of <тип элементов>;
Var a: dmyarray;
Способ 3. Еще более краткое описание массива А можно получить, указывая диапазоны изменения индексов для каждой размерности массива:
Const n=2; m=3;
Type dmyarray=Array[1..n, 1..m]
Of <тип элементов>;
Var a: dmyarray;
Если нет необходимости описывать тип, то можно просто объявить массив в разделе описания переменных:
Var a: Array[1..n,1..m]
Of <тип элементов>;
Рассмотренные выше методы решения задач обработки одномерных массивов могут применяться и для обработки двухмерных массивов. Поскольку положение элемента в двухмерном массиве описывается двумя индексами (первый − номер строки, второй − номер столбца), программы для решения большинства матричных задач строятся на основе вложенных циклов. Обычно внешний цикл организуется по строкам матрицы, то есть в нем выбирается требуемая строка матрицы, а внутренний цикл − по столбцам матрицы, в нем выбирается элемент строки. Для присваивания значений элементам массива могут быть использованы операторы присваивания и операторы ввода.
Пример
В приведенном ниже примере осуществляются ввод и вывод двухмерного массива А размерностью 10х15. Формирование и вывод массива производятся в двух процедурах, которые последовательно вызываются из основной программы. Надо заметить, что формирование двухмерного массива можно осуществлять всеми четырьмя способами, описанными для одномерных массивов, то есть: вводом с клавиатуры, посредством генератора случайных чисел, с помощью файла или описанием типизированной константы. Пусть в нашем примере элементы задаются посредством генератора случайных чисел.
Program Example_110;
Const n=10; m=15;
Type dmyarray = Array[1..n, 1..m]
Of Integer;
Var A: dmyarray;
Procedure Init(Var x: dmyarray);
{Процедура формирования массива}
Var i, j: Integer;
Begin
For i=1 To n Do
For j:= 1 To m Do x[i, j]:=
-25+Random(51);
End;
Procedure Print(x: dmyarray);
{Процедура вывода массива на экран}
Var i, j: Integer;
Begin
For i:=1 To n Do
Begin {Вывод i-й строки массива}
For j:=1 To m Do Write(x[i, j]:5);
Writeln; {Переход на начало
следующей строки}
End;
End;
Begin
Init(A);
Writeln('Массив А:');
Print(A);
Readln;
End.
Можно выделить несколько видов задач на двухмерные массивы.
Найти сумму элементов
Иногда необходимо найти сумму всех элементов, иногда − только некоторых, удовлетворяющих определенному условию. Мы рассмотрим более сложный пример.
Пример
Сформировать одномерный массив, каждый элемент которого равен сумме отрицательных элементов соответствующей строки заданной целочисленной матрицы.
Решение
Опишем одномерный массив, размерность которого равна количеству строк в двухмерном массиве.
Const n=10; m=15;
Type omyarray=Array [1..n] Of Integer;
dmyarray=Array[1..n, 1..m] Of Integer;
Var B: omyarray;
A: dmyarray;
Формировать одномерный массив по заданному правилу будем в процедуре. Ей передаются два параметра − исходный двухмерный массив и одномерный массив, который является результатом. В теле процедуры используются вложенные циклы. Внешний цикл определяет номер строки, который совпадает с номером элемента одномерного массива. Здесь же задаются начальные значения элементов одномерного массива, равные 0. Во внутреннем цикле анализируется каждый элемент выбранной строки. Если очередной элемент отрицательный, то он добавляется к сумме всех предыдущих отрицательных элементов выбранной строки матрицы.
Program Example_111;
Procedure Sum(x: dmyarray;
Var y: omyarray);
Var i, j: Integer;
Begin
For i:=1 To n Do
Begin
y[i]:=0; {Присваивание начальных
значений элементов массива суммы}
For j:=1 To m Do
{Накопление суммы отрицательных}
If x[i,j]<0 Then y[i]:=y[i]+x[i,j];
End;
End;
В основной программе после вызова процедуры Sum(А, В) остается только вывести на экран одномерный массив В, в котором записаны суммы отрицательных элементов каждой строки.