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
forsobre o array para calcular soma, máximo e mínimo. - Converter o tamanho do array para
f64ao 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
- Declaramos
temperaturascomo um array de 7f64. O tipo[f64; 7]indica o tipo dos elementos e o tamanho fixo. - Inicializamos
somacom0.0(f64) emax/mincom o primeiro elemento do array. Isso evita quemaxcomece com 0 e falhe se todas as temperaturas forem negativas. - Usamos
for &temp in temperaturas.iter()para percorrer o array. O&desestrutura a referência, copiando o valorf64paratemp. - Dentro do loop, somamos
tempasomae atualizamosmaxemincom comparações simples. - Após o loop, calculamos a média dividindo
somaportemperaturas.len() as f64. A conversão é necessária porquelen()retornausize. - 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
maxcom0.0emincom0.0: se todas as temperaturas forem positivas,minficaria 0.0 incorretamente. Use o primeiro elemento como semente. - Esquecer o
as f64na média:soma / temperaturas.len()gera erro de compilação (cannot divide f64 by usize). - Usar
for temp in temperaturassem&: em Rust 2021, isso move o array (mas[f64; 7]éCopy, então funciona). No entanto, o idiomático éfor &temp in temperaturas.iter()oufor 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