Сдвинуть элементы массива на k позиций
пусть а — это массив для сдвига, а size_array — его размер и пусть массив будет целочисленный.
int tmp1, tmp2; tmp1 = a[0]; tmp2 = a[1]; for (int i = 0; i < size_array-2; i++) a[i] = a[i+2]; a[size_array-2] = tmp1; a[size_array-1] = tmp2;
если нужно сдвинуть на какое то другое кол-во позиций, то обычно применяют последовательный сдвиг. Ещё можно завести массив, равный сдвигу, скопировать туда начальные элементы (memcpy) остальные элементы сдвинуть (memmove) и скопировать с дополнительно массива назад элементы в конец исходного массива.,
UPD: здесь есть очень интересные объяснения, как делать сдвиг.
Сдвиг массива
Сдвинуть элементы массива в указанном направлении (влево или вправо) и на указанное число шагов. Освободившиеся ячейки заполнить нулями. Выводить массив после каждого шага.
Если массив сдвигается на один шаг влево, то на место элемента с индексом i записывается тот элемент, который находится на месте i+1. То есть на место текущего элемента записывается следующий за ним. В последнюю ячейку массива записывать нечего. По условию задачи туда следует записать число 0.
Таким образом, сдвиг массива на один шаг влево — это цикл от первого элемента до предпоследнего включительно, в теле которого происходит запись значения из следующей ячейки в текущую ячейку ( arr[i] := arr[i+1] ). В предпоследнюю ячейку записывается последний элемент. После цикла присваивается 0 в последнюю ячейку массива.
Если массив сдвигается на один шаг вправо, то его следует «перебирать» с конца. На место элемента i присваивается стоящий перед ним (i-1). В освободившуюся первую ячейку записывается ноль.
Сдвиг массива на один шаг вправо — это цикл от последнего элемента до второго включительно, в теле которого происходит запись значения из предыдущей ячейки в текущую ( arr[i] := arr[i-1] ). После цикла в первую ячейку массива записывается ноль.
Количество шагов сдвига определяется внешним циклом.
Алгоритм решения данной задачи можно описать так:
- Запросить у пользователя количество шагов сдвига и направление. Условиться, что если вводится отрицательное целое, то сдвиг выполняется влево на указанное абсолютное значение, если вводится положительное число, то сдвиг вправо.
- Заполнить исходный массив и вывести его на экран.
- Выполнять внешний цикл столько раз, сколько шагов было указано.
- Если было введено отрицательное число, то выполнить цикл от первого элемента до предпоследнего, перезаписав в нем значение каждой очередной ячейки на значение последующей. Записать в последнюю ячейку 0.
- Иначе, выполнить цикл от последнего элемента до второго, записывая в каждую текущую ячейку значение предыдущей. В первую ячейку записать 0.
- Вывести на экран текущий массив.
Посмотреть вариант кольцевого сдвига (когда вышедший за границу элемент массива записывается с другой его стороны) можно здесь.
Pascal
сдвиг массива паскаль
const N = 9;
var
arr: array[1..N] of integer;
qty: integer;
i,j: byte;
begin
readln(qty);
for i:=1 to N do begin
arr[i] := i*100 + i*10 + i;
write(arr[i]:4);
end; writeln;
for j:=1 to abs(qty) do begin
if qty > 0 then begin
for i:=N downto 2 do
arr[i] := arr[i-1];
arr[1] := 0;
end
else begin
for i:=1 to N-1 do
arr[i] := arr[i+1];
arr[N] := 0;
end;
for i:=1 to N do
write(arr[i]:4);
writeln;
end;
end.
Пример(ы) выполнения программы:
Сдвиг влево:
-4
111 222 333 444 555 666 777 888 999
222 333 444 555 666 777 888 999 0
333 444 555 666 777 888 999 0 0
444 555 666 777 888 999 0 0 0
555 666 777 888 999 0 0 0 0
Сдвиг вправо:
5
111 222 333 444 555 666 777 888 999
0 111 222 333 444 555 666 777 888
0 0 111 222 333 444 555 666 777
0 0 0 111 222 333 444 555 666
0 0 0 0 111 222 333 444 555
0 0 0 0 0 111 222 333 444Язык Си
#include < stdio.h>
#define N 9
main() int arr[N], qty, i, j;
scanf("%d",&qty);
for (i=0; i < N; i++) arr[i] = (i+1)*100 + (i+1)*10 + (i+1);
printf("%4d",arr[i]);
>
printf("\n");
for (j=0; j < abs(qty); j++) if (qty < 0) for (i=0; i < N-1; i++)
arr[i] = arr[i+1];
arr[N-1] = 0;
> else for (i=N-1; i>0; i--)
arr[i] = arr[i-1];
arr[0] = 0;
>
for (i=0; i < N; i++)
printf("%4d",arr[i]);
printf("\n");
>
>Python
сдвиг массива python (питон)
qty = int(input())
N = 9
a = []
for i in range(1,N+1):
b = 100*i + 10*i + i
a.append(b)
print("%4d" % b, end='')
print()
for j in range(abs(qty)):
if qty < 0:
for i in range(N-1):
a[i] = a[i+1]
a[N-1] = 0
elif qty > 0:
for i in range(N-1,0,-1):
a[i] = a[i-1]
a[0] = 0
for i in a:
print("%4d" % i, end='')
print()КуМир
алг
нач
цел N=9
цел таб массив[1:N]
цел шаги, i, j
ввод шаги
нц для i от 1 до N
массив[i] := i*100+i*10+i
вывод массив[i]:4
кц
вывод нс
нц для j от 1 до iabs(шаги)
если шаги > 0 то
нц для i от N до 2 шаг -1
массив[i] := массив[i-1]
кц
массив[1] := 0
иначе
нц для i от 1 до N-1
массив[i] := массив[i+1]
кц
массив[N] := 0
все
нц для i от 1 до N
вывод массив[i]:4
кц
вывод нс
кц
конВ программе используется форматированный вывод, который доступен только в версии 2.x.
Basic-256
input qty
N = 9
dim arr(N)
for i=0 to N-1
arr[i] = (i+1)*100 + (i+1)*10 + (i+1)
print arr[i] + " ";
next i
print
for j=1 to abs(qty)
if qty < 0 then
for i=0 to N-2
arr[i] = arr[i+1]
next i
arr[N-1] = 0
else
for i=N-1 to 1 step -1
arr[i] = arr[i-1]
next i
arr[0] = 0
endif
for i=0 to N-1
print arr[i] + " ";
next i
print
next jКак циклически сдвинуть массив в C#?
Здравствуйте! Не могли бы помочь, как циклически сдвинуть массив в C# на k элементов?
существуют два принципиально разный подхода (сейча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 ( ) ;Похожие статьи
- Работа с двумерными массивами (матрицами) средствами Delphi
- Динамические массивы Turbo Pascal
- Использование нетипизированного указателя для передачи массива
- Запись данных в файла из массив с помощью FileStream
- Как перемешать массив, заполненный английским алфавитом?
- Как создать двумерный динамический массив?
- Класс, который ищет совпадение в массиве
- Умножение матриц
- Получить из текста строки, и занести их в массив
- Как использовать цвета в массиве
Как сдвинуть массив влево c
Циклическо сдвинуть элементы массива на K позиций влево, тоже сделать, испульзуя динамические массивы
Добрый вечер.
Помогите, пожалуйста, решить задачку.
Нужно в C++(Билдер 6(через консоль)) написать небольшую програмку, используя одномерные массивы. Нужно циклическо сдвинуть элементы массива на K позиций влево. И тоже самое нужно сделать, испульзуя динамические массивы. Объясните мне как это делать? И ещё, посоветуйте какую-нибудь хорошую книга по С++ для начинающих, где всё подробно разрабранно для тех кто в бронепоезде). мне посоветовали Дейтла. Какое ваше мненин об этой книге?) Заранее спасибо!Форумчанин
Регистрация: 10.09.2007
Сообщений: 105Привет!
Я немного не понял, все элементы массива сдвигать на K позиций?//допустим мы создадим массив unsigned char size = 255; int *mas = new int[size];Так вот, если мы обратимся к элементу mas[size] - вылезем за границы.
Тоесть, уточни задачу, что перемещать.
мы не можем последний элемент сдвинуть туда. где не выделена память под массив. Это приведет к ошибке времени исполнения.Бог сделал людей разными, а генерал Кольт уравнял шансы
Регистрация: 22.10.2007
Сообщений: 5Ах да, сори забыл написать.) Нам дан целочисленный одномерный массив из n элементов (1<=n<=100). И нужно выполнить заданную операцию над массивом, т.е. циклически сдивинуть элементы массива на k позиций влево. И тоже самое нужно сделать использую динамический массив. Помогите и объясните как это сделать, пожалуйста, ибо я пока в этом чайник.
Форумчанин
Регистрация: 10.09.2007
Сообщений: 105я не совсем понял "сдвинуть на k позиций влево"
если мы первый элемент массива, с индексом [0] сдвинем в лево. где он должен оказаться?Бог сделал людей разными, а генерал Кольт уравнял шансы
Участник клуба
Регистрация: 02.09.2007
Сообщений: 1,193Циклически - это по кругу. Если сдвигаем на 1 позицию влево, то 1 становиться 100, 100-99, 99-98. 2-1
Участник клуба
Регистрация: 02.09.2007
Сообщений: 1,193#include #include #include "stdlib.h" #define n 100 //размер массива #define k 4 //величина сдвига main() < int M[n], M1[n]; //объявляем массивы //заполняем массив M случайными числами randomize; for (int i=1; i//печатаем массивы for (int i=1; i
Книги посмотри здесь http://www.libray.narod.ru/rapid/katalog_cc.htm
Последний раз редактировалось _Dmitry; 01.11.2007 в 18:09 .
Участник клуба
Регистрация: 02.09.2007
Сообщений: 1,193
При использовании динамических массивов, замениint M[n], M1[n];int *M = new int[n]; int *M1 = new int[n];