As questões devem ser implementadas em C.
Faça um programa que calcule a média aritmética de vários valores inteiros positivos, inseridos pelo usuário. O final da leitura acontecerá quando for lido um valor negativo. (1)

Passo 1

O enunciado pede um programa em C que calcule a média aritmética de vários valores inteiros positivos inseridos pelo usuário. A leitura termina quando for lido um valor negativo. Pontos claros do enunciado:
  • Deve ler valores inteiros, um a um.
  • Apenas valores inteiros não-negativos (ou seja, positivos e possivelmente zero) entram na média; um valor negativo termina a leitura.
  • Deve calcular a média aritmética dos valores lidos antes do sentinela negativo.
  • É preciso tratar o caso em que nenhum valor positivo foi lido (para evitar divisão por zero).
Informações relevantes dadas:
  • O sinal de término é um valor negativo (pegou-se isto do enunciado).
  • Os dados de entrada são inteiros (pegou-se isto do enunciado).

Passo 2

Estratégia de resolução (em linguagem simples):
  • Ler inteiros em um laço até encontrar um inteiro negativo. Esse inteiro negativo indica “pare”.
  • Enquanto os inteiros lidos forem não-negativos, acumular a soma e contar quantos valores foram lidos.
  • Depois do laço, se o contador for maior que zero, calcular a média dividindo a soma pelo contador; caso contrário, avisar que nenhum valor foi lido.
  • Para calcular a média devemos fazer divisão em ponto flutuante, para não perder casas decimais.

Passo 3

Definição das variáveis (o que são e por que usar cada tipo):
  • x: variável para armazenar cada inteiro lido; usar tipo \text{int} porque os valores são inteiros.
  • \text{sum}: acumulador da soma dos valores; usar \text{long long} para suportar somas grandes sem overflow quando muitos valores grandes forem somados.
  • \text{count}: contador do número de valores lidos; pode ser \text{long long} ou \text{unsigned long long}; aqui usaremos \text{long long} por consistência com \text{sum}.
  • \text{mean}: média aritmética; usar \text{double} para fazer divisão em ponto flutuante.

Passo 4

Explicação do laço de leitura (sentinela) passo a passo:
  • Usar um laço repetitivo infinito controlado por condição de saída (por exemplo \text{while (1)}).
  • Em cada iteração, tentar ler um inteiro com \text{scanf("%d", \&x)}.
    • Se \text{scanf} retornar valor diferente de 1, a leitura falhou (por exemplo EOF ou entrada inválida) — então interromper o laço.
    • Se x<0, então é o sentinela negativo: interromper o laço.
    • Caso contrário ( x\ge 0), adicionar x a \text{sum} e incrementar \text{count}.
  • Esse padrão é robusto e simples de implementar numa prova.

Passo 5

Como evitar divisão por zero e calcular a média corretamente:
  • Depois do laço, verificar se \text{count}==0. Se for verdade, não existe média; imprimir uma mensagem adequada (por exemplo: “Nenhum valor positivo foi lido.”).
  • Se \text{count}>0, calcular a média pela fórmula
\bar{x} = \frac{\text{sum}}{\text{count}}.
  • Importante: se fizer a divisão com tipos inteiros (por exemplo \text{sum} e \text{count} inteiros), o resultado será truncado. Para evitar isso, converter para \text{double} antes da divisão: \text{mean} = (double)\text{sum} / (double)\text{count}.

Passo 6

Formato de saída e precisão:
  • Em geral, é conveniente mostrar a média com algumas casas decimais para ficar mais legível. Um formato comum é com duas casas decimais: \text{printf}("%.2f\n", \text{mean}).
  • Se preferir todas as casas significativas, pode usar \text{printf}("%f\n", \text{mean}), mas para provas e exercícios é usual limitar casas decimais.

Passo 7

Exemplo numérico rápido para fixar (faça isto na prova mentalmente para checar):
  • Entradas (em linhas separadas): 3, 4, 5, -1.
  • Soma: \text{sum} = 3 + 4 + 5 = 12.
  • Contador: \text{count} = 3.
  • Média: \bar{x} = \dfrac{12}{3} = 4{,}00.
  • O laço para porque -1 é negativo.

Passo 8

Boas práticas que valem na prova:
  • Inicializar \text{sum} e \text{count} com zero antes do laço.
  • Verificar o retorno de \text{scanf} para tornar o programa mais robusto.
  • Tratar o caso sem leituras válidas (contador zero) para evitar divisão por zero.
  • Usar casting para \text{double} ao calcular a média para evitar perda de precisão.

Passo 9

Código em C (estrutura final comentada e pronta para colar e compilar).
  • O código abaixo implementa tudo o que foi explicado: leitura até valor negativo, soma, contagem, verificação de divisão por zero, cálculo da média em ponto flutuante e impressão com duas casas decimais.

Resposta

#include <stdio.h>

int main(void) {
    long long sum = 0;    /* acumulador da soma */
    long long count = 0;  /* contador de valores lidos */
    int x;

    /* Ler inteiros até encontrar um valor negativo ou até EOF/erro */
    while (1) {
        if (scanf("%d", &x) != 1) {
            /* leitura falhou (EOF ou entrada inválida) */
            break;
        }
        if (x < 0) {
            /* sentinela negativo: interrompe a leitura */
            break;
        }
        sum += x;
        count++;
    }

    if (count == 0) {
        printf("Nenhum valor positivo foi lido.\n");
    } else {
        double mean = (double)sum / (double)count;
        printf("%.2f\n", mean);
    }

    return 0;
}

Exercícios relacionados