Организация и описание процессов обработки данных с помощью одномерных массивов и подпрограмм, страница 3

//-------------------------------------------------------------------------------------

var

       A: Vector = (1, 5, -3, 2, 7);// массив инициированный начальными

                                                       //значениями

  i: integer;

begin

//----------Вызов процедуры-----------------------------------------------------

  Reorder(A);

  for i:= Low(Vector) to High(Vector) do  write('A[',i,']',' = ',A[i]:6:2,' ');

  writeln;

  readln;

end.

З а д а ч и  № 7, 8, 9

Написать и оттестировать процедуру. Процедура получает через параметр одномерный массив вещественных переменных и целое – параметр сдвига. Процедура изменяет массив циклическим сдвигом значений его компонентов на заданное число позиций, равное параметру сдвига в указанном направлении. Направление сдвига задаётся знаком параметра сдвига: вправо, если параметр больше нуля; влево, если он отрицателен.

Циклический сдвиг – это сдвиг, при котором, выдвигаемое за пределы массива значение заносится в крайний компонент массива, находящийся с краю, противоположном направлению сдвига.

Исходный массив

Элемент

A[0]

A[1]

A[2]

A[3]

A[4]

Значение

1

5

-3

2

7

Массив после цикли-

ческого сдвига значений

на 1 позицию вправо

Элемент

A[0]

A[1]

A[2]

A[3]

A[4]

Значение

7

1

5

-3

2

Разобьем задачу на части и опишем результат разбиения с помощью схемы иерархии логических модулей. Для сдвига массива на заданное число позиций надо уметь сдвигать его на одну позицию.
Применяя сдвиг на одну позицию заданное число раз, получим ожидаемый результат. Модуль верхнего уровня иерархии управляет вызовом модулей нижнего уровня, в зависимости от числа позиций и направления сдвига.

Проанализируем, как можно сдвинуть массив на одну позицию вправо. Отобразим результат анализа в виде рисунка. Сдвиг начинаем с того, что на первом шаге копируем содержимое компонента массива с максимальным значением индекса во вспомогательную переменную. Шаги со второго по пятый состоят в том, что мы копируем значение из предыдущего компонента массива в последующий компонент, начиная с компонента под индексом 3 (на пятом шаге мы копируем из компонента под индексом 0 в компонент под индексом 1). На шестом шаге копируем содержимое вспомогательной переменной в первый элемент массива. Описанный алгоритм может быть реализован с помощью представленной ниже процедуры.

//-------------------------------------------------------------------------------

procedure ShiftR(var a: array of real);

//Осуществляет циклический сдвиг значений компонентов массива   
//на 1 позицию вправо.

var

  t: Real;                                          //вспомогательная переменная

  i: integer;

begin

  t:= a[high(a)];                                           //первый шаг

  for i:= high(a) – 1 downto Low(a) do         // шаги со 2 по n; n – чис-

                                                                      //ло компонентов в массиве

     a[i + 1] := a[i];

  a[Low(a)]:= t;                                            //n + 1шаг

end;

//-------------------------------------------------------------------------------

Выполнив небольшие изменения, получим сдвиг массива на одну позицию влево. Рисунок, иллюстрирующий этот алгоритм, представлен ниже.

Процедура, реализующая циклический сдвиг значений компонентов массива на одну позицию влево, представлена ниже.

//-------------------------------------------------------------------------------

procedure ShiftL(var a: array of real);

//Выполняет циклический сдвиг значений компонентов массива на 1 //позицию влево.

var

  t: Real;                                          //вспомогательная переменная

  i: integer;

begin

  t:= a[Low(a)];                                            //первый шаг

  for i:= Low(a) to high(a) – 1 do      // шаги со 2 по n; n – число ком//понентов в                                              массиве

     a[i] := a[i + 1];

  a[High(a)]:= t;                                           //n + 1шаг

end;

//-------------------------------------------------------------------------------

Процедура, реализующая головной модуль, занимается управлением вызовов процедур сдвига влево и вправо на одну позицию. Условимся задавать направление сдвига знаком при параметре сдвига: вправо – если параметр сдвига число положительное, влево – если отрицательное. Параметр сдвига определяет также количество позиций, на которые необходимо переместить значения компонентов массива. При длине массива n сдвиг массива влево или вправо на n позиций приводит к получению исходного массива. Поэтому при любых значениях n количество требуемых сдвигов не превышает числа n – 1. Для получения требуемого числа сдвигов необходимо взять остаток от деления параметра сдвига на n.

Процедура, реализующая головной модуль, представлена ниже.

//-------------------------------------------------------------------------------

procedure Shiftp(var a: array of real; p: integer);