Программа
PROGRAM Triangle;
USES CRT,Graph; { Подключение модулей }
CONST QuantityStatPoint=8; { Разбиение диапазона площадей }
FileName='TRIANGLE.DAT'; { Имя файла треугольников }
TYPE Point=record X,Y:real end; { Тип - точка }
TriangleType=record A,B,C:Point end; { Тип - треугольник }
StatisticsType=record { Тип - статистические данные }
MaxS:real; { Максимальная (по статистической шкале) площадь }
Probability:array[1..QuantityStatPoint] of word
{ Распределение вероятности }
end;
TriangleFileType=file of TriangleType; { Тип - файл треугольников }
VAR TriangleFile:TriangleFileType; { Файл треугольников }
Statistics:StatisticsType; { Статистические данные }
PROCEDURE Make(var TriangleFile:TriangleFileType);
{ Процедура создания файла треугольника }
Const k=100; { Коэффициент для иницииализации координат }
Var i:word; { Счетчик }
Buf:TriangleType; { Буферная переменная - треугольник }
Begin
Randomize; { Инициализация генератора случайных чисел }
Rewrite(TriangleFile); { Открытие файла под запись }
for i:=1 to Random(30)+20 do { Цикл создания файла треугольников }
begin
with Buf do
begin { Инициализация треугольника: }
A.X:=Random(k); A.Y:=Random(k);
B.X:=Random(k); B.Y:=Random(k);
C.X:=Random(k); C.Y:=Random(k)
end;
Write(TriangleFile,Buf) { Запись треугольника в файл }
end;
Close(TriangleFile) { Закрытие файла }
End;
PROCEDURE Process(var TriangleFile:TriangleFileType;
var Statistics:StatisticsType);
{ Процедура обработки файла треугольников }
Var i:word; { Счетчик }
Buf:TriangleType; { Буферная переменная - треугольник }
S:real; { Площадь }
Number:byte; { Номер элемента массива }
Function GetLength(A,B:Point):real;
{ Функция вычисления расстояния между точками }
begin
GetLength:=Sqrt(Sqr(A.X-B.X)+Sqr(A.Y-B.Y))
end;
Function GetArea(a,b,c:real):real; { Функция вычисления площади тоеугольника }
var p:real; { Полупериметр }
begin
p:=(a+b+c)/2; { Вычисление полупериметра }
GetArea:=Sqrt(p*(p-a)*(p-b)*(p-c)) { Вычисление площади треугольника }
end;
Function GetTypeTriangle(a,b,c:real;var S:real):string;
{ Функция определения типа треугольника }
var St:string; { Буферная переменная для набора строки }
CosAlpha,CosBeta,CosGama:real; { Косинусы углов треугольника }
ProductCos:real; { Произведение косинусов }
begin { GetTypeTriangle }
St:=''; { Сброс строки }
S:=GetArea(a,b,c); { Вычисление площади треугольника }
{ Определение типа треугольника по площади: }
if S=0
then GetTypeTriangle:='вырожденный'
else
begin
{ Определение типа треугольника по соотношению сторон: }
if (a=b)and(b=c)
then GetTypeTriangle:='равносторонний'
else begin
if (a=b)or(a=c)or(b=c) then St:='равнобедренный ';
CosAlpha:=(Sqr(b)+Sqr(c)-Sqr(a))/(2*b*c);
CosBeta :=(Sqr(a)+Sqr(c)-Sqr(b))/(2*a*c);
CosGama :=(Sqr(b)+Sqr(a)-Sqr(c))/(2*b*a);
ProductCos:=CosAlpha*CosBeta*CosGama;
{ Определение типа треугольника по типу углов: }
if ProductCos=0
then GetTypeTriangle:=St+'прямоугольный'
else if ProductCos<0
then GetTypeTriangle:=St+'тупоугольный'
else GetTypeTriangle:=St+'остроугольный'
end
end
end; { GetTypeTriangle }
Procedure Stop; { Процедура остановки программы }
var Ch:char; { Символьная переменная для сканирования клавиатуры }
begin
WriteLn; { Пропуск строки }
WriteLn('Нажмите клавишу');
Ch:=ReadKey; { Остановка до нажатия клавиши }
ClrScr { Очистка экрана }
end;
Begin { Process }
ClrScr; { Очистка экрана }
Statistics.MaxS:=0; { Сброс максимального значения площади }
for i:=1 to QuantityStatPoint do Statistics.Probability[i]:=0;
{ Обнуление массива }
i:=0; { Сброс счетчика }
{ Первичный просмотр файла для определения максимального значения площади: }
Reset(TriangleFile); { Открытие файла под чтение }
while not EOF(TriangleFile) do { Цикл просмотра файла }
begin
i:=i+1; { Подсчет числа треугольников }
Read(TriangleFile,Buf); { Чтение треугольника }
with Buf do
begin
WriteLn(i:4,' Треугльник ',GetTypeTriangle(GetLength(A,B),
GetLength(B,C),GetLength(C,A),S),' S=',S:0:2);
{ Определение и вывод типа треугольника }
if S>Statistics.MaxS then Statistics.MaxS:=S
{ Поиск макимальной площади треугольника }
end;
if i mod 20 =0 then Stop; { Остановка после вывода 20-ой строки }
end;
if i mod 20 <>0 then Stop;
{ Остановка после вывода последней строки, если она не 20-ая }
Close(TriangleFile); { Закрытие файла }
with Statistics do
begin { Приведение MaxS к числу кратному QuantityStatPoint: }
i:=0; { Сброс счетчика }
while MaxS>=100 do begin i:=i+1;MaxS:=MaxS/10 end;
{ Выделение двух первых разрядов }
MaxS:=Round(MaxS)+Ord(Frac(MaxS)>0); { Округление }
while Round(MaxS) mod QuantityStatPoint<>0 do MaxS:=MaxS+1;{ Приведение }
for i:=i downto 1 do MaxS:=MaxS*10 { Востановление порядка }
end;
{ Повторный просмотр файла для набора статистического распределения площадей: }
Reset(TriangleFile); { Открытие файла под чтение }
while not EOF(TriangleFile) do { Цикл просмотра файла }
begin
Read(TriangleFile,Buf); { Чтение треугольника }
with Statistics do
begin
S:=GetArea(GetLength(Buf.A,Buf.B),GetLength(Buf.B,Buf.C),GetLength(Buf.C,Buf.A));
{ Вычисление площади треугольника }
if S<>0 then { Набор статистики, если треугольник не вырожденный: }
begin
Number:=Trunc(S/MaxS*8)+1; { Вычисление номера ячейки
соответствующей данному треугольнику }
if Number>QuantityStatPoint then Number:=QuantityStatPoint;
{ Блокирование выхода за пределы массива }
Probability[Number]:=Probability[Number]+1 { Набор встречаемости }
end
end
end;
Close(TriangleFile); { Закрытие файла }
End; { Process }
PROCEDURE TriangleGraph(Statistics:StatisticsType);
{ Процедура вывода кистограммы }
Const PathToDriver=''; { Путь к графическому драйверу }
Var GraphDriver:integer; { Графический драйвер }
GraphMode:integer; { Графический режим }
i:byte; { Счетчик }
MaxHeight:word; { Максимальная высота столба (встречаемость площади) }
Ch:char; { Символьная переменная для чтения клавиатуры }
St:string; { Строка }
Begin
GraphDriver:=Detect; { Автоматическое оперделение драйвера }
GraphMode:=0; { Задание графического режима }
InitGraph(GraphDriver,GraphMode,PathToDriver); { Инициалиэация графики }
MaxHeight:=0; { Сброс максимальной встречаемости }
{ Поиск максимальной встречаемости: }
for i:=1 to QuantityStatPoint do { Цикл просмотра массива статистики }
if MaxHeight<Statistics.Probability[i] { Если новое значение больше максимального }
then MaxHeight:=Statistics.Probability[i]; { то переопределение макимального }
for i:=1 to QuantityStatPoint do { Цикл прорисовки кистограммы }
begin
SetFillStyle(i+1,White); { Установка заполнения фигур }
{ Прорисовка столбика диаграммы }
Bar3D(Round((i-0.3)*GetMaxX/(QuantityStatPoint+1)),
Round(GetMaxY-0.8*Statistics.Probability[i]/MaxHeight*GetMaxY),
Round((i+0.3)*GetMaxX/(QuantityStatPoint+1)),
Round(GetMaxY), Round(0.02*GetMaxX),true);
{ Преобразование количества треугольников и вывод строки: }
Str(Statistics.Probability[i],St);
OutTextXY(Round((i-0.3)*GetMaxX/(QuantityStatPoint+1)),
Round(GetMaxY-0.8*Statistics.Probability[i]/MaxHeight*GetMaxY-5.7*TextHeight(St)),
St);
{ Преобразование нижней границы данной плщади треугольников и вывод строки: }
Str(Round(Statistics.MaxS/8*(i-1)),St);
OutTextXY(Round((i-0.3)*GetMaxX/(QuantityStatPoint+1)),
Round(GetMaxY-0.8*Statistics.Probability[i]/MaxHeight*GetMaxY-4.2*TextHeight(St)),
St+'..');
{ Преобразование верхней границы данной плщади треугольников и вывод строки: }
Str(Round(Statistics.MaxS/8*i),St);
OutTextXY(Round((i-0.3)*GetMaxX/(QuantityStatPoint+1)),
Round(GetMaxY-0.8*Statistics.Probability[i]/MaxHeight*GetMaxY-2.7*TextHeight(St)),
'..'+St);
end;
Ch:=ReadKey; { Остановка программы }
CloseGraph { Закрытие графического режима }
End;
BEGIN
Assign(TriangleFile,FileName);
{ Связывание файловой переменной с именем файла }
Make(TriangleFile); { Создание файла треугольников }
Process(TriangleFile,Statistics);
{ Обработка файла треугольников и набор статистики }
TriangleGraph(Statistics) { Вывод кистограммы }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию