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

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

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

Оцените статью
Добавить комментарий