Загрузка данных


{$mode objfpc}{$H+}
{$codepage UTF-8}
program ShapeCatalog;

uses
  {$ifdef unix}cwstring,{$endif}
  SysUtils,
  geometry,
  ConsoleUtils;

function ReadPositiveFloat(const Prompt: string; const NegativeErrorMsg: string): Double;
var
  S: string;
begin
  repeat
    Write(Prompt);
    ReadLn(S);
    if not TryStrToFloat(S, Result) then
      WriteLn('Ошибка: введите число.')
    else if Result <= 0 then
    begin
      WriteLn(NegativeErrorMsg);
      Result := -1;
    end;
  until Result > 0;
end;

procedure AddCircle(Catalog: TShapeCatalog);
var
  Name: string;
  Radius: Double;
begin
  Write('Название: ');
  ReadLn(Name);
  Radius := ReadPositiveFloat('Радиус: ', 'Ошибка: радиус должен быть положительным числом.');
  
  Catalog.Add(TCircle.Create(Name, Radius));
  WriteLn('Фигура добавлена.');
end;

procedure AddRectangle(Catalog: TShapeCatalog);
var
  Name: string;
  Width, Height: Double;
begin
  Write('Название: ');
  ReadLn(Name);
  Width := ReadPositiveFloat('Ширина: ', 'Ошибка: ширина должна быть положительным числом.');
  Height := ReadPositiveFloat('Высота: ', 'Ошибка: высота должна быть положительным числом.');
  
  Catalog.Add(TRectangle.Create(Name, Width, Height));
  WriteLn('Фигура добавлена.');
end;

procedure AddTriangle(Catalog: TShapeCatalog);
var
  Name: string;
  A, B: Double;
begin
  Write('Название: ');
  ReadLn(Name);
  A := ReadPositiveFloat('Катет A: ', 'Ошибка: катеты должны быть положительными числами.');
  B := ReadPositiveFloat('Катет B: ', 'Ошибка: катеты должны быть положительными числами.');
  
  Catalog.Add(TTriangle.Create(Name, A, B));
  WriteLn('Фигура добавлена.');
end;

var
  Catalog: TShapeCatalog;
  Choice: string;
  Running: Boolean;

begin
  HaltOnNotReleasedBlocks := False;

  Catalog := TShapeCatalog.Create;
  Running := True;

  repeat
    WriteLn;
    WriteLn('=== Каталог фигур ===');
    WriteLn('  1. Добавить круг');
    WriteLn('  2. Добавить прямоугольник');
    WriteLn('  3. Добавить треугольник');
    WriteLn('  4. Показать все фигуры');
    WriteLn('  5. Итоги');
    WriteLn('  0. Выход');
    Write('Ваш выбор: ');
    ReadLn(Choice);
    WriteLn;

    if Choice = '1' then
      AddCircle(Catalog)
    else if Choice = '2' then
      AddRectangle(Catalog)
    else if Choice = '3' then
      AddTriangle(Catalog)
    else if Choice = '4' then
    begin
      if Catalog.Count = 0 then
        WriteLn('Каталог пуст.')
      else
      begin
        WriteLn(Format('=== Фигуры в каталоге (%d) ===', [Catalog.Count]));
        Catalog.PrintAll;
      end;
    end
    else if Choice = '5' then
    begin
      if Catalog.Count = 0 then
        WriteLn('Каталог пуст.')
      else
      begin
        WriteLn('=== Итоги ===');
        WriteLn('  Фигур в каталоге: '.PadRightUTF8(24), Catalog.Count);
        WriteLn('  Суммарная площадь: '.PadRightUTF8(24), FormatFloat('0.00', Catalog.TotalArea));
        WriteLn('  Суммарный периметр: '.PadRightUTF8(24), FormatFloat('0.00', Catalog.TotalPerimeter));
      end;
    end
    else if Choice = '0' then
    begin
      WriteLn('До свидания!');
      Running := False;
    end
    else
      WriteLn('Ошибка: неверный пункт меню.');

  until not Running;

  FreeAndNil(Catalog);
end.