Программа
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.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию