enum Shape {
Circle(f64), // 반지름
Rectangle(f64, f64), // 가로, 세로
Triangle(f64, f64, f64), // 세 변의 길이
}
// 넓이를 계산하는 함수
fn area(shape: &Shape) -> f64 {
match shape {
Shape::Circle(r) => 3.14 * r * r,
Shape::Rectangle(w, h) => w * h,
Shape::Triangle(a, b, c) => {
// 삼각형의 넓이 공식
let s = (a + b + c) / 2.0;
let area = s * (s - a) * (s - b) * (s - c);
// 넓이가 음수면 에러 발생
if area < 0.0 {
panic!("Invalid triangle");
} else {
area.sqrt()
}
}
}
}
// 둘레를 계산하는 함수
fn perimeter(shape: &Shape) -> f64 {
match shape {
Shape::Circle(r) => 2.0 * 3.14 * r,
Shape::Rectangle(w, h) => 2.0 * (w + h),
Shape::Triangle(a, b, c) => {
// 삼각형의 둘레 공식
let p = a + b + c;
// 둘레가 음수면 에러 발생
if p < 0.0 {
panic!("Invalid triangle");
} else {
p
}
}
}
}
// 정사각형인지 판별하는 함수
fn is_square(shape: &Shape) -> bool {
match shape {
Shape::Circle(_) => false,
Shape::Rectangle(w, h) => w == h,
Shape::Triangle(_, _, _) => false,
}
}
// 결과
/*
원 넓이: 12.56
사각형 넓이: 12
삼각형 넓이: 6
원 둘레: 12.56
사각형 둘레: 14
삼각형 둘레: 12
원이 정사각형인가? false
사각형이 정사각형인가? false
삼각형이 정사각형인가? false
*/
fn main() {
// Shape 타입의 값들을 생성합니다.
let circle = Shape::Circle(2.0);
let rectangle = Shape::Rectangle(3.0, 4.0);
let triangle = Shape::Triangle(3.0, 4.0, 5.0);
// 각 도형의 넓이를 출력합니다.
println!("원 넓이: {}", area(&circle));
println!("사각형 넓이: {}", area(&rectangle));
println!("삼각형 넓이: {}", area(&triangle));
// 각 도형의 둘레를 출력합니다.
println!("원 둘레: {}", perimeter(&circle));
println!("사각형 둘레: {}", perimeter(&rectangle));
println!("삼각형 둘레: {}", perimeter(&triangle));
// 각 도형이 정사각형인지 출력합니다.
println!("원이 정사각형인가? {}", is_square(&circle));
println!("사각형이 정사각형인가? {}", is_square(&rectangle));
println!("삼각형이 정사각형인가? {}", is_square(&triangle));
}