Trait ile şekil
- Rust kursu
- Orta seviye
- Ders 113/115
- 7 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
let s = (self.a + self.b + self.c) / 2.0;
(s * (s - self.a) * (s - self.b) * (s - self.c)).____()
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 |