Типовой расчет. Вариант 1.
Консольное приложение без классов.
Дано множество треугольников. Вывести номера прямоугольных треугольников, в которых ближе всего к началу координат вершина с прямым углом.
Состав данных
Имя | Смысл | Тип | Структура |
Исходные данные | |||
n | число треугольников | целый | простая переменная |
X | абсциссы вершин | вещественный | двумерный динамический массив n x 3 |
Y | ординаты вершин | вещественный | двумерный динамический массив n x 3 |
Выходные данные | |||
i | Номера треугольников, удовлетворяющих условию | целый | простая переменная |
k | Количество найденных треугольников | целый | простая переменная |
Промежуточные данные | |||
i | Параметр цикла | целый | простая переменная |
j | Параметр цикла | целый | простая переменная |
a | Сторона треугольника | вещественный | простая переменная |
b | Сторона треугольника | вещественный | простая переменная |
c | Сторона треугольника | вещественный | простая переменная |
Метод решения.
Рис. 1
Точка B имеет координаты (X[1,i],Y[1,i]).
Точка C имеет координаты (X[2,i],Y[2,i]).
Точка A имеет координаты (X[3,i],Y[3,i]).
Стороны треугольника определяются по формулам:
a:=sqr(x[1,i]-x[2,i])+sqr(Y[1,i]-Y[2,i]);
b:=sqr(x[2,i]-x[3,i])+sqr(Y[2,i]-Y[3,i]);
c:=sqr(x[1,i]-x[3,i])+sqr(Y[1,i]-Y[3,i]).
Расстояния от точки начала координат до вершин определяются по формулам:
- OA2 =sqr(x[3,i])+sqr(Y[3,i]
- OC2 =sqr(x[2,i])+sqr(Y[2,i]
- OB2 =sqr(x[1,i])+sqr(Y[1,i]
Нужно проверить, является ли вершина с прямым углом самой близкой к началу координат по сравнению с другими вершинами. При этом можно сравнивать не расстояния, а квадраты расстояний.
Если a является гипотенузой прямоугольного треугольника, то справедливо равенство a = b + c. Поскольку a, b, c – вещественные числа, то сравнивать на равенство невозможно, нужно проверять условие:
abs(a – (b + c))<=0.0001. Если это условие выполняется, то точка A с координатами (X[3,i],Y[3,i]) является вершиной прямого угла, нужно проверить удовлетворяет ли она заданному условию, т.е.
((sqr(x[3,i])+sqr(Y[3,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
and
((sqr(x[3,i])+sqr(Y[3,i]))<(sqr(X[2,i])+sqr(Y[2,i]))).
Аналогично проверяются стороны b и c треугольника.
Если b является гипотенузой прямоугольного треугольника, то справедливо равенство b = a + c. Поскольку a, b, c – вещественные числа, то сравнивать на равенство невозможно, нужно проверять условие:
abs(b – (a + c))<=0.0001. Если это условие выполняется, то точка B с координатами (X[1,i],Y[1,i]) является вершиной прямого угла, нужно проверить удовлетворяет ли она заданному условию, т.е.
((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[2,i])+sqr(Y[2,i])))
and
((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[3,i])+sqr(Y[3,i]))).
Если c является гипотенузой прямоугольного треугольника, то справедливо равенство c = a + b. Поскольку a, b, c – вещественные числа, то сравнивать на равенство невозможно, нужно проверять условие:
abs(c – (a + b))<=0.0001. Если это условие выполняется, то точка C с координатами (X[2,i],Y[2,i]) является вершиной прямого угла, нужно проверить удовлетворяет ли она заданному условию, т.е.
((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
and ((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[3,i])+sqr(Y[3,i]))).
Если ни одно из равенств
a = b + c, b = a + c, c = a + b не выполняется, то треугольник не является прямоугольным.
Блок – схема данного алгоритма показана на рис. 2.
Рис. 2
Текст программы
// здесь используются статические массивы
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var n: integer;
i,j, k, i1, i2, i3: integer;
X, Y: array [1..3,1..20] of real;
a,b,c: real;
fp: textfile; filename: string;
begin
{ TODO -oUser -cConsole Main: Insert code here }
writeln('Input filename '); readln(filename);
AssignFile(fp, filename);
{$I-} ReSet(fp); {$I+}
If IOResult<>0 then begin
Writeln('file is not found!'); readln;
end
else begin
readln(fp, n);
writeln('n: ',n);
writeln('massiv koordinat');
for j:=1 to n do
// ввод координат вершин очередного треугольника
begin writeln('treugolnik ',j);
for i:=1 to 3 do begin
readln(fp, X[i,j],Y[i,j]);
writeln('vershina ', i,' ',X[i,j]:6:2,' ',Y[i,j]:6:2);
end;
end;
// поиск и проверка прямоугольных треугольников
k:=0;
writeln('*** naidennie treugolniki');
for i:=1 to n do begin
a:=sqr(x[1,i]-x[2,i])+sqr(Y[1,i]-Y[2,i]);
b:=sqr(x[2,i]-x[3,i])+sqr(Y[2,i]-Y[3,i]);
c:=sqr(x[1,i]-x[3,i])+sqr(Y[1,i]-Y[3,i]);
if (sqrt(a)+sqrt(b)>sqrt(c)) and
(sqrt(a)+sqrt(c)>sqrt(b)) and
(sqrt(b)+sqrt(c)>sqrt(a)) then begin
// треугольник существует
if abs(a-(b+c))<=0.001 then // a - гипотенуза
if ((sqr(x[3,i])+sqr(Y[3,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
and
((sqr(x[3,i])+sqr(Y[3,i]))<(sqr(X[2,i])+sqr(Y[2,i])))
then begin writeln('*** ',i); k:= k+1; end;
if (abs(b-(a+c))<=0.001) then // b - гипотенуза
if ((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[2,i])+sqr(Y[2,i])))
and
((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[3,i])+sqr(Y[3,i])))
then begin writeln('*** ',i); k:=k+1; end;
if (abs(c-(a+b))<=0.001) then // с - гипотенуза
if ((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
and ((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[3,i])+sqr(Y[3,i])))
then begin writeln('*** ',i); k:=k+1 end;
end
end;
writeln('chislo treugolnikov = ',k); closefile(fp); end;
readln;
end.
Результаты выполнения программы
Тест1. Исходный файл
2 2
2 5
4 2
6 2
9 4
11 2
-1 4
-1 8
-6 4
7 5
7 9
3 9
Экран приложения
Тест2. Исходный файл
5
1 -2
5 -2
3 -4
2 2
2 5
4 2
6 2
9 4
11 2
-1 4
-1 8
-6 4
7 5
7 9
3 9
Экран приложения
Текст программы
// здесь используются динамические массивы
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var n: integer;
i,j, k, i1, i2, i3: integer;
X, Y: array of array of real;
a,b,c: real;
fp: textfile; filename: string;
begin
{ TODO -oUser -cConsole Main: Insert code here }
writeln('Input filename '); readln(filename);
AssignFile(fp, filename);
{$I-} ReSet(fp); {$I+}
If IOResult<>0 then begin
Writeln('file is not found!'); readln;
end
else begin
readln(fp, n);
writeln('n: ',n);
// размещение массива X
SetLength(X,3);
for i:=0 to 2 do
SetLength(X[i],n);
// размещение массива Y
SetLength(Y,3);
for i:=0 to 2 do
SetLength(Y[i],n);
// ввод данных
// элементы динамических массивов нумеруются с нуля
writeln('massiv koordinat');
for j:=0 to n-1 do
begin writeln('treugolnik ',j+1);
for i:=0 to 2 do begin
readln(fp, X[i,j],Y[i,j]);
writeln('vershina ', i+1,' ',X[i,j]:6:2,' ',Y[i,j]:6:2);
end;
end;
// поиск и проверка прямоугольных треугольников
k:=0;
writeln('*** naidennie treugolniki');
for i:=0 to n-1 do begin
a:=sqr(x[0,i]-x[1,i])+sqr(Y[0,i]-Y[1,i]);
b:=sqr(x[1,i]-x[2,i])+sqr(Y[1,i]-Y[2,i]);
c:=sqr(x[0,i]-x[2,i])+sqr(Y[0,i]-Y[2,i]);
if (sqrt(a)+sqrt(b)>sqrt(c)) and
(sqrt(a)+sqrt(c)>sqrt(b)) and
(sqrt(b)+sqrt(c)>sqrt(a)) then begin
// треугольник существует
if abs(a-(b+c))<=0.001 then
if ((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[0,i])+sqr(Y[0,i])))
and
((sqr(x[2,i])+sqr(Y[2,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
then begin writeln('*** ',i+1); k:= k+1; end;
if (abs(b-(a+c))<=0.001) then
if ((sqr(x[0,i])+sqr(Y[0,i]))<(sqr(X[1,i])+sqr(Y[1,i])))
and
((sqr(x[0,i])+sqr(Y[0,i]))<(sqr(X[2,i])+sqr(Y[2,i])))
then begin writeln('*** ',i+1); k:=k+1; end;
if (abs(c-(a+b))<=0.001) then
if ((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[0,i])+sqr(Y[0,i])))
and ((sqr(x[1,i])+sqr(Y[1,i]))<(sqr(X[2,i])+sqr(Y[2,i])))
then begin writeln('*** ',i+1); k:=k+1 end;
end
end;
writeln('chislo treugolnikov = ',k); closefile(fp); end;
readln;
end.