object CircleCalculator {
/**
* Case class to hold the calculated geometric metrics of a circle immutably.
*/
case class CircleMetrics(
diameter: Double,
circumference: Double,
area: Double
)
/**
* Calculates the diameter, circumference, and area of a circle.
*
* @param radius The radius of the circle (must be non-negative).
* @return A CircleMetrics instance containing the calculated results.
* @throws IllegalArgumentException if the radius is negative.
*/
def calculateCircleMetrics(radius: Double): CircleMetrics = {
// Guard clause: radius cannot be negative using Scala's built-in require() function
require(radius >= 0.0, "Radius cannot be negative.")
val diameter = 2.0 * radius
val circumference = 2.0 * math.Pi * radius
// Standard multiplication (radius * radius) is more efficient than math.pow(radius, 2)
val area = math.Pi * (radius * radius)
CircleMetrics(diameter, circumference, area)
}
def main(args: Array[String]): Unit = {
try {
val radius = 3.0
// Retrieve calculated metrics
val metrics = calculateCircleMetrics(radius)
// Output results formatted to 2 decimal places using string interpolation (f-interpolator)
println(f"Radius: $radius%.2f")
println(f"Diameter: ${metrics.diameter}%.2f")
println(f"Circumference: ${metrics.circumference}%.2f")
println(f"Area: ${metrics.area}%.2f")
}
catch {
case e: IllegalArgumentException =>
println(s"Error: ${e.getMessage}")
}
}
}
/*
run:
Radius: 3.00
Diameter: 6.00
Circumference: 18.85
Area: 28.27
*/