Desafio Rust
Tuple struct e métodos
Enunciado
Defina uma tuple struct Ponto3D que armazena três coordenadas f64. Implemente uma função associada new e um método distancia_origem que retorna a distância euclidiana à origem. No main, crie dois pontos, imprima a distância de cada um à origem e a distância entre eles.
Requisitos
- A tuple struct
Ponto3Ddeve ter três camposf64. - A função associada
newdeve criar umPonto3D. - O método
distancia_origemdeve retornar a distância à origem. - O programa deve imprimir as distâncias à origem e entre os pontos, com duas casas decimais.
Código inicial
struct Ponto3D(f64, f64, f64);
impl Ponto3D {
// Implemente new, distancia_origem e distancia_entre
}
fn main() {
// Crie dois pontos e imprima as distâncias
}
Saída esperada
Distância do ponto A à origem: 3.74
Distância do ponto B à origem: 7.07
Distância entre A e B: 5.92
Ver dica
Para a distância entre dois pontos, use a fórmula da distância euclidiana: ((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2).sqrt(). Acesse os campos com .0, .1, .2.
Mostrar solução
struct Ponto3D(f64, f64, f64);
impl Ponto3D {
// Função associada
fn new(x: f64, y: f64, z: f64) -> Self {
Ponto3D(x, y, z)
}
// Distância à origem
fn distancia_origem(&self) -> f64 {
(self.0 * self.0 + self.1 * self.1 + self.2 * self.2).sqrt()
}
// Distância entre dois pontos
fn distancia_entre(&self, outro: &Ponto3D) -> f64 {
let dx = self.0 - outro.0;
let dy = self.1 - outro.1;
let dz = self.2 - outro.2;
(dx * dx + dy * dy + dz * dz).sqrt()
}
}
fn main() {
let a = Ponto3D::new(1.0, 2.0, 3.0);
let b = Ponto3D::new(4.0, 5.0, 6.0);
println!("Distância do ponto A à origem: {:.2}", a.distancia_origem());
println!("Distância do ponto B à origem: {:.2}", b.distancia_origem());
println!("Distância entre A e B: {:.2}", a.distancia_entre(&b));
}
Passo a passo
- Definimos a tuple struct
Ponto3Dcom três camposf64acessíveis por.0,.1,.2. - No
impl, a funçãonewrecebe três coordenadas e devolvePonto3D(x, y, z). - O método
distancia_origemcalcula a raiz da soma dos quadrados das coordenadas. - O método
distancia_entrerecebe uma referência a outroPonto3De calcula a diferença em cada eixo. - No
main, criamos dois pontos comPonto3D::new. - Imprimimos as distâncias formatando com
{:.2}.
Por que funciona
Tuple structs são úteis quando queremos um tipo distinto sem nomear campos. O acesso posicional (.0, .1) é direto. Métodos podem receber referências a outros pontos para cálculos relativos.
Erros comuns
- Tentar acessar campos por nome:
p.xnão existe em tuple struct; usep.0. - Esquecer de passar a referência em
distancia_entre(&b): se passarbdiretamente, o método consumiria o valor (se fosseself), mas aqui é&selfeoutro: &Ponto3D, então&bé necessário. - Confundir a ordem dos campos:
Ponto3D(z, y, x)inverteria os eixos.
Outra forma de resolver
Usar uma struct com campos nomeados (struct Ponto3D { x: f64, y: f64, z: f64 }) para maior clareza, especialmente se os campos tiverem significados distintos.
Saída esperada
Distância do ponto A à origem: 3.74
Distância do ponto B à origem: 7.07
Distância entre A e B: 5.92