Şekil Alanı Hesaplayıcı
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 61 / 61.
Görev
KolayBu final meydan okuması; tek bir koleksiyonda saklanan farklı şekillerin toplam alanını hesaplamak gibi pratik bir problemi çözmek için trait'leri, trait nesnelerini ve polimorfizmi bir araya getiriyor.
Trait nesnelerinin ve polimorfizmin gücünü gösteren bir şekil alanı hesaplayıcısı oluşturalım! Farklı şekillerin (daireler ve kareler) tek bir koleksiyonda birlikte saklanabildiği ve toplam alanlarının birleşik bir arayüz üzerinden hesaplandığı bir sistem oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
shape.rs: Birf64döndürenareametoduna sahipShapetrait'ini tanımlayın. Bu trait, tüm şekillerin yerine getirmesi gereken sözleşmeyi belirler.shapes.rs: Trait'inizi uygulayan iki struct oluşturun. BirCircle(daire)radius(f64) değerine, birSquare(kare) iseside(f64) değerine sahiptir. Her struct,Shapetrait'ini uygun alan formülüyle uygulamalıdır. Daireler için π olarak3.14159kullanın.main.rs: Her iki modülü de dahil edin ve birVec<Box<dyn Shape>>kabul eden ve tüm alanların toplamını döndüren birtotal_areafonksiyonu oluşturun. Sağlanan girdileri kullanarak bir daire ve bir kare oluşturun, bunları bir trait nesnesi vektöründe saklayın, toplam alanı hesaplayın ve sonucu yazdırın.
Alan formülleri şunlardır:
- Daire:
3.14159 × radius × radius - Kare:
side × side
Çıktınız tüm şekillerin toplam alanını göstermelidir:
Total area: {total}Örneğin, 2.0 (daire yarıçapı) ve 3.0 (kare kenarı) girdileriyle:
Total area: 21.56636Bunun nedeni: Daire alanı = 3.14159 × 2² = 12.56636, Kare alanı = 3² = 9, Toplam = 21.56636
Ve 1.0 ile 4.0 girdileriyle:
Total area: 19.14159İki girdi alacaksınız: dairenin yarıçapı ve karenin kenar uzunluğu (her ikisini de f64 olarak ayrıştırın).
Kendin dene
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: total_area fonksiyonunu uygulayın
// Bir Vec<Box<dyn Shape>> kabul etmeli ve tüm alanların toplamını f64 olarak döndürmelidir
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Tüm şekil alanlarının toplamını hesaplayın ve döndürün
0.0
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let radius: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let side: f64 = input2.trim().parse().expect("Invalid number");
// TODO: Verilen yarıçap ile bir Circle oluşturun
// TODO: Verilen kenar uzunluğu ile bir Square oluşturun
// TODO: Her iki şekli bir Vec<Box<dyn Shape>> içinde saklayın
// TODO: total_area fonksiyonunu çağırın ve sonucu şu formatta yazdırın: "Total area: {total}"
}
Object Oriented Programming bölümündeki tüm dersler
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media Player