Сдвиг массива

Задача

Сдвинуть элементы массива в указанном направлении (влево или вправо) и на указанное число шагов. Освободившиеся ячейки заполнить нулями. Выводить массив после каждого шага.

Пояснение к задаче и алгоритм решения

Если массив сдвигается на один шаг влево, то на место элемента с индексом 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.

Особенности решения на языке программирования Pascal

Пример(ы) выполнения программы:

Сдвиг влево:

-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

Исходный код на языке программирования C

#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

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

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

Тема

Массивы

Уровень сложности

Сложный

Дата публикации