Показать сообщение отдельно

  #1914  
Старый 23.11.2009, 14:24
Syntaxys
Познающий
Регистрация: 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:
 
Ответить с цитированием