Перестановка двух элементов

Пример

Поменять местами значения двух элементов с номе­рами 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 (состоя­щую из двух строк по три элемента в каждой):

Перестановка двух элементов - student2.ru Перестановка двух элементов - student2.ru 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(А, В) остается только вывести на экран одномер­ный массив В, в котором записаны суммы отрицатель­ных элементов каждой строки.

Наши рекомендации