Преобразовать матрицу по правилу - QBasic

Формулировка задачи:

Дана квадратная матрица А(). Требуется преобразовать эту матрицу так, чтобы каждый ее элемент стал суммой окружающих этот элемент других элементов включая и сам элемент (максимум сумма 9-ти элементов, минимум сумма 4-ох элементов). Эта задача решена частично с привлечением дополнительной матрицы В(). Код программы прилагается. Можно ли решить эту задачу без дополнительной матрицы неизвестно? Были такие мысли 1. Хранить старый и новый элемент матрицы в виде дробного числа. Целая часть - исходное значение элемента матрицы, а дробная часть - новое значение матрицы. Но здесь есть свой подводный камень! Если новое число будет оканчиваться на 0, то мы потеряем этот Нуль. Бейсик его отбросит. 2. Теоретически можно ввести строковую матрицу или лучше просто строку, для хранения новых значений??? 3. Может все гораздо проще? Если элемент матрицы использован то его можно занять? Как?
CLS
RANDOMIZE TIMER
 
n = 7
DIM A(n + 1, n + 1) AS INTEGER
DIM B(1 TO n, 1 TO n) AS INTEGER
 
FOR i = 1 TO n
FOR j = 1 TO n
   A(i, j) = 9 * RND
   PRINT A(i, j);
NEXT j: PRINT
NEXT i: PRINT
 
FOR i = 1 TO n
FOR j = 1 TO n
   FOR k = -1 TO 1
   FOR l = -1 TO 1
      B(i, j) = B(i, j) + A(i + k, j + l)
   NEXT l, k
NEXT j, i
 
FOR i = 1 TO n
FOR j = 1 TO n
   PRINT B(i, j);
NEXT j: PRINT
NEXT i
END

Код к задаче: «Преобразовать матрицу по правилу - QBasic»

textual
const
  n = 7;
 
var
  a : array[0 .. n + 1, 0 .. n + 1] of integer;
 
procedure f(ix : integer; s : integer);
var k, l : integer;
begin
  if ix < sqr(n) then
  begin
    s := 0;
    for k := -1 to 1 do
      for l := -1 to 1 do s := s + a[succ(ix div n) + k, succ(ix mod n) + l];
    f(succ(ix), 0);
  end;
  a[succ(ix div n), succ(ix mod n)] := s;
end;
 
var
  i, j : integer;
 
begin
  randomize;
  writeln('A');
  for i := 1 to n do
  begin
    for j := 1 to n do
    begin
      a[i, j] := random(20);
      write(a[i, j]:4);
    end;
    writeln;
  end;
 
  f(0, 0);
  writeln('new A');
  for i := 1 to n do
  begin
    for j := 1 to n do
      write(a[i, j]:4);
    writeln;
  end;
 
end.

7   голосов, оценка 4.143 из 5


СОХРАНИТЬ ССЫЛКУ