Exercício 1
Classifique a temperatura com if/else como expressão
stub.rs
// classify devolve a faixa da temperatura: "frio" abaixo de 15.0,
// "agradável" de 15.0 até 29.99..., "quente" de 30.0 em diante.
// Sem return: o corpo é uma única cadeia if/else if/else.
pub fn classify(celsius: f64) -> &'static str {
// implemente:
let _ = celsius;
"frio"
}
harness.rs
fn json_escape(value: &str) -> String {
value
.replace('\\', "\\\\")
.replace('"', "\\\"")
.replace('\n', "\\n")
}
fn print_result(case: usize, pass: bool, input: &str, want: &str, got: &str) {
println!(
"RESULT {{\"case\":{case},\"pass\":{pass},\"input\":\"{}\",\"want\":\"{}\",\"got\":\"{}\"}}",
json_escape(input),
json_escape(want),
json_escape(got)
);
}
fn main() {
let cases: [(f64, &str); 6] = [
(14.9, "frio"),
(15.0, "agradável"),
(29.9, "agradável"),
(30.0, "quente"),
(-5.0, "frio"),
(40.0, "quente"),
];
for (index, (celsius, want)) in cases.iter().enumerate() {
let got = classify(*celsius);
let pass = got == *want;
print_result(index + 1, pass, &format!("{celsius:.1}"), want, got);
}
}
cases.json
[
{
"case": 1,
"input": "14.9",
"want": "frio"
},
{
"case": 2,
"input": "15.0",
"want": "agradável"
},
{
"case": 3,
"input": "29.9",
"want": "agradável"
},
{
"case": 4,
"input": "30.0",
"want": "quente"
},
{
"case": 5,
"input": "-5.0",
"want": "frio"
},
{
"case": 6,
"input": "40.0",
"want": "quente"
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | 14.9 |
frio |
| 2 | 15.0 |
agradável |
| 3 | 29.9 |
agradável |
| 4 | 30.0 |
quente |
| 5 | -5.0 |
frio |
| 6 | 40.0 |
quente |
Execute com o Cargo local
- Execute os comandos de preparação.
- Copie os arquivos acima para os arquivos vazios com os mesmos nomes.
- Execute a verificação de base. O stub deve mostrar o comportamento atual.
Comandos de preparação
cargo new --bin --edition 2024 imersao-04-funcoes-e-fluxo-exercicio-1
cd imersao-04-funcoes-e-fluxo-exercicio-1
touch stub.rs harness.rs cases.json
printf 'include!("../stub.rs");\ninclude!("../harness.rs");\n' > src/main.rs
Verificação de base — confirme o comportamento atual antes da mudança
cargo fmt --check
cargo run --bin imersao-04-funcoes-e-fluxo-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- São três faixas em ordem: abaixo de 15.0 é "frio", abaixo de 30.0 é "agradável", o resto é "quente" — um if/else if/else resolve, sem return.
- Faça a cadeia inteira ser a última expressão da função: cada ramo termina em um literal &'static str sem ponto e vírgula, e o valor do if é o retorno.
Revelar solução
solution.rs
// classify devolve a faixa da temperatura: "frio" abaixo de 15.0,
// "agradável" de 15.0 até 29.99..., "quente" de 30.0 em diante.
// Sem return: o corpo é uma única cadeia if/else if/else.
pub fn classify(celsius: f64) -> &'static str {
if celsius < 15.0 {
"frio"
} else if celsius < 30.0 {
"agradável"
} else {
"quente"
}
}
A cadeia if/else if/else como expressão final devolve o ramo escolhido; os limites usam < para que 15.0 caia em "agradável" e 30.0 em "quente". A armadilha é pôr ponto e vírgula nos ramos e transformar a expressão em instrução — o E0308 da aula.