CodeBlanks Logo Icon CodeBlanks

Trait ile şekil

Shape trait ve alan hesaplayan tipler yazarsın.

Bitirme görevi: trait ile şekil

Üç farklı şekli ortak bir trait arkasında topla ve bir rapor üret. Trait iki zorunlu metot ve bir varsayılan metot içersin:

trait Sekil {
    fn ad(&self) -> &str;
    fn alan(&self) -> f64;
    fn cevre(&self) -> f64;
    fn ozet(&self) -> String {
        format!("{}: alan={:.2}, çevre={:.2}", self.ad(), self.alan(), self.cevre())
    }
}

Üçgen alanı için Heron formülü: s = (a + b + c) / 2, alan = √(s(s−a)(s−b)(s−c)).

Rapor

Şekiller Vec<Box<dyn Sekil>> içinde tutulur; varsayılan ozet her biri için aynı biçimi üretir, toplam alan yineleyiciyle hesaplanır:

let sekiller: Vec<Box<dyn Sekil>> = vec![
    Box::new(Dikdortgen { en: 3.0, boy: 4.0 }),
    Box::new(Daire { r: 1.0 }),
    Box::new(Ucgen { a: 3.0, b: 4.0, c: 5.0 }),
];
for s in &sekiller {
    println!("{}", s.ozet());
}
let toplam: f64 = sekiller.iter().map(|s| s.alan()).sum();

Uygulama Şekil raporu

Yukarıdaki Sekil trait'ini ve Dikdortgen, Daire, Ucgen (Heron) türlerini yaz; adlar dikdörtgen, daire, üçgen olsun. Her şeklin ozet() satırını, en sonda toplam alan: X ({:.2}) yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
trait Sekil {
    fn ad(&self) -> &str;
    fn alan(&self) -> f64;
    fn cevre(&self) -> f64;
    fn ozet(&self) -> String {
        format!("{}: alan={:.2}, çevre={:.2}", self.ad(), self.alan(), self.cevre())
    }
}

struct Dikdortgen {
    en: f64,
    boy: f64,
}

struct Daire {
    r: f64,
}

struct Ucgen {
    a: f64,
    b: f64,
    c: f64,
}

impl Sekil for Dikdortgen {
    fn ad(&self) -> &str {
        "dikdörtgen"
    }
    fn alan(&self) -> f64 {
        self.en * self.boy
    }
    fn cevre(&self) -> f64 {
        2.0 * (self.en + self.boy)
    }
}

impl Sekil for Daire {
    fn ad(&self) -> &str {
        "daire"
    }
    fn alan(&self) -> f64 {
        std::f64::consts::PI * self.r * self.r
    }
    fn cevre(&self) -> f64 {
        2.0 * std::f64::consts::PI * self.r
    }
}

impl Sekil for Ucgen {
    fn ad(&self) -> &str {
        "üçgen"
    }
    fn alan(&self) -> f64 {
        let s = (self.a + self.b + self.c) / 2.0;
        (s * (s - self.a) * (s - self.b) * (s - self.c)).sqrt()
    }
    fn cevre(&self) -> f64 {
        self.a + self.b + self.c
    }
}

fn main() {
    let sekiller: Vec<Box<dyn Sekil>> = vec![
        Box::new(Dikdortgen { en: 3.0, boy: 4.0 }),
        Box::new(Daire { r: 1.0 }),
        Box::new(Ucgen { a: 3.0, b: 4.0, c: 5.0 }),
    ];
    for s in &sekiller {
        println!("{}", s.ozet());
    }
    let toplam: f64 = sekiller.iter().map(|s| s.alan()).sum();
    println!("toplam alan: {:.2}", toplam);
}

Beklenen çıktı

dikdörtgen: alan=12.00, çevre=14.00
daire: alan=3.14, çevre=6.28
üçgen: alan=6.00, çevre=12.00
toplam alan: 21.14

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 3-4-5 üçgeninin alanı nedir?

  • 6 Doğru cevap
  • 12
  • 7.5
  • 10

Açıklama: s = 6; √(6·3·2·1) = √36 = 6. Dik üçgen olduğu için 3·4/2 ile de doğrulanır.

2 Karekök

Soru
let s = (self.a + self.b + self.c) / 2.0;
(s * (s - self.a) * (s - self.b) * (s - self.c)).____()
Cevap
let s = (self.a + self.b + self.c) / 2.0;
(s * (s - self.a) * (s - self.b) * (s - self.c)).sqrt()

Açıklama: f64::sqrt karekök alır.

3 Şekil ve alan

Kavram Anlamı
Dikdörtgen 3×4 12.00
Daire r=1 3.14
Üçgen 3-4-5 6.00
Toplam 21.14

Orta seviye bölümündeki tüm dersler