O Departamento de trânsito do estado anotou dados de acidentes de trânsito no último ano. Para cada motorista envolvido no acidente, tem-se as seguintes informações:
- Ano de nascimento;
- Sexo (M - Masculino, F - Feminino)
- Procedência ( 0 - Capital, 1 - Interior, 2 - Outro estado);
Faça um programa em C que :
a) Calcule a porcentagem de motoristas com menos de 21 anos;
a) Calcule a porcentagem de motoristas com menos de 21 anos;
Passo 1
O enunciado pede que a gente faça um programa em C que calcule a porcentagem de motoristas com menos de
) anos. Os dados disponíveis, para cada motorista envolvido no acidente, são:
- Ano de nascimento (ex.:
)); - Sexo (M ou F) — informação presente, mas não necessária para esta parte;
- Procedência (
- Capital, - Interior, - Outro estado) — informação presente, mas não necessária para esta parte.
Resumo do que é pedido:
- Entrada: um conjunto de registros de motoristas com pelo menos o ano de nascimento disponível.
- Saída: a porcentagem dos motoristas cuja idade (calculada a partir do ano de nascimento) é estritamente menor que
).
Observação: o enunciado não informa formato exato de entrada (quantos registros, ano atual etc.). A implementação abaixo vai assumir um formato simples e determinístico para a prova: o usuário informa primeiro quantos motoristas serão lidos e o ano atual, e depois vem cada registro (ano de nascimento, sexo, procedência).
Passo 2
Decisão sobre o formato de entrada (escolha feita para ser prática e típica em exercícios de prova):
- Ler um inteiro
) = número de motoristas (se ) tratamos separadamente). - Ler um inteiro
) = ano “atual” usado para calcular idades. - Para
até ), ler os dados do motorista: ano de nascimento ( )), sexo ( )) e procedência ( )). Nesta parte só precisamos de ).
Justificativa da escolha:
- Ler
) deixa o programa bem definido (saber quantas linhas esperar). - Pedir o ano atual evita assumir um ano fixo (isso torna o programa reutilizável em diferentes provas/datasets).
Passo 3
Definição clara do que conta como “menos de
) anos”:
- Calcular a idade aproximada como
). - Um motorista conta se e somente se
).
Observação didática: usamos somente os anos, sem considerar mês/dia de nascimento. Em provas é comum essa simplificação — sempre verifique se o enunciado pede precisão por mês/dia; se pedir, precisaríamos dos meses e dias também.
Passo 4
Fórmula da porcentagem e cuidado com divisão inteira:
- Se
) é o número de motoristas com idade < ) e ) é o total, a porcentagem é
- Em C, se
) e ) forem inteiros, a expressão ) faz divisão inteira (trunca), o que dá errado para a porcentagem. Por isso devemos converter para ponto-flutuante antes da divisão, por exemplo:
Exemplo numérico simples:
- Suponha
) e ). Então
Se fizéssemos divisão inteira em C (
), obteríamos
e isso levaria a
, errado.
Passo 5
Algoritmo passo a passo (pseudocódigo):
- Ler
) (número de motoristas). - Ler
) (ano atual). - Inicializar
). - Para
de até ):
a. Ler), ) e ).
b. Calcular).
c. Se) então incrementar ). - Se
) então imprimir ) (ou mensagem apropriada). - Caso contrário, computar
) e imprimir com duas casas decimais.
Passo 6
Detalhes de implementação em C (explicando construções importantes):
- Tipos: usar
) para contadores e anos; usar ) para a porcentagem. - Leitura com
): para ler um caractere (sexo) usar formato com espaço antes: ) geralmente precisa de espaço no formato para pular espaços em branco; usando ) o espaço reservado no format cuida disso. - Testar retorno de
) é boa prática, mas em prova às vezes isso é omitido por simplicidade. - Impressão com
) para mostrar duas casas decimais.
Passo 7
Exemplo passo a passo (testando a lógica):
- Entrada hipotética:
-
) -
) - Registros:
- birth =
) → age = ) → conta - birth =
) → age = ) → não conta - birth =
) → age = ) → conta - birth =
) → age = ) → não conta
- birth =
-
- Resultado:
), ) → ).
Passo 8
Casos especiais e validações (o que fazer em prova):
- Se
) (nenhum registro), faça guard clause e imprima ) ou mensagem dizendo que não há dados. Evite divisão por zero. - Se algum valor de ano de nascimento for absurdo (ex.:
)), você pode optar por ignorar esse registro ou tratá-lo como não contabilizado; em provas normalmente não pedem esse detalhe, então assuma dados consistentes.
Passo 9
Pequeno incentivo final: calma — seguindo os passos acima você consegue implementar rápido no tempo da prova. Lembre-se do cuidado com divisão inteira em C — é o erro mais comum aqui.
Resposta
#include <stdio.h>
int main(void) {
int n;
int Y;
if (scanf("%d", &n) != 1) return 0; /* lê número de motoristas /
if (scanf("%d", &Y) != 1) return 0; / lê ano atual */
int n;
int Y;
if (scanf("%d", &n) != 1) return 0; /* lê número de motoristas /
if (scanf("%d", &Y) != 1) return 0; / lê ano atual */
int countUnder21 = 0;
for (int i = 0; i < n; ++i) {
int birthYear;
char sex;
int origin;
if (scanf("%d %c %d", &birthYear, &sex, &origin) != 3) return 0;
int age = Y - birthYear;
if (age < 21) ++countUnder21;
}
if (n == 0) {
printf("0.00\n");
} else {
double percent = (double)countUnder21 / (double)n * 100.0;
printf("%.2f\n", percent);
}
return 0;
}