Paster Fob писал(а):Зацените.
В целом неплохо, по крайней мере, работает
Несколько замечаний и советов по мелочи.
1. Мне больше нравится, когда глобальные имена (процедуры, переменные) начинаются с большой буквы. А то, что составлено из нескольких слов, тоже выделяется: "AngleMax" вместо "anglemax". Компилятору всё равно, но так легче читается.
2. Это объявление:
function anglemax(var max:byte; const amax:byte):boolean ;можно заменить таким:
function anglemax(var max:byte; amax:byte):boolean ;Дело в том, что параметры по ссылкам VAR и CONST -- это на самом деле указатели, хоть и неявные. Доступ к параметрам через указатели всегда немного медленней, чем напрямую. И код немного длиннее. Мелочь, но на будущее знайте.
Paster Fob писал(а):Сравнил,в вашем варианте мне не нравится то,что углы ограды пустые.
Да, точно, есть небольшие дыры, где худой котяра пролезет. Их можно заткнуть, удлинив верх и низ:
- Код: Выделить всё
{ Задача 49-Г -- Садовая ограда }
const CX=60; CY=20; { ширина и высота поля }
type TField = array [1..CX, 1..CY] of Char;
var Field : TField;
{ Посадка деревьев }
procedure MakeGarden(N: integer);
var i, x, y: integer;
begin
FillChar(Field, SizeOf(Field),'.');
for i:=1 to N do begin
x:= 1 + Random(CX);
y:= 1 + Random(CY);
Field[x,y]:= '*';
end;
end;
{ Показ поля }
procedure ExpoGarden;
var x, y: integer;
begin
for y:=1 to CY do begin
for x:=1 to CX do Write(Field[x,y]);
Writeln;
end;
end;
{ Исследование сада }
procedure ScanGarden(var Xmin, Ymin, Xmax, Ymax : integer);
var x, y: integer;
begin
Xmin:= CX+1; Ymin:= CY+1;
Xmax:= 0; Ymax:= 0;
for x:=1 to CX do
for y:=1 to CY do
if Field[x,y]='*' then begin
if XMin>x then XMin:=x;
if YMin>y then YMin:=y;
if XMax<x then XMax:=x;
if YMax<y then YMax:=y;
end;
end;
{ Постройка ограды }
procedure MakeRail(Xmin, Ymin, Xmax, Ymax : integer);
const CRail='#';
var x, y: integer;
begin
{ сверху }
if YMin>1 then for x:=XMin-Ord(XMin>1) to XMax+Ord(XMax<CX)
do Field[x,Ymin-1]:= CRail;
{ снизу }
if YMax<CY then for x:=XMin-Ord(XMin>1) to XMax+Ord(XMax<CX)
do Field[x,Ymax+1]:= CRail;
{ слева }
if XMin>1 then for y:=YMin to YMax
do Field[XMin-1,y]:= CRail;
{ справа }
if XMax<CX then for y:=YMin to YMax
do Field[XMax+1,y]:= CRail;
end;
var Xmin, Ymin, Xmax, Ymax : integer; { координаты углов ограды }
begin
Randomize;
MakeGarden(8);
ScanGarden(Xmin, Ymin, Xmax, Ymax);
ExpoGarden;
Readln;
MakeRail(Xmin, Ymin, Xmax, Ymax);
ExpoGarden;
Readln;
end.
);