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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2010, 16:40   #1
~Annie~
Пользователь
 
Аватар для ~Annie~
 
Регистрация: 21.10.2010
Сообщений: 14
По умолчанию как циклически сдвинуть массив в C#

Здравствуйте! Не могли бы помочь, как циклически сдвинуть массив в C# на k элементов. Исходный массив A=(1,2,3,4,5), а сдвинутый вправо на 2 позиции будет A=(4,5,1,2,3)
Код:
const int n = 5;
 int[] a = new int[n] { 1, 2, 3, 4, 5 };
int[] c;
int[] p = new int[n];
Console.WriteLine("Исходный массив:");
for (int i = 0; i < n; ++i)
 Console.Write("\t" + a[i]);
Console.WriteLine();
Console.WriteLine("Введите k");
int k = Convert.ToInt16(Console.ReadLine());

for (int i = 0; i < k; ++i)
 p[i] = a[n - k + i];

for (int i = n - k; i < 0; --i)
a[i + k] = a[i];

 for (int i = 0; i < k; ++i)
a[i] = p[i];

Console.WriteLine("Новый массив: ");
for (int i = 0; i < n; ++i)
Console.Write("\t" + a[i]);
Console.WriteLine();
 Console.ReadKey();
Получается только половина действия, т.е. хвост массива сдвигается вперед, а остальные элементы стоят на месте: A=(4,5,3,4,5). Ошибка где-то в цикле, получается 2-й for ничего не делает.
Искала в предыдущих темах, но такого не нашла ответа. Может быть кто-нибудь знает?
~Annie~ вне форума Ответить с цитированием
Старый 21.10.2010, 21:17   #2
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

Код:
...
int[] a = new int[10] {0,1,2,3,4,5,6,7,8,9};
int[] b = new int[10];
int offset = 3;
for (int i = 0; i < a.Length; i++)
{
      b[i] = (i + offset) % a.Length;
}
...
akasex вне форума Ответить с цитированием
Старый 21.10.2010, 21:38   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

существуют два принципиально разный подхода (сейчаc лень, но можете порыться, на форуме я как-то приводил примеры кода, правда, на Delphi):
- однопроходный. Каждый элемент сразу сдвигаем на столько элементов, на сколько надо. Это очень эффективно. Но тут возникают сложности, т.к. достатночно муторно вычислить, какой элемент с каким надо менять местами.
- циклический. Любой сдвиг на K элементов это К сдвигов на один элемент. А сдвиг на один элемент - это алгоритмически крайне просто.
Вот пример решения на основании второго подхода:
Код:
			
            const int n = 5;
            int[] a = new int[n] { 1, 2, 3, 4, 5 };
            Console.WriteLine("Исходный массив:");

            for (int i = 0; i < n; ++i)
                     Console.Write("\t" + a[i]);
            Console.WriteLine();

            Console.WriteLine("Введите k");
            int k = Convert.ToInt16(Console.ReadLine());

            for (int i = 0; i < k; ++i)
            {
              int aLast = a[n-1];
              for (int j = n-1; j>0; j--)
                  a[j] = a[j-1];
              a[0] = aLast;
            }

            Console.WriteLine("Новый массив: ");
            for (int i = 0; i < n; ++i)
            	Console.Write("\t" + a[i]);
            Console.WriteLine();
            Console.ReadKey();

p.s. akasex, молодца! Опередил! впрочем, с дополнительным массивом это просто. Гораздо интереснее решить задачу БЕЗ дополнительного массива!

Последний раз редактировалось Serge_Bliznykov; 21.10.2010 в 21:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2010, 13:03   #4
~Annie~
Пользователь
 
Аватар для ~Annie~
 
Регистрация: 21.10.2010
Сообщений: 14
По умолчанию

akasex, Serge_Bliznykov, большое вам спасибо за ответы! Обязательно попробую оба варианта.
~Annie~ вне форума Ответить с цитированием
Старый 22.10.2010, 13:26   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Здесь это обсуждалось, искали разные способы
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сдвинуть изображение Alex Cones HTML и CSS 4 25.09.2010 19:12
Как вставить строку в таблицу excel при этом все остальные сдвинуть на позицию в низ, сохранив их формат. anchorte Общие вопросы Delphi 2 06.04.2010 15:31
Сдвинуть строку в C++ orine Помощь студентам 5 15.01.2010 13:09
Удалить первый элемент с заданным значением. Сдвинуть массив циклически на К элементов в право GydZu Паскаль, Turbo Pascal, PascalABC.NET 10 17.05.2009 16:38
Циклически задать однотипные параметры для многих компонентов единого класса chandrasecar Общие вопросы Delphi 4 25.01.2009 00:18