Результаты выполнения программы




Типовой расчет. Вариант 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.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: