use std::io::stdin;
use std::io::BufRead;
use std::io::BufReader;
use std::boxed::Box;
use std::vec::Vec;
mod figures {
pub trait Figure {
fn area(&self) -> f64;
fn printName(&self) {
print!("Figure = {} ", self.name());
}
fn name(&self) -> &'static str;
}
pub struct Rectangle {
w: f64,
h: f64,
}
impl Rectangle {
pub fn new(width: f64, height: f64) -> Rectangle {
Rectangle { w: width, h: height }
}
}
impl Figure for Rectangle {
fn name(&self) -> &'static str {
"Rectangle"
}
fn area(&self) -> f64 {
self.h * self.w
}
}
pub struct Square {
rectangle: Rectangle,
}
impl Square {
pub fn new(size: f64) -> Square {
Square { rectangle: Rectangle { w: size, h: size } }
}
}
impl Figure for Square {
fn name(&self) -> &'static str {
"Square"
}
fn area(&self) -> f64 {
self.rectangle.area()
}
}
pub struct Ellipse {
rectangle: Rectangle,
}
impl Ellipse {
pub fn new(a: f64, b: f64) -> Ellipse {
Ellipse { rectangle: Rectangle { w: a, h: b } }
}
}
impl Figure for Ellipse {
fn name(&self) -> &'static str {
"Ellipse"
}
fn area(&self) -> f64 {
self.rectangle.area() * 3.1415
}
}
}
fn main() {
use figures::{Figure, Rectangle, Square, Ellipse};
let mut v: Vec<Box<Figure>> = Vec::with_capacity(4);
v.push(Box::new(Rectangle::new(2.0, 3.0)));
v.push(Box::new(Square::new(4.0)));
v.push(Box::new(Ellipse::new(2.0, 3.0)));
for i in &v {
i.printName();
println!(", area: {}", i.area());
}
}
dXNlIHN0ZDo6aW86OnN0ZGluOwp1c2Ugc3RkOjppbzo6QnVmUmVhZDsKdXNlIHN0ZDo6aW86OkJ1ZlJlYWRlcjsKdXNlIHN0ZDo6Ym94ZWQ6OkJveDsKdXNlIHN0ZDo6dmVjOjpWZWM7Cgptb2QgZmlndXJlcyB7CgkKCXB1YiB0cmFpdCBGaWd1cmUgewoJCWZuIGFyZWEoJnNlbGYpIC0+IGY2NDsKCQlmbiBwcmludE5hbWUoJnNlbGYpIHsKCQkJcHJpbnQhKCJGaWd1cmUgPSB7fSAiLCBzZWxmLm5hbWUoKSk7CgkJfQoJCWZuIG5hbWUoJnNlbGYpIC0+ICYnc3RhdGljIHN0cjsKCX0KCQoJcHViIHN0cnVjdCBSZWN0YW5nbGUgewoJCXc6IGY2NCwKCQloOiBmNjQsCgl9CgkKCWltcGwgUmVjdGFuZ2xlIHsKCQlwdWIgZm4gbmV3KHdpZHRoOiBmNjQsIGhlaWdodDogZjY0KSAtPiBSZWN0YW5nbGUgewogICAgICAgICAgICBSZWN0YW5nbGUgeyB3OiB3aWR0aCwgaDogaGVpZ2h0IH0KICAgICAgICB9Cgl9CgkKCWltcGwgRmlndXJlIGZvciBSZWN0YW5nbGUgewoJCWZuIG5hbWUoJnNlbGYpIC0+ICYnc3RhdGljIHN0ciB7CiAgICAgICAgCSJSZWN0YW5nbGUiCgkJfQoJCWZuIGFyZWEoJnNlbGYpIC0+IGY2NCB7CgkJCXNlbGYuaCAqIHNlbGYudwoJCX0KCX0KCQoJcHViIHN0cnVjdCBTcXVhcmUgewoJCXJlY3RhbmdsZTogUmVjdGFuZ2xlLAoJfQoJCglpbXBsIFNxdWFyZSB7CgkJcHViIGZuIG5ldyhzaXplOiBmNjQpIC0+IFNxdWFyZSB7CgkJCVNxdWFyZSB7IHJlY3RhbmdsZTogUmVjdGFuZ2xlIHsgdzogc2l6ZSwgaDogc2l6ZSB9IH0KCQl9Cgl9CgkKCWltcGwgRmlndXJlIGZvciBTcXVhcmUgewoJCWZuIG5hbWUoJnNlbGYpIC0+ICYnc3RhdGljIHN0ciB7CiAgICAgICAgCSJTcXVhcmUiCgkJfQoJCWZuIGFyZWEoJnNlbGYpIC0+IGY2NCB7CgkJCXNlbGYucmVjdGFuZ2xlLmFyZWEoKQoJCX0KCX0KCQoJcHViIHN0cnVjdCBFbGxpcHNlIHsKCQlyZWN0YW5nbGU6IFJlY3RhbmdsZSwKCX0KCQoJaW1wbCBFbGxpcHNlIHsKCQlwdWIgZm4gbmV3KGE6IGY2NCwgYjogZjY0KSAtPiBFbGxpcHNlIHsKCQkJRWxsaXBzZSB7IHJlY3RhbmdsZTogUmVjdGFuZ2xlIHsgdzogYSwgaDogYiB9IH0KCQl9Cgl9CgkKCWltcGwgRmlndXJlIGZvciBFbGxpcHNlIHsKCQlmbiBuYW1lKCZzZWxmKSAtPiAmJ3N0YXRpYyBzdHIgewogICAgICAgIAkiRWxsaXBzZSIKCQl9CgkJZm4gYXJlYSgmc2VsZikgLT4gZjY0IHsKCQkJc2VsZi5yZWN0YW5nbGUuYXJlYSgpICogMy4xNDE1CgkJfQoJfQp9CgpmbiBtYWluKCkgewoJdXNlIGZpZ3VyZXM6OntGaWd1cmUsIFJlY3RhbmdsZSwgU3F1YXJlLCBFbGxpcHNlfTsKCWxldCBtdXQgdjogVmVjPEJveDxGaWd1cmU+PiA9IFZlYzo6d2l0aF9jYXBhY2l0eSg0KTsKCXYucHVzaChCb3g6Om5ldyhSZWN0YW5nbGU6Om5ldygyLjAsIDMuMCkpKTsKCXYucHVzaChCb3g6Om5ldyhTcXVhcmU6Om5ldyg0LjApKSk7Cgl2LnB1c2goQm94OjpuZXcoRWxsaXBzZTo6bmV3KDIuMCwgMy4wKSkpOwoJZm9yIGkgaW4gJnYgewoJCWkucHJpbnROYW1lKCk7CgkJcHJpbnRsbiEoIiwgYXJlYToge30iLCBpLmFyZWEoKSk7CiAgICB9Cn0K