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)
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):
-
: variável para armazenar cada inteiro lido; usar tipo porque os valores são inteiros. -
: acumulador da soma dos valores; usar para suportar somas grandes sem overflow quando muitos valores grandes forem somados. -
: contador do número de valores lidos; pode ser ou ; aqui usaremos por consistência com . -
: média aritmética; usar 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
). - Em cada iteração, tentar ler um inteiro com
. - Se
retornar valor diferente de , a leitura falhou (por exemplo EOF ou entrada inválida) — então interromper o laço. - Se
, então é o sentinela negativo: interromper o laço. - Caso contrário (
), adicionar a e incrementar .
- Se
- 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
. Se for verdade, não existe média; imprimir uma mensagem adequada (por exemplo: “Nenhum valor positivo foi lido.”). - Se
, calcular a média pela fórmula
- Importante: se fizer a divisão com tipos inteiros (por exemplo
e inteiros), o resultado será truncado. Para evitar isso, converter para antes da divisão: .
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:
. - Se preferir todas as casas significativas, pode usar
, 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):
, , , . - Soma:
. - Contador:
. - Média:
. - O laço para porque
é negativo.
Passo 8
Boas práticas que valem na prova:
- Inicializar
e com zero antes do laço. - Verificar o retorno de
para tornar o programa mais robusto. - Tratar o caso sem leituras válidas (contador zero) para evitar divisão por zero.
- Usar casting para
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;
}