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;

Passo 1

O enunciado pede que a gente faça um programa em C que calcule a porcentagem de motoristas com menos de \,21) anos. Os dados disponíveis, para cada motorista envolvido no acidente, são:
  • Ano de nascimento (ex.: \,1998));
  • Sexo (M ou F) — informação presente, mas não necessária para esta parte;
  • Procedência ( 0 - Capital, 1 - Interior, 2 - 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 \,21).
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) = número de motoristas (se \,n=0) tratamos separadamente).
  • Ler um inteiro \,Y) = ano “atual” usado para calcular idades.
  • Para i=1 até \,n), ler os dados do motorista: ano de nascimento ( \,\text{birth})), sexo ( \,\text{sex})) e procedência ( \,\text{origin})). Nesta parte só precisamos de \,\text{birth}).
Justificativa da escolha:
  • Ler \,n) 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 \,21) anos”:
  • Calcular a idade aproximada como \,\text{age} = Y - \text{birth}).
  • Um motorista conta se e somente se \,\text{age} < 21).
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 \,\text{count}) é o número de motoristas com idade < \,21) e \,n) é o total, a porcentagem é
\text{percent}=\frac{\text{count}}{n}\times 100.
  • Em C, se \,\text{count}) e \,n) forem inteiros, a expressão \,\text{count}/n) 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:
\text{percent} = \left(\text{double}\right)\text{count} / (double)n \times 100.0.
Exemplo numérico simples:
  • Suponha \,n=5) e \,\text{count}=2). Então
\text{percent}=\frac{2}{5}\times 100=40{,}0\%.
Se fizéssemos divisão inteira em C ( 2/5), obteríamos 0 e isso levaria a 0\times100=0, errado.

Passo 5

Algoritmo passo a passo (pseudocódigo):
  1. Ler \,n) (número de motoristas).
  2. Ler \,Y) (ano atual).
  3. Inicializar \,\text{count}=0).
  4. Para i de 1 até \,n):
    a. Ler \,\text{birth}), \,\text{sex}) e \,\text{origin}).
    b. Calcular \,\text{age}=Y-\text{birth}).
    c. Se \,\text{age}<21) então incrementar \,\text{count}).
  5. Se \,n=0) então imprimir \,0{,}00) (ou mensagem apropriada).
  6. Caso contrário, computar \,\text{percent} = (\text{double})\text{count} / (double)n \times 100.0) e imprimir com duas casas decimais.

Passo 6

Detalhes de implementação em C (explicando construções importantes):
  • Tipos: usar \,\text{int}) para contadores e anos; usar \,\text{double}) para a porcentagem.
  • Leitura com \,\text{scanf}): para ler um caractere (sexo) usar formato com espaço antes: \,"%c") geralmente precisa de espaço no formato para pular espaços em branco; usando \,"%d %c %d") o espaço reservado no format cuida disso.
  • Testar retorno de \,\text{scanf}) é boa prática, mas em prova às vezes isso é omitido por simplicidade.
  • Impressão com \,\text{printf}("%.2f\n", percent);) para mostrar duas casas decimais.

Passo 7

Exemplo passo a passo (testando a lógica):
  • Entrada hipotética:
    • \,n=4)
    • \,Y=2023)
    • Registros:
      1. birth = \,2005) → age = \,18) → conta
      2. birth = \,1999) → age = \,24) → não conta
      3. birth = \,2008) → age = \,15) → conta
      4. birth = \,1980) → age = \,43) → não conta
  • Resultado: \,\text{count}=2), \,n=4) → \,\text{percent}=\frac{2}{4}\times100=50{,}00\%).

Passo 8

Casos especiais e validações (o que fazer em prova):
  • Se \,n=0) (nenhum registro), faça guard clause e imprima \,0{,}00) ou mensagem dizendo que não há dados. Evite divisão por zero.
  • Se algum valor de ano de nascimento for absurdo (ex.: \,\text{birth}>Y)), 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 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;
}

Exercícios relacionados