n : word; {Кол-во точек для проверки}
i : byte; {параметр цикла}
ch : char;
size : longint;
{ ------------------------------------------------------------ }
Procedure FrazaReadError(k:integer);
{ Сообщение о неправильном формате вводимого числа с подачей }
{ звукового сигнала }
Begin
If k<>0 then
Begin
Writeln(#7'Неправильный формат числа');
Writeln('Повторите ввод');
End;
End { FrazaReadError };
{ ------------------------------------------------------------ }
Procedure ReadInt(Var Number:integer);
{ Ввод с клавиатуры и проверка формата переменной типа integer }
Var k : integer;
Begin
Repeat
{$I-} Read(Number); {$I+}
k:=IOResult;
FrazaReadError(k);
Until k=0;
End { ReadInt };
{ ------------------------------------------------------------ }
Procedure ReadWord(Var Number:word);
{ Ввод с клавиатуры и проверка формата переменной типа word}
Var k : word;
Begin
Repeat
{$I-} Read(Number); {$I+}
k:=IOResult;
FrazaReadError(k);
Until k=0;
End { ReadWord };
{ ------------------------------------------------------------ }
Procedure PrintInData;
Var i : byte;
Begin
Writeln(' Исходные данные');
Writeln('Точки на плоскости:');
For i:=1 to n do
Begin
Write(i,':','(',PointAr[i].x,':',PointAr[i].y,')','; ');
End;
Writeln;
Writeln('Коэффициенты прямой:');
Writeln('a=',a);
Writeln('b=',b);
Writeln('c=',c);
End {PrintInData};
{ ------------------------------------------------------------ }
Procedure PrintHead;
Begin
ClrScr;
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒ Лабораторная работа №2 ▒');
Writeln('▒ студента гр. ▒');
Writeln('▒ ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒ Условие задачи по аналитической геометрии: ▒');
Writeln('▒ Найти минимальное и максимальное расстояние▒');
Writeln('▒ от точек до прямой на плоскости. ▒');
Writeln('▒ ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
End { ReadInt };
{ ------------------------------------------------------------ }
Function CalcDist(Var a,b,c,x,y:integer):real;
Begin
CalcDist:=abs(a*X+b*Y+c)/sqrt(a*a+b*b);
End {CalcDist};
{ ------------------------------------------------------------ }
Begin
PrintHead;
Writeln('Откуда произвести ввод исходных данных?');
Writeln('f - файл, k-клавиатура');
Repeat
ch:=ReadKey;
Until ((ch='k') or (ch='f'));
if (ch='k') then
Begin
Writeln('Набор параметров завершайте нажатием клавиши Enter');
Write('Введите количество точек:'); ReadWord(n);
For i:=1 to n do
Begin
Writeln('Введите кординаты ',i,' точка.');
Write('x='); ReadInt(PointAr[i].x);
Write('y='); ReadInt(PointAr[i].y);
End;
Writeln('Введите коэффициенты прямой:');
Write('a='); ReadInt(a);
Write('b='); ReadInt(b);
Write('c='); ReadInt(c);
PrintHead;
PrintInData;
Writeln('Записать введённые данные в файлы входных данных?');
Writeln('(y - Да, n - Нет)');
Repeat
ch:=ReadKey;
Until ((ch='y') or (ch='n'));
if (ch='y') then
Begin
Assign(PointFile,'point.dat'); Rewrite(PointFile);
Assign(LineFile,'line.dat'); Rewrite(LineFile);
For i:=1 to n do
Write(PointFile,PointAr[i]);
Writeln('Файл point.dat перезаписан!!! Текущий размер ',size,' компонент.');
Write(LineFile,a);
Write(LineFile,b);
Write(LineFile,c);
Writeln('Файл line.dat перезаписан!!!');
Close(PointFile); Close(LineFile);
End;
End
else
Begin
Assign(PointFile,'point.dat'); Reset(PointFile);
Assign(LineFile,'line.dat'); Reset(LineFile);
size:=FileSize(PointFile);
n:=size;
For i:=1 to n do
Read(PointFile,PointAr[i]);
Read(LineFile,a);
Read(LineFile,b);
Read(LineFile,c);
Close(PointFile); Close(LineFile);
Writeln('Данные из входных файлов загружены!!!');
PrintInData;
End;
{Уствновка начальных значений переменных}
Xmin:=PointAr[1].x;
Xmax:=PointAr[1].x;
Ymin:=PointAr[1].y;
Ymax:=PointAr[1].y;
Dmin:=CalcDist(a,b,c,PointAr[1].x,PointAr[1].y);
Dmax:=Dmin;
{Цикл вычисления}
For i:=2 to n do
Begin
D:=CalcDist(a,b,c,PointAr[i].x,PointAr[i].y);
if D>Dmax then
Begin
Xmax:=PointAr[i].x;
Ymax:=PointAr[i].y;
Dmax:=D
End
Else
Begin
if D<Dmin then
Begin
Xmin:=PointAr[i].x;
Ymin:=PointAr[i].y;
Dmin:=D
End
End
End;
Writeln('Минимальное расстояние до точки (',Xmin,';',Ymin,') Dmin=',Dmin:8:5);
Writeln('Максимальное расстояние до точки (',Xmax,';',Ymax,') Dmax=',Dmax:8:5);
Assign(ResultFile,'result.txt');
Rewrite(ResultFile);
Writeln(ResultFile,'Минимальное расстояние до точки (',Xmin,';',Ymin,') Dmin=',Dmin:8:5);
Write(ResultFile,'Максимальное расстояние до точки (',Xmax,';',Ymax,') Dmax=',Dmax:8:5);
Close(ResultFile);
Readln;
End.
Экранные формы: