Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Created March 9, 2018 17:58
Show Gist options
  • Save AnthonyMikh/64d69812402a866a127cf76ac7773d94 to your computer and use it in GitHub Desktop.
Save AnthonyMikh/64d69812402a866a127cf76ac7773d94 to your computer and use it in GitHub Desktop.
Решение задачи №77 от UniLecs
type Float = f64; //Тип значения площади
type Side = u32; //Тип стороны
//Проверяет, удолетворяет ли тройка значений неравенствам треугольника
fn valid_triangle (a: Side, b: Side, c: Side) -> bool {
a + b > c &&
b + c > a &&
c + a > b
}
//Проверяет, можно ли из указанных сторон построить четырёхугольник
fn valid_tetragon(a: Side, b: Side, c: Side, d: Side) -> bool {
a + b + c >= d &&
b + c + d >= a &&
c + d + a >= b &&
d + a + b >= c
}
//Считает площадь треугольника по трём сторонам.
//Используется формула Герона
fn triangle_area(a: Float, b: Float, c: Float) -> Float {
let p = (a + b + c)/2.0;
(p*(p - a)*(p - b)*(p - c)).sqrt()
}
#[derive(Debug, PartialEq)]
enum TetragonAreaErr { //Возможные ошибки при подсчёте значений
InvalidSides, //Четырёхугольник с заданными сторонами и диагональю невозможно построить
}
//Возвращает площадь четырёхугольника, если это возможно
fn tetragon_area(a: Side, b: Side, c: Side, d: Side, diag: Side) -> Result<Float, TetragonAreaErr> {
if !valid_tetragon(a, b, c, d) || !valid_triangle(a, b, diag) || !valid_triangle(c, d, diag) {
Err(TetragonAreaErr::InvalidSides)
} else {
let a = Float::from(a); let b = Float::from(b);
let c = Float::from(c); let d = Float::from(d);
let diag = Float::from(diag);
Ok(triangle_area(a, b, diag) + triangle_area(c, d, diag))
}
}
#[test]
fn do_tests() {
let (a, b, c, d, diag) = (3, 4, 3, 4, 5);
assert_eq!(tetragon_area(a, b, c, d, diag), Ok(12.0));
let (a, b, c, d, diag) = (3, 4, 3, 4, 5555);
assert_eq!(tetragon_area(a, b, c, d, diag), Err(TetragonAreaErr::InvalidSides));
}
@AnthonyMikh
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment