Сдвиг элементов массива - 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
. - После завершения всех вычислений выводится окончательный результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д