Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2015, 02:10   #1
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию Сдвиг элементов массива

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

Цитата:
1,2,3,4,5
=> 2
Цитата:
3,4,5,1,2
Не нашел вариантов приемлемых для задачи. Подскажите или подсобите кодом)
DarkHacker вне форума Ответить с цитированием
Старый 25.01.2015, 02:21   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от DarkHacker Посмотреть сообщение
Здравствуйте. Есть массив из целочисленных чисел, нужно написать такую функцию которая сдвигает его вправо или влево таким образом чтобы последние элементы перемещались на первые позиции.
Не нашел вариантов приемлемых для задачи. Подскажите или подсобите кодом)
Либо не искал, либо сам не понимаешь что нужно искать, либо вообще не понимаешь ничего и ждёшь готового решения.

Последний раз редактировалось northener; 25.01.2015 в 02:24.
northener вне форума Ответить с цитированием
Старый 25.01.2015, 02:24   #3
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Либо не искал, либо сам не понимаешь что нужно искать, либо вообще не понимаешь ничего и ждёшь готового решения.

P.S. Вот только не уверен в том, что именно в данной задаче подразумевается под "влево" и "вправо".
Ничего не искал, гуглом пользоваться не умею.
Если знаете ответ, будьте добры подскажите. Вроде как, затем тут и сидят все)

Я вижу вариант с 2мя массивами, но не считаю его оптимальным, хотел узнать как люди реализовывают такие задачи.

===============


Спасибо за помощь и своевременный ответ.

http://www.programmersforum.ru/showp...6&postcount=29

Последний раз редактировалось DarkHacker; 25.01.2015 в 02:28.
DarkHacker вне форума Ответить с цитированием
Старый 25.01.2015, 02:32   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от DarkHacker Посмотреть сообщение
Ничего не искал, гуглом пользоваться не умею.
Если знаете ответ, будьте добры подскажите. Вроде как, затем тут и сидят все)

Я вижу вариант с 2мя массивами, но не считаю его оптимальным, хотел узнать как люди реализовывают такие задачи.
Сидят тут вовсе не "затем".
Ответ знаю. Готовый код не дам. Но подскажу.
Два массива не нужно. Нужна одна временная переменная типа элемента данного массива.
northener вне форума Ответить с цитированием
Старый 25.01.2015, 03:21   #5
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Не думал что вы отпишите еще что-то и не заходил, но видимо сделал так же как вы советуете.)

Знаю что никого не удивлю, но вот такой код у меня получился, надеюсь кому-то будет полезен))

Код:
procedure TPointsArray_Shift(var a:TPointsArray;shift:integer;step:integer=0);
var
buf,t:TPoint;
i:integer;
begin
      buf:=a[0];
      for i:=1 to length(a)-1 do
                      begin
                        t:=A[i];
                        A[i]:=buf;
                        buf:=t;
                      end;
       a[0]:=buf;

       inc(step);

       if(step<shift) then
          TPointsArray_Shift(a,shift,step);
end;
Указываем массив, указываем сдвиг, последний параметр не трогаем он для рекурсии.

Последний раз редактировалось DarkHacker; 25.01.2015 в 03:23.
DarkHacker вне форума Ответить с цитированием
Старый 25.01.2015, 03:34   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

А зачем тут рекурсия?
northener вне форума Ответить с цитированием
Старый 25.01.2015, 03:45   #7
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Ну я хочу например вызвать сдвиг на 5 элементов, следовательно либо в цикле крутить и запоминать 5 элементов в массиве буфера, либо так сделать. Не думаю что есть принципиальная разница. Или есть? )
DarkHacker вне форума Ответить с цитированием
Старый 25.01.2015, 20:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Ну я хочу например вызвать сдвиг на 5 элементов, следовательно либо в цикле крутить и запоминать 5 элементов в массиве буфера
зачем пять?!
в любом случае двух вспомогательных элементов вполне достаточно.

данная задача решается обычно одним из двух способов:
1) простой и неоптимальный.
Пишем процедуру сдвига массива на 1 элемент.
для сдвига на K элементов вызываем процедуру сдвига на 1 элемент K раз.

2) отпимальный - но чуть сложнее и алгоритмически и для отладки/понимания.
пишем функцию(формулу), которая возвращает для заданого индекса (позиции) элемента новую позицию, на которой данный элемент должен стоять после сдвига на K элементов. последовательно "ПЕРЕМЕЩАЕМ" элементы в массиве N раз (N - размер массива) с старой позиции на новую.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг элементов массива (TurboPascal) VladKB1 Помощь студентам 3 02.06.2014 22:46
Сдвиг элементов массива <-> z768 Общие вопросы Delphi 11 26.03.2014 08:31
Сдвиг элементов массива (C++) Nomicos Помощь студентам 4 24.01.2013 16:16
циклический сдвиг элементов массива Carter Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2011 19:54
Удаление элементов массива и сдвиг Alex11223 Паскаль, Turbo Pascal, PascalABC.NET 1 12.01.2011 20:01