Сдвиг элементов массива - 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.

Объяснение кода листинга программы

  1. В начале кода объявляются необходимые переменные и создается массив a.
  2. Затем пользователю предлагается ввести размер матрицы n и номер слоя k от 1 до n/2.
  3. Вводится количество шагов p.
  4. Создается цикл for, который повторяется столько раз, сколько введено значений n и k.
  5. Внутри цикла вычисляется адрес ячейки массива a[i,j] для каждого элемента массива.
  6. Выводится значение каждой ячейки массива.
  7. Если p больше нуля, то вызывается функция povor1, иначе вызывается функция povor2.
  8. После завершения всех вычислений выводится окончательный результат.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы