program CircleCalculator;
{$mode objfpc}{$H+}
uses
SysUtils;
type
// Record to hold all calculated circle metrics cleanly
TCircleMetrics = record
Diameter: Double;
Circumference: Double;
Area: Double;
end;
{**
* Calculates the diameter, circumference, and area of a circle.
* @param Radius The radius of the circle (must be non-negative).
* @return TCircleMetrics containing the diameter, circumference, and area.
* @raises EArgumentException if the radius is negative.
*}
function CalculateCircleMetrics(Radius: Double): TCircleMetrics;
begin
// Guard clause: radius cannot be negative
if Radius < 0.0 then
raise EArgumentException.Create('Radius cannot be negative.');
Result.Diameter := 2.0 * Radius;
Result.Circumference := 2.0 * Pi * Radius;
// Standard multiplication (Radius * Radius) is more efficient than Power()
Result.Area := Pi * (Radius * Radius);
end;
var
Radius: Double;
Metrics: TCircleMetrics;
begin
Radius := 3.0;
try
// Retrieve calculated metrics
Metrics := CalculateCircleMetrics(Radius);
// Output results formatted to 2 decimal places using SysUtils.Format
Writeln(Format('Radius: %.2f', [Radius]));
Writeln(Format('Diameter: %.2f', [Metrics.Diameter]));
Writeln(Format('Circumference: %.2f', [Metrics.Circumference]));
Writeln(Format('Area: %.2f', [Metrics.Area]));
except
on E: Exception do
begin
Writeln('Error: ', E.Message);
Halt(1);
end;
end;
end.
(*
run:
Radius: 3.00
Diameter: 6.00
Circumference: 18.85
Area: 28.27
*)