Desafio Rust

Array de temperaturas e estatísticas

Enunciado

Dado um array fixo de 7 temperaturas (f64) representando os dias da semana, calcule e imprima: a média, a maior e a menor temperatura. Use um loop for para percorrer o array e atualizar as variáveis de máximo e mínimo. Imprima no formato: Média: 23.57, Máxima: 30.10, Mínima: 18.20 (com duas casas decimais).

Requisitos

  • Declarar um array [f64; 7] com pelo menos 7 valores.
  • Usar um loop for sobre o array para calcular soma, máximo e mínimo.
  • Converter o tamanho do array para f64 ao calcular a média.
  • Imprimir os três valores com duas casas decimais no formato exato.

Código inicial

fn main() {
    let temperaturas: [f64; 7] = [22.5, 25.0, 30.1, 18.2, 21.0, 24.3, 23.7];
    // TODO: calcule média, máxima e mínima usando um loop for
}

Saída esperada

Média: 23.54, Máxima: 30.10, Mínima: 18.20
Ver dica

Inicialize max e min com o primeiro elemento do array (temperaturas[0]) para evitar problemas com valores iniciais inadequados.

Mostrar solução
fn main() {
    // Array de tamanho fixo com 7 temperaturas
    let temperaturas: [f64; 7] = [22.5, 25.0, 30.1, 18.2, 21.0, 24.3, 23.7];

    let mut soma = 0.0;
    // Inicializa max e min com o primeiro elemento
    let mut max = temperaturas[0];
    let mut min = temperaturas[0];

    // Loop for sobre o array (itera por referência)
    for &temp in temperaturas.iter() {
        soma += temp;
        if temp > max {
            max = temp;
        }
        if temp < min {
            min = temp;
        }
    }

    // Média: soma dividida pelo número de elementos convertido para f64
    let media = soma / temperaturas.len() as f64;

    // Impressão formatada com duas casas decimais
    println!("Média: {:.2}, Máxima: {:.2}, Mínima: {:.2}", media, max, min);
}

Passo a passo

  1. Declaramos temperaturas como um array de 7 f64. O tipo [f64; 7] indica o tipo dos elementos e o tamanho fixo.
  2. Inicializamos soma com 0.0 (f64) e max/min com o primeiro elemento do array. Isso evita que max comece com 0 e falhe se todas as temperaturas forem negativas.
  3. Usamos for &temp in temperaturas.iter() para percorrer o array. O & desestrutura a referência, copiando o valor f64 para temp.
  4. Dentro do loop, somamos temp a soma e atualizamos max e min com comparações simples.
  5. Após o loop, calculamos a média dividindo soma por temperaturas.len() as f64. A conversão é necessária porque len() retorna usize.
  6. Imprimimos os três valores com {:.2} para duas casas decimais.

Por que funciona

Arrays em Rust têm tamanho fixo conhecido em tempo de compilação e todos os elementos do mesmo tipo. O método .iter() produz referências aos elementos, e o padrão &temp copia o valor (tipos Copy como f64 são copiados automaticamente). O cálculo de máximo e mínimo com atualização condicional é uma técnica clássica de varredura linear. A conversão as f64 é explícita porque Rust não converte tipos numéricos implicitamente.

Erros comuns

  • Inicializar max com 0.0 e min com 0.0: se todas as temperaturas forem positivas, min ficaria 0.0 incorretamente. Use o primeiro elemento como semente.
  • Esquecer o as f64 na média: soma / temperaturas.len() gera erro de compilação (cannot divide f64 by usize).
  • Usar for temp in temperaturas sem &: em Rust 2021, isso move o array (mas [f64; 7] é Copy, então funciona). No entanto, o idiomático é for &temp in temperaturas.iter() ou for temp in &temperaturas.

Outra forma de resolver

Você pode usar iteradores para calcular soma, máximo e mínimo sem loop explícito:

let soma: f64 = temperaturas.iter().sum();
let max = temperaturas.iter().cloned().fold(f64::NEG_INFINITY, f64::max);
let min = temperaturas.iter().cloned().fold(f64::INFINITY, f64::min);

Essa abordagem é mais declarativa e evita variáveis mutáveis, mas o loop explícito é mais didático para entender o processo.

Saída esperada

Média: 23.54, Máxima: 30.10, Mínima: 18.20