Программа


PROGRAM Spiral(input,output);
CONST N=19; { Размерность несущей матрицы }
TYPE Matrix=array[1..N,1..N] of integer; { Тип - матрица }
VAR A:Matrix;   { Несущая матрица }
    M:1..N; { Фактическая размерность матрицы }
PROCEDURE OutputMatrix(M:integer; A:Matrix);
                                                 { Процедура вывода матрицы }
  Var i,j:integer;   { Счетчики }
  Begin
    for i:=1 to M do { Цикл вывода строк }
    begin
      for j:=1 to M do Write(A[i,j]:3,' '); { Цикл вывода строки }
      WriteLn { Вывод конца строки }
    end
  End;
FUNCTION GetFill(var Fill:integer):integer;
                         { Функция определения и переопределения заполнителя }
  Begin
    GetFill:=Fill; { Определение значения функции }
    Fill:=Fill+1   { Переопределение заполнителя }
  End;
PROCEDURE GetMatrix(M:integer; var A:Matrix);
                                            { Процедура определения матрицы }
  Var i:integer;  { Счетчик }
      Fill:integer;  { Заполнитель }
      Left,Right,Lo,Hi:integer;
      { Границы сегмента спирали (левая, правая, нижняя, верхняя) }
  Begin
    { Начальное определение границ: }
    Left:=1;  Right:=M;
    Lo:=1;    Hi:=M;
    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;  { Пропуск строки }
  Write('Введите размерность матрицы '); { Вывод подсказки }
  ReadLn(M);  { Ввод размерности матрицы }
  GetMatrix(M,A);  { Получение матрицы }
  OutputMatrix(M,A);  { Вывод матрицы }
END.

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