Программа заполнения матрицы по спирали

Программа демонстрирующая спиральный обход матрицы заполняя рядом чисел.
CONST N=19; { Размерность несущей матрицы }
TYPE Matrix=array[1..N,1..N] of integer; { Тип - матрица }
VAR A:Matrix;   { Несущая матрица }
    Height,Width:1..N; { Фактическая размерность матрицы }
PROCEDURE OutputMatrix(Height,Width:integer; A:Matrix);
                                                 { Процедура вывода матрицы }
  Var i,j:integer;   { Счетчики }
  Begin
    Write('┌');    { Вывод элемента рамки }
    for j:=1 to Width do Write('    '); { Вывод первой строки (пустой) }
    WriteLn('┐');  { Вывод элемента рамки }
    for i:=1 to Height do { Цикл вывода строк }
      begin
        Write('│'); { Вывод элемента рамки }
        for j:=1 to Width do Write(A[i,j]:3,' '); { Цикл вывода строки }
        WriteLn('│') { Вывод элемента рамки }
      end;
    Write('└');      { Вывод элемента рамки }
    for j:=1 to Width do Write('    '); { Вывод последней строки (пустой) }
    WriteLn('┘');    { Вывод элемента рамки }
  End;
FUNCTION GetFill(var Fill:integer):integer;
                         { Функция определения и переопределения заполнителя }
  Begin
    GetFill:=Fill; { Определение значения функции }
    Fill:=Fill+1   { Переопределение заполнителя }
  End;
PROCEDURE GetMatrix(Height,Width:integer; var A:Matrix);
                                            { Процедура определения матрицы }
  Var i:integer;  { Счетчик }
      Fill:integer;  { Заполнитель }
      Left,Right,Lo,Hi:integer;
      { Границы сегмента спирали (левая, правая, нижняя, верхняя) }
  Begin
    { Начальное определение границ: }
    Left:=1;  Right:=Width;
    Lo:=1;    Hi:=Height;
    Fill:=1; { Начальное определение заполнителя }
    while (Right>=Left)or(Hi>=Lo) do { Цикл заполнения матрицы (по виткам) }
      begin
        if Hi>=Lo then
        begin  { Заполнение верхнего сегмента витка }
          for i:=Left to Right do A[Lo,i]:=GetFill(Fill);
          Lo:=Lo+1 { Переопределение границы }
        end;
        if Right>=Left then
        begin  { Заполнение правого сегмента витка }
          for i:=Lo to Hi do A[i,Right]:=GetFill(Fill);
          Right:=Right-1  { Переопределение границы }
        end;
        if Hi>=Lo then
        begin  { Заполнение нижнего сегмента витка }
          for i:=Right downto Left do A[Hi,i]:=GetFill(Fill);
          Hi:=Hi-1    { Переопределение границы }
        end;
        if Right>=Left then
        begin  { Заполнение левого сегмента витка }
          for i:=Hi downto Lo do A[i,Left]:=GetFill(Fill);
          Left:=Left+1 { Переопределение границы }
        end
      end
  End;
BEGIN
  WriteLn;  { Пропуск строки }
  Randomize;
  Height:=Random(N)+1;
  Width:=Random(N)+1;
  GetMatrix(Height,Width,A);  { Получение матрицы }
  OutputMatrix(Height,Width,A);  { Вывод матрицы }
END.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию