Сдвиг элементов массива - Pascal
Формулировка задачи:
Создать программу, сдвигающую элементы k-го слоя целочисленного прямоугольного массива matrix[n,m] на p шагов вправо. Номер k-го слоя и количество шагов p задать с консоли. Дополнительные вектора и строки не использовать, работать в одном массиве.
Пример:
Номер слоя k=2
Количество шагов p=1
Исходный массив:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Полученный массив:
1 2 3 4 5
1 4 2 3 5
1 4 2 3 5
1 2 3 4 5
////////////////
Я долго думал, но для меня это слишком сложно, если записывать в вектор, то еще по легче, хотя как работать с первым слоем... На примере два слоя, но может быть три. Помогите пожалуйста.
Листинг программы
- program poll;
- const
- n=4;
- m=5;
- v_min=-20;
- v_max=10;
- var posl,q,s,i,j,p,k:integer;
- mas:array[1..n,1..m] of integer;
- begin
- randomize;
- for i:=1 to n do
- for j:=1 to m do
- mas[i,j]:=random(v_max-v_min+1)+v_min;
- writeln('Исходный массив:');
- for i:=1 to n do
- begin
- for j:=1 to m do
- write(mas[i,j]:5);
- writeln;
- end;
- writeln;
- {//////////////////////////////////////}
- writeln('Введите номер слоя:');
- readln(k);
- writeln('Введите количесвто шагов:');
- readln(p);
- //обращаемся к нужному слою
- for i:=k to n-(k-1) do
- begin
- posl:=mas[i,m-(k-1)];
- for j:=m-(k-1) downto k+1 do
- begin//что делать я хз
- q:=mas[i,j];
- mas[i,j]:=mas[i,j-1];
- mas[i,j-1]:=q;
- end;
- end;
- writeln('Полученный массив:');
- for i:=1 to n do
- begin
- for j:=1 to m do
- write(mas[i,j]:5);
- writeln;
- end;
- writeln;
- end.
Решение задачи: «Сдвиг элементов массива»
textual
Листинг программы
- uses crt;
- type matrix=array[1..10,1..10] of integer;
- procedure povor1(var a:matrix;n,k,p:integer);
- var i,j,m,b:integer;
- begin
- p:=p mod (3*n);
- i:=k;
- for m:=1 to p do
- begin
- b:= a[i,i];
- for j:=i to n-i do a[j,i]:= a[j+1,i];
- for j:=i to n-i do a[n-i+1,j]:= a[n-i+1,j+1];
- for j:=n-i downto i do a[j+1,n-i+1]:= a[j,n-i+1];
- for j:=n-i downto i+1 do a[i,j+1]:= a[i,j];
- a[i,i+1]:= b;
- end;
- end;
- procedure povor2(var a:matrix;n,k,p:integer);
- var i,j,m,b:integer;
- begin
- p:=abs(p) mod (3*n);
- i:=k;
- for m:=1 to p do
- begin
- b:= a[i,i];
- for j:=i to n-i do a[i,j]:= a[i,j+1];
- for j:=i to n-i do a[j,n-i+1]:= a[j+1,n-i+1];
- for j:=n-i+1 downto i+1 do a[n-i+1,j]:= a[n-i+1,j-1];
- for j:=n-i+1 downto i+2 do a[j,i]:= a[j-1,i];
- a[i+1,i]:= b;
- end;
- end;
- var a:matrix;
- n,i,j,k,p:integer;
- begin
- repeat
- write('Размер матрицы от 2 до 10 n=');
- readln(n);
- until n in [2..10];
- repeat
- write('Введите номер слоя от 1 до ',n div 2,' k=');
- readln(k);
- until k in [1..n div 2];
- write('Введите количество шагов + или - p=');
- readln(p);
- for i:=1 to n do
- begin
- for j:=1 to n do
- begin
- a[i,j]:=(i-1)*n+j;
- write(a[i,j]:3);
- end;
- writeln;
- end;
- writeln;
- if p>0 then povor1(a,n,k,p)
- else povor2(a,n,k,p);
- for i:=1 to n do
- begin
- for j:=1 to n do
- write(a[i,j]:3);
- writeln;
- end;
- end.
Объяснение кода листинга программы
- В начале кода объявляются необходимые переменные и создается массив
a
. - Затем пользователю предлагается ввести размер матрицы
n
и номер слояk
от 1 доn/2
. - Вводится количество шагов
p
. - Создается цикл
for
, который повторяется столько раз, сколько введено значенийn
иk
. - Внутри цикла вычисляется адрес ячейки массива
a[i,j]
для каждого элемента массива. - Выводится значение каждой ячейки массива.
- Если
p
больше нуля, то вызывается функцияpovor1
, иначе вызывается функцияpovor2
. - После завершения всех вычислений выводится окончательный результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д