Программа


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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию