Menu
Coddy logo textTech

Calcolatore dell’area delle figure

Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 61 di 61.

challenge icon

Sfida

Facile

Questa sfida finale combina trait, oggetti trait e polimorfismo per risolvere un problema pratico: calcolare l'area totale di forme diverse memorizzate in un'unica raccolta.

Costruiamo un calcolatore dell'area delle forme che dimostri la potenza degli oggetti trait e del polimorfismo! Creerai un sistema in cui forme diverse, cerchi e quadrati, possono essere memorizzate insieme in un'unica raccolta e la loro area totale può essere calcolata tramite un'interfaccia unificata.

Organizzerai il codice in tre file:

  • shape.rs: Definisci il trait Shape con un metodo area che restituisce un f64. Questo trait stabilisce il contratto che tutte le forme devono rispettare.
  • shapes.rs: Crea due struct che implementano il tuo trait. Un Circle ha un radius (f64) e un Square ha un side (f64). Ogni struct deve implementare il trait Shape con la formula appropriata per calcolarne l'area. Per i cerchi, usa 3.14159 come π.
  • main.rs: Includi entrambi i moduli e crea una funzione total_area che accetta un Vec<Box<dyn Shape>> e restituisce la somma di tutte le aree. Usando gli input forniti, crea un cerchio e un quadrato, memorizzali in un vettore di oggetti trait, calcola l'area totale e stampa il risultato.

Le formule per calcolare l'area sono:

  • Cerchio: 3.14159 × radius × radius
  • Quadrato: side × side

L'output deve mostrare l'area totale di tutte le forme:

Total area: {total}

Per esempio, con gli input 2.0 (raggio del cerchio) e 3.0 (lato del quadrato):

Total area: 21.56636

Questo perché: area del cerchio = 3.14159 × 2² = 12.56636, area del quadrato = 3² = 9, totale = 21.56636

E con gli input 1.0 e 4.0:

Total area: 19.14159

Riceverai due input: il raggio del cerchio e la lunghezza del lato del quadrato (analizzali entrambi come f64).

Provalo tu

mod shape;
mod shapes;

use shape::Shape;
use shapes::{Circle, Square};

// TODO: Implementa la funzione total_area
// Deve accettare un Vec<Box<dyn Shape>> e restituire la somma delle aree come f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
    // TODO: Calcola e restituisci la somma delle aree di tutte le forme
    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: Crea un Circle con il raggio dato
    // TODO: Crea uno Square con il lato dato
    // TODO: Memorizza entrambe le forme in un Vec<Box<dyn Shape>>
    // TODO: Chiama total_area e stampa il risultato nel formato: "Total area: {total}"
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Rust online