|
Познающий
Регистрация: 02.09.2007
Сообщений: 67
С нами:
9836841
Репутация:
20
|
|
Матрицу K(m,n) заполнить слудующим образом. Элементам, находящимся на периферии (по периметру матрицы), присвоить значение периметру оставшейся матрицы - значение 2 и т.д. до заполнения матрицы.
Это как я понял должно быть что-то вроде:
0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 0
0 1 9 9 9 9 9 9 1 0
0 1 9 3 3 3 3 9 1 0
0 1 9 3 2 2 3 9 1 0
0 1 9 3 2 2 3 9 1 0
0 1 9 3 3 3 3 9 1 0
0 1 9 9 9 9 9 9 1 0
0 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0
Собственно, это сделал.
Дальше:
Рассматривая результат предыдущей задачи, как нумерацию слоев матрицы, сдвинуть элементы заданной матрицы в пределах каждого слоя на одну позицию по часовой стрелке.
То есть если было
10 0 0 0 0 0 0 0 0 0
10 2 1 1 1 1 1 1 1 0
10 1 3 9 9 9 9 9 1 0
10 1 9 4 3 3 3 9 1 0
10 1 9 3 5 2 3 9 1 0
10 1 9 3 2 2 3 9 1 0
10 1 9 3 3 3 3 9 1 0
10 1 9 9 9 9 9 9 1 0
10 1 1 1 1 1 1 1 1 0
10 0 0 0 0 0 0 0 0 0
Должно стать:
10 10 0 0 0 0 0 0 0 0
10 1 2 1 1 1 1 1 1 0
10 1 9 3 9 9 9 9 1 0
10 1 9 3 4 3 3 9 1 0
10 1 9 3 2 5 3 9 1 0
10 1 9 3 2 2 3 9 1 0
10 1 9 3 3 3 3 9 1 0
10 1 9 9 9 9 9 9 1 0
10 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0
Вот что получилось:
Код:
Program Neprogram;
type K=array [0..10,0..10] of integer;
Procedure zapolnenie(var x:K);
Var m,n,gran,znach,i:integer;
Begin
randomize;
gran:=0;
for i:=1 to 10 do
begin
znach:=trunc((10-1)*random+1);
gran:=gran+1;
for m:=1+gran to 10-gran do
for n:=1+gran to 10-gran do
x[m,n]:=znach;
end;
end;
Procedure povorot(var x:K); //процедура поворота
Var m,n,gran,i,buff,a:integer;
Begin
x[1,1]:=A; //Это чтоб проверить
x[2,1]:=A; поворачивает или нет.
x[3,1]:=A;
x[4,1]:=A;
x[5,1]:=A;
x[6,1]:=A;
x[7,1]:=A;
x[8,1]:=A;
x[9,1]:=A;
x[10,1]:=A;
gran:=0; //Изначально грань = 0
for i:=1 to 5 do //выполняем для x/2 слоев,
begin в нашем случае для 5
buff:=x[n+gran,m+gran]; //сохраняем верхнее левое значение
//считаем левую границу периферии
n:=1+gran;
for m:=1+gran to 9-gran do
x[m,n]:=x[m+1,n];
//нижнюю
m:=10-gran;
for n:=1+gran to 9-gran do
x[m,n]:=x[m,n+1];
//правую
n:=10-gran;
for m:=10-gran downto 2+gran do
x[m,n]:=x[m-1,n];
//верхнюю
m:=1+gran;
for n:=10-gran downto 3+gran do
x[m,n]:=x[m,n-1];
x[n+gran+1,m+gran]:=buff;//возвращаем утерянное значение
gran:=gran+1; //увеличиваем грань
end;
end;
Var x:K;
m,n:integer;
Begin
zapolnenie(x);
for m:=1 to 10 do
begin
writeln(' ');
for n:=1 to 10 do
write(x[m,n],' ');
end;
writeln(' ');
povorot(x);
writeln(' ');
for m:=1 to 10 do
begin
writeln(' ');
for n:=1 to 10 do
write(x[m,n],' ');
end;
writeln(' ');
end.
Пишет ошибку на 35 строке:
Код:
buff:=x[n+gran,m+gran];
Код:
»22098432 - выход за границы диапозона изменения индекса 0..10
Не могу сообразить почему :hmm:
|