Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/55: Рейтинг темы: голосов - 55, средняя оценка - 4.51
1 / 1 / 0
Регистрация: 23.01.2019
Сообщений: 25

Циклический сдвиг массива

09.02.2019, 23:15. Показов 11431. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, в коде осуществляется сдвиг элементов массива на k элементов влево, однако не устраивает результат, так как первый элемент массива считывается как 0, второй как 1 и т.д, читал, что при помощи ArrayList либо CopyTo можно сделать иначе.
К примеру есть массив {1, 2, 3, 4, 5, 6, 7, 9, 10}, при сдвиге влево на k=3 единиц получаем результат {5, 6, 7, 8, 9, 10, 1, 2, 3, 4}, надо чтобы было {4, 5, 6, 7, 8, 9, 10, 1, 2, 3}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Program
    {
        static void Main(string[] args)
        {
 
            int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            int k = 3;
            int tmp;
            int nextInd = 0;
 
            Console.WriteLine(string.Join(" ", arr));
 
            for (int i = 0; i < arr.Length-1; ++i)
            {
                nextInd += k;
                nextInd %= arr.Length;
 
                tmp = arr[nextInd];
                arr[nextInd] = arr[0];
                arr[0] = tmp;
            }
 
            Console.WriteLine(string.Join(" ", arr));
 
        }
        
    }
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2019, 23:15
Ответы с готовыми решениями:

Циклический сдвиг массива
Задан линейный массив. Осуществить в нем сдвиги по следующему правилу: циклически сдвинуть на с элементов влево. Число с вводится. ...

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

Осуществить циклический сдвиг элементов массива
Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на одну позицию (при этом A1 перейдет в A2, A2 — в A3, …, AN —...

5
172 / 118 / 57
Регистрация: 08.01.2013
Сообщений: 664
10.02.2019, 03:04
Лучший ответ Сообщение было отмечено 1LLEN1UM как решение

Решение

Я думаю правильнее всего эту задачу решить рекурсией.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Test
{
    class Program
    {
 
        public static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        public static int k = 3;// число сдвигов
        public static int tmp;// переменная где будем хранить число массива во время рекурсии
        public static int LastInd = 0;// Последний элемент массива. после рекурсии она теряется
        static void Main(string[] args)
        {
            Console.WriteLine(string.Join(" ", arr));
            for (int i = 0; i < k; i++)// цикл на количество итераций сдвига
            {
                LastInd = arr[arr.Length - 1];// сохраняем последний элемент массива, чтобы после рекурсии не потерять
                rec(arr.Length);// функция с рекурсией
                arr[arr.Length - 2] = LastInd;// возвращаем последний элемент массива на место, уже после выполненный сдвигов
            }
            Console.WriteLine(string.Join(" ", arr));
            Console.ReadKey();
        }
        static void rec(int col)// col - это количество элементов массива, она уменьшается
        {// и с помощью рекурсии, не парим мозг себе с реализацией программы с циклами и метками
            if (col != 0)// условие нужно чтобы не возникало ошибки, arr[col - 1] -> arr[-1] не существует
            {
                tmp = arr[col - 1];// сохраняем элемент в переменную
                col--;// уменьшаем грубо говоря счетчик, чтобы сохранить почти все элементы, кроме последней
                // можно конечно еще подумать и сделать все намного компактно, но и так сойдет
                rec(col); // вызываем снова, но уже с меньшим количеством элементов
                if (col != 0)// условие нужно чтобы не возникало ошибки, arr[col - 1] -> arr[-1] не существует
                {
                    arr[col - 1] = arr[col];// заполняем массив после выхода из рекурсии
                }
                else
                {
                    arr[arr.Length-1-col] = tmp; // первый элемент массива ставим на последний, как то так
                }
            }
        }
    }
}

Если что, грамотные люди меня поправят. иногда у меня плохо получается объяснять
1
1 / 1 / 0
Регистрация: 23.01.2019
Сообщений: 25
17.02.2019, 17:18  [ТС]
Спасибо. Как сделать вывод результат в форму?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
18.02.2019, 02:15
bloomder, неправильней, рекурсия очень затратна и ограничена ресурсами компухтера, банальный цикл посчитает "в любом случае" и намного быстрее...
0
1 / 1 / 0
Регистрация: 23.01.2019
Сообщений: 25
04.03.2019, 08:28  [ТС]
алеее
0
0 / 0 / 0
Регистрация: 08.08.2022
Сообщений: 1
08.08.2022, 21:04
using System;
using System.Collections.Generic;

public class MainClass
{
public static void Main()
{
int[] arrayOfOurNumbers = new int[] { 3, 5, 7, 11, 4, 5 };
int[] arrayOfOurNumbers2 = new int[arrayOfOurNumbers.Length];
int counterOfShifts = 0;
int counterOfShifts2 = 0;
int counterOfShifting = int.Parse(Console.ReadLine());
if (counterOfShifting > arrayOfOurNumbers.Length)
{
Console.WriteLine("Incorrect input");
}
for (int i = 0; i < arrayOfOurNumbers.Length - 1; i++)
{
if ((counterOfShifts + counterOfShifts2) <= arrayOfOurNumbers.Length)
{
if (i < (arrayOfOurNumbers.Length - counterOfShifting))
{
arrayOfOurNumbers2[i] = arrayOfOurNumbers[i + counterOfShifting];
counterOfShifts++;
}
else
{
for (int j = 0; j < arrayOfOurNumbers.Length - counterOfShifts; j++)
{
arrayOfOurNumbers2[i] = arrayOfOurNumbers[j];
counterOfShifts2++;
i++;
}
}
}
else break;
}
for (int i = 0; i < arrayOfOurNumbers.Length; i++)
Console.Write(arrayOfOurNumbers2[i] + " ");
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.08.2022, 21:04
Помогаю со студенческими работами здесь

Логический сдвиг влево,логический сдвиг вправо,алгоритм обмена двух переменных,циклический сдвиг
Битовые сдвиги.FW4,msstudio 13,на C# 1)Реализовать быстрое умножение на 2(логический сдвиг влево) 2)Реализовать быстрое деление на...

Осуществить циклический сдвиг элементов массива влево на k позиций
Есть код на сдвиг в правую сторону, (т.е. изначальный массив: 1,2,3,4,5; k=3; Исходный массив: 3,4,5,1,2) for (int...

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

Циклический сдвиг элементов массива влево/вправо на k позиций
Дан массив размера N и число k (0 &lt; k &lt; 5, k &lt; N). Осуществить циклический сдвиг элементов массива влево1|вправо2 на k позиций.

Осуществить циклический сдвиг элементов массива влево (вправо) на k позиций
Дан массив размера N и число k (0 &lt; k &lt; 5, k &lt; N). Осуществить циклический сдвиг элементов массива влево (вправо) на k позиций ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru