Задано: массив A=(a1,a2,...,an); N - размер массива; m – число позиций, на которые надо сдвинуть массив вправо ( влево ).
Сформировать: сдвинутый массив, например : исходный массив A=(a1,a2,a3,a4,a5,), а сдвинутый вправо на 2 позиции A=(a4,a5,a1,a2,a3).
Исходные данные:
N - размер массива;
A - массив размером N;
M - число позиций сдвига;
Результат: A - массив, циклически сдвинутый на M позиций вправо;
Вспомогательные переменные:
I - индекс - управляющая переменная цикла;
P - массив размером не менее N (вариант 1) для временного хранения "хвоста" массива;
P - переменная (вариант 2) для временного хранения элемента массива A; Y - управляющая переменная внутреннего цикла (вариант 2).
Вариант 1: "хвост" массива пересылается во вспомогательный массив, остальные элементы перемещаются вправо на M позиций. Порядок перемещения обратный, прямой привел бы к искажениям массива. Далее в первые элементы массива A пересылаются элементы вспомогательного массива. Эта процедура повторяется М раз.
Procedure SDVIG_VAR1( n, m : integer; A : mas; var A : mas ;);
{ процедура сдвига элементов массива на m позиций по первому варианту }
Var P : mas;
begin
for i := 1 to m do
P[ i ] := A [ n - m + i ];
for i := n - m downto 1 do
A [ i+m ] := A[ i ];
for i := 1 to m do A [ i ] := P [ i ] ;
end;
Вариант 2. Во вспомогательную переменную каждый раз пересылается последний элемент массива А, затем все элементы сдвигаются вправо на одну позицию (в обратном порядке) и на место первого элемента помещается содержимое вспомогательной переменной.
Procedure SDVIG_VAR2( n, m : integer; A : mas; var A : mas ;);
{ где mas должен быть описан в главной программе, см 7.1.}
{ сдвиг элементов массива на m позиций по второму варианту}
Var P : real;
begin
for i := 1 to m do
begin P := A [ n ] ;
for y := n downto 2 do A[ y ] := A [ y-1] ;
A [1] := P ;
end
end;
При сравнении двух вариантов сдвига элементов массива на m позиций вправо можно отметить, что в варианте 1 потребуется больше памяти, а в варианте 2 - больше затрат времени.
Опубликовал Kest
November 12 2008 21:18:01 ·
4 Комментариев ·
25601 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Dushess June 12 2011 11:35:12
А как влево смещать? Что надо поменять в процедуре?
Olol November 27 2011 13:23:35
Пидр пиши задачи нормально!
begin
for i := 1 to m do
begin P := A [ n ] ;
for y := n downto 2 do A[ y ] := A [ y-1] ;
A [1] := P ;
end
end;
где сука ";" после end ????
Olol-loh January 09 2012 03:32:28
Olol ты сам олень) не обязательно ставить ; перед end
textliner October 02 2012 06:26:33
Olol-loh прав оба раза. Хамить не надо.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.