#include <iostream>
#include <cmath>
#include <numbers> // C++20 standard library for mathematical constants
#include <stdexcept>
// Structure to hold all calculated circle metrics cleanly
struct CircleMetrics {
double diameter;
double circumference;
double area;
};
/**
* @brief Calculates the diameter, circumference, and area of a circle.
* @param radius The radius of the circle (must be non-negative).
* @return CircleMetrics containing the diameter, circumference, and area.
* @throws std::invalid_argument if the radius is negative.
*/
[[nodiscard]] constexpr CircleMetrics CalculateCircleMetrics(double radius) {
// Guard clause: radius cannot be negative
if (radius < 0.0) {
throw std::invalid_argument("Radius cannot be negative.");
}
CircleMetrics metrics;
metrics.diameter = 2.0 * radius;
metrics.circumference = 2.0 * std::numbers::pi * radius;
// Standard multiplication (radius * radius) is more efficient than std::pow(radius, 2)
metrics.area = std::numbers::pi * (radius * radius);
return metrics;
}
int main() {
// Enable standard I/O optimization
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
try {
double radius = 3.0;
// Retrieve calculated metrics
CircleMetrics metrics = CalculateCircleMetrics(radius);
// Output results
std::cout << "Radius: " << radius << "\n";
std::cout << "Diameter: " << metrics.diameter << "\n";
std::cout << "Circumference: " << metrics.circumference << "\n";
std::cout << "Area: " << metrics.area << "\n";
}
catch (const std::exception& ex) {
std::cerr << "Error: " << ex.what() << "\n";
return 1;
}
}
/*
run:
Radius: 3
Diameter: 6
Circumference: 18.8496
Area: 28.2743
*/