Перейти к содержимому

Как сдвинуть массив влево c

  • автор:

Сдвинуть элементы массива на 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] ). После цикла в первую ячейку массива записывается ноль.

Количество шагов сдвига определяется внешним циклом.

Алгоритм решения данной задачи можно описать так:

  1. Запросить у пользователя количество шагов сдвига и направление. Условиться, что если вводится отрицательное целое, то сдвиг выполняется влево на указанное абсолютное значение, если вводится положительное число, то сдвиг вправо.
  2. Заполнить исходный массив и вывести его на экран.
  3. Выполнять внешний цикл столько раз, сколько шагов было указано.
    1. Если было введено отрицательное число, то выполнить цикл от первого элемента до предпоследнего, перезаписав в нем значение каждой очередной ячейки на значение последующей. Записать в последнюю ячейку 0.
    2. Иначе, выполнить цикл от последнего элемента до второго, записывая в каждую текущую ячейку значение предыдущей. В первую ячейку записать 0.
    3. Вывести на экран текущий массив.

    Посмотреть вариант кольцевого сдвига (когда вышедший за границу элемент массива записывается с другой его стороны) можно здесь.

    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];

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *