Desafio C++
Processamento de notas com range-for
Enunciado
Leia uma sequência de notas (números reais) até que seja digitado -1. Armazene-as em um std::vector<double>. Depois, use range-for para calcular a média das notas válidas (ignorando o -1) e imprimir quantas notas estão acima da média. A saída deve ser: Média: X.XX e Acima da média: N.
Requisitos
- Ler notas até encontrar -1 (usar
while). - Armazenar as notas válidas em um
std::vector<double>. - Usar
range-forpara calcular a média e contar quantas notas são maiores que a média. - Imprimir a média com duas casas decimais e a contagem.
Código inicial
#include <iostream>
#include <vector>
#include <iomanip>
int main() {
// Seu código aqui
return 0;
}
Saída esperada
Média: 7.50
Acima da média: 2
Ver dica
Use while (true) para ler as notas, e break quando for -1. Para formatar a saída, use std::fixed e std::setprecision(2). O range-for pode ser usado duas vezes: uma para somar e outra para contar.
Mostrar solução
#include <iostream>
#include <vector>
#include <iomanip>
int main() {
std::vector<double> notas;
double nota;
// Lê notas até -1
while (true) {
std::cin >> nota;
if (nota == -1.0) break;
notas.push_back(nota);
}
// Calcula a soma com range-for
double soma = 0.0;
for (double n : notas) {
soma += n;
}
double media = notas.empty() ? 0.0 : soma / notas.size();
// Conta quantas notas estão acima da média
int acima = 0;
for (double n : notas) {
if (n > media) ++acima;
}
std::cout << std::fixed << std::setprecision(2);
std::cout << "Média: " << media << '\n';
std::cout << "Acima da média: " << acima << '\n';
return 0;
}
Passo a passo
- Incluímos
<vector>para usarstd::vectore<iomanip>para formatar a saída. - Declaramos
std::vector<double> notaspara armazenar as notas válidas. - Usamos
while (true)para ler cada nota. Se a nota for-1.0, saímos do loop combreak; caso contrário, adicionamos ao vector compush_back. - Com um
range-for, percorremos o vector somando todos os valores emsoma. - Calculamos a média dividindo
somapelo tamanho do vector. Usamos o operador ternário para evitar divisão por zero se não houver notas. - Com outro
range-for, percorremos novamente o vector e contamos quantas notas são maiores que a média. - Configuramos a saída para mostrar duas casas decimais com
std::fixedestd::setprecision(2)e imprimimos os resultados.
Por que funciona
O while com break permite ler uma quantidade desconhecida de valores até um sentinela. O range-for simplifica a iteração sobre o vector, evitando índices e reduzindo erros. A média é calculada corretamente mesmo com vector vazio graças à verificação notas.empty(). A contagem usa uma segunda passada, que é simples e legível.
Erros comuns
- Não tratar o caso de vector vazio:
soma / notas.size()causaria divisão por zero. Usenotas.empty() ? 0.0 : .... - Usar
intpara as notas: a média seria truncada. Usedouble. - Esquecer de incluir
<iomanip>:std::setprecisionnão estaria disponível. Inclua o cabeçalho. - Comparar
nota == -1comdoublepode falhar por precisão, mas como -1 é exato, é seguro neste caso. Em geral, use tolerância.
Outra forma de resolver
Calcular soma e contagem em um único range-for usando acumuladores, mas a média só pode ser calculada após a leitura de todas as notas. A abordagem em duas passadas é mais clara.
Saída esperada
Média: 7.50
Acima da média: 2