// PascalABC.NET 3.0, сборка 1076 type Point=record x,y:real end; Line=record A,B:Point end; Triangle=record A,B,C:Point; sa,sb,sc:real; { длины сторон } end;
procedure GetPoint(PointName:char; var M:Point); begin Write('Введите координаты точки ',PointName,'(x,y): '); Read(M.x,M.y) end;
function LineLength(A,B:Point):real; begin LineLength:=sqrt(sqr(B.x-A.x)+sqr(B.y-A.y)) end;
procedure CreateTriangle(var T:Triangle; var l:boolean); begin With T do begin GetPoint('A',A); GetPoint('B',B); GetPoint('C',C); sa:=LineLength(B,C); sb:=LineLength(A,C); sc:=LineLength(A,B); l:=(sa+sb>sc) and (sa+sc>sb) and (sb+sc>sa) end end;
function TriangleIsLikes(T1,T2:Triangle):boolean; var k1,k2,k3:real; begin k1:=T1.sa/T2.sa; k2:=T1.sb/T2.sb; if k1=k2 then begin k3:=T1.sc/T2.sc; TriangleIsLikes:=k1=k3 end else TriangleIsLikes:=False end;
var T1,T2:Triangle; legal:boolean; begin Writeln('*** Первый треугольник ***'); CreateTriangle(T1,legal); if legal then begin Writeln('*** Второй треугольник ***'); CreateTriangle(T2,legal); if legal then if TriangleIsLikes(T1,T2) then Writeln('Треугольники подобны') else Writeln('Треугольники не подобны') else Writeln('Треугольник невозможно построить') end else Writeln('Треугольник невозможно построить') end.
/*задача дурацкая для n > 3, ибо не понятно, что делать: 1) разбить все столбцы на группы одинаковых столбцов и посчитать внутри них число пар. Затем суммировать. 2) разбить столбцы на группы одинаковых столбцов и суммировать количество элементов в каждой из групп, если оно больше 1. То есть найти количество столбцов, для которых среди других столбцов найдется хотя бы один идентичный ему 3) разбить столбцы на группы одинаковых столбцов и вывести количество элементов в каждой группе, если оно больше 1. Для n=3 дело проще, потому что таких групп максимум одна, поэтому тут, по сути, неоднозначности не возникает (за исключением того, что в первом пункте...) В общем, решил делать как во втором пункте. ответ в любом случае будет верным.*/ #include <iostream> using namespace std; int n, result = 0; int **ar;//указатель на указатель для создания динамического двумерного массива bool *Flag;//указатель на первый элемент массива флагов void create(int n)//создание динамического массива { ar = new int*[n]; for (int i = 0; i < n; i++) ar[i] = new int[n]; Flag = new bool[n]; for (int i = 0; i < n; i++) Flag[i] = false; } void inp(int n) //ввод элементов массива { cout << "Input rows of matrix:\n"; for (int i = 0; i < n; i++) { cout << i + 1 << ": "; for (int j = 0; j < n; j++) cin >> ar[i][j]; } } void outp(int n) //вывод элементов массива { cout << "Elements of matrix:\n"; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << ar[i][j] << " "; cout << endl; } } bool isEqual(int n, int j1, int j2)//проверка на равенство столбцов { bool res = true; for (int i = 0; i < n; i++) { if (ar[i][j1] != ar[i][j2]) { res = false; break; } } if (res)//если столбцы равны Flag[j2] = true; /*отмечаем столбец как просмотренный, чтобы в следующий раз его не сравнивать с другими столбцами*/ return res; } void calculate(int n)//считаем количество совпадающих столбцов { int k = 1; for (int j1 = 0; j1 < n; j1++) if (!Flag[j1]) { k = 1; for (int j2 = j1 + 1; j2 < n; j2++) if (!Flag[j2] && isEqual(n, j1, j2)) k++; if (k > 1)//имеется k одинаковых стобцов по типу столбца j1 result += k;//плюсует к итоговому результату } } int main(){ cout << "Input n: "; cin >> n; create(n); inp(n);//ввод массива outp(n);//вывод массива calculate(n);//расчет того, что требуется if (result > 0)/*количество столбцов, которые совпадают, по крайней мере, с одним из других столбцов*/ cout << "The number of columns, coinciding with at least one other column, is " << result << endl; else //все столбцы разные cout << "There is no matching columns\n"; return 0; }
type
Point=record
x,y:real
end;
Line=record
A,B:Point
end;
Triangle=record
A,B,C:Point;
sa,sb,sc:real; { длины сторон }
end;
procedure GetPoint(PointName:char; var M:Point);
begin
Write('Введите координаты точки ',PointName,'(x,y): ');
Read(M.x,M.y)
end;
function LineLength(A,B:Point):real;
begin
LineLength:=sqrt(sqr(B.x-A.x)+sqr(B.y-A.y))
end;
procedure CreateTriangle(var T:Triangle; var l:boolean);
begin
With T do begin
GetPoint('A',A);
GetPoint('B',B);
GetPoint('C',C);
sa:=LineLength(B,C);
sb:=LineLength(A,C);
sc:=LineLength(A,B);
l:=(sa+sb>sc) and (sa+sc>sb) and (sb+sc>sa)
end
end;
function TriangleIsLikes(T1,T2:Triangle):boolean;
var
k1,k2,k3:real;
begin
k1:=T1.sa/T2.sa; k2:=T1.sb/T2.sb;
if k1=k2 then begin
k3:=T1.sc/T2.sc;
TriangleIsLikes:=k1=k3
end
else
TriangleIsLikes:=False
end;
var
T1,T2:Triangle;
legal:boolean;
begin
Writeln('*** Первый треугольник ***');
CreateTriangle(T1,legal);
if legal then begin
Writeln('*** Второй треугольник ***');
CreateTriangle(T2,legal);
if legal then
if TriangleIsLikes(T1,T2) then Writeln('Треугольники подобны')
else Writeln('Треугольники не подобны')
else Writeln('Треугольник невозможно построить')
end
else Writeln('Треугольник невозможно построить')
end.