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-for para 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

  1. Incluímos <vector> para usar std::vector e <iomanip> para formatar a saída.
  2. Declaramos std::vector<double> notas para armazenar as notas válidas.
  3. Usamos while (true) para ler cada nota. Se a nota for -1.0, saímos do loop com break; caso contrário, adicionamos ao vector com push_back.
  4. Com um range-for, percorremos o vector somando todos os valores em soma.
  5. Calculamos a média dividindo soma pelo tamanho do vector. Usamos o operador ternário para evitar divisão por zero se não houver notas.
  6. Com outro range-for, percorremos novamente o vector e contamos quantas notas são maiores que a média.
  7. Configuramos a saída para mostrar duas casas decimais com std::fixed e std::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. Use notas.empty() ? 0.0 : ....
  • Usar int para as notas: a média seria truncada. Use double.
  • Esquecer de incluir <iomanip>: std::setprecision não estaria disponível. Inclua o cabeçalho.
  • Comparar nota == -1 com double pode 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