{$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.
Для работы сайта, анализа посещаемости и показа рекламы мы используем файлы-идентификаторы (cookie), Яндекс.Метрику, Рейтинг@Mail.ru и Рекламную сеть Яндекса.
Нажимая «Принять», вы соглашаетесь с Политикой конфиденциальности.