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 :
b) Calcule quantas mulheres são da capital;
b) Calcule quantas mulheres são da capital;
Passo 1
O enunciado pede: “Calcule quantas mulheres são da capital.”
Informações dadas para cada motorista (uma linha de dados por motorista, presumivelmente):
Informações dadas para cada motorista (uma linha de dados por motorista, presumivelmente):
- Ano de nascimento (um número inteiro).
- Sexo, com valores possíveis
(Masculino) ou (Feminino). Vou representar esse campo em texto como ou . - Procedência, com códigos
= Capital, = Interior, = Outro estado.
O que precisa ser retornado: o número total de motoristas cujo sexo é
e cuja procedência é
(Capital).
Observação: o enunciado não especificou formato exacto de entrada (quantas linhas, se há um
inicial, se termina em EOF). Vou assumir a forma mais comum para exercícios: primeiro vem um inteiro
indicando a quantidade de motoristas, seguido de
registros, cada um com os três campos acima, em qualquer separação por espaços/linhas. Não vou pedir mais informação; essa suposição é razoável e simples para a prova.
Passo 2
Escolha do método (alto nível):
Ler um inteiro (número de motoristas). Inicializar um contador em zero. Repetir
vezes: ler os três campos do registro; verificar se o campo sexo é
(aceitando maiúscula/minúscula) e se o campo procedência é
. Se ambas condições forem verdadeiras, incrementar o contador. Ao final, imprimir o valor do contador.
Ler um inteiro
Por que esse método: é direto, usa apenas um laço simples e condições — operações básicas de programação em C que funcionam bem em provas e são eficientes (tempo linear em
).
Passo 3
Estrutura dos dados de entrada e detalhes práticos:
- Primeiro valor: inteiro
(quantidade de registros a seguir). Se , o programa deve responder zero. - Para cada um dos
registros, vamos ler, nessa ordem: ano de nascimento (int), sexo (char) e procedência (int). Exemplo de linha de entrada válida:
1990 F 0 - Ao ler o sexo com scanf use o formato
" %c"(com espaço antes de%c) para consumir possíveis espaços ou quebras de linha anteriores. Para aceitar tantoquanto convertendo para maiúscula, é útil a função toupper()da biblioteca<ctype.h>. - Validação mínima: assumimos que o usuário fornece
valores e que os códigos de procedência são ou . Se quiser, dá para checar e ignorar valores inválidos, mas para a prova geralmente não precisa.
Passo 4
Conceitos C usados (explicação didática, passo a passo):
- Variáveis:
int n— guarda a quantidade de registros a ler.int ano— guarda o ano de nascimento lido (não usado no cálculo, mas parte do registro).char sexo— guarda o caractere lido que indica o sexo.int procedencia— guarda o código de procedência.int contador— acumulador que conta quantas mulheres da capital já foram encontradas; iniciar com0.
- Leitura de entrada:
scanf("%d", &n);lê o inteiro. - Dentro do laço,
scanf("%d %c %d", &ano, &sexo, &procedencia);tenta ler os três campos. Porém, para evitar que um ‘\n’ anterior atrapalhe a leitura do%c, usescanf("%d %c %d", &ano, &sexo, &procedencia);mas garantindo antes que há um espaço no formato ou usar" %c"para o%c:scanf("%d %c %d", &ano, &sexo, &procedencia);com o espaço antes de%c(espaço consome whitespace).
- Comparação de caracteres:
- Depois de ler
sexo, transforme para maiúscula:sexo = toupper((unsigned char) sexo);— assimsexo == 'F'detecta tanto'f'quanto'F'.
- Depois de ler
- Estrutura de repetição:
for (int i = 0; i < n; ++i) { ... }é a forma básica de repetirvezes.
- Condicional:
if (sexo == 'F' && procedencia == 0) contador++;— condição composta com&&(e lógico).
- Saída:
printf("%d\n", contador);imprime o resultado (apenas o número), que é o que a questão requisita.
Exemplo simples manual para testar mentalmente:
- Entrada:
e registros:
1985 F 0
1992 m 0
1978 F 1
2000 f 0 - O programa vai contar 2 (primeiro e quarto registros têm sexo feminino e procedência 0).
Passo 5
Cuidados e pequenas variações que podem ocorrer na prova:
- Se a prova pedir para ler até EOF em vez de ler um
inicial, o mesmo algoritmo funciona trocando o forpor umwhile (scanf("%d %c %d", &ano, &sexo, &procedencia) == 3) { ... }. Aqui eu optei por usar o padrão compor ser o mais comum em exercícios didáticos. - Se quiser ignorar entradas com procedência inválida, adicionar
if (procedencia < 0 || procedencia > 2) continue;. Mas normalmente não é necessário. - Sempre inicializar
contador = 0;antes do laço — esquecer isso é erro clássico.
Passo 6
Resumo do algoritmo em pseudocódigo (bem mastigado, para escrever rápido na prova):
- Ler
. contador := 0- Para
ide1atén:- Ler
ano,sexo,procedencia. - Converter
sexopara maiúscula. - Se
sexo == 'F'eprocedencia == 0entãocontador := contador + 1.
- Ler
- Imprimir
contador.
Resposta
#include <stdio.h>
#include <ctype.h>
int main(void) {
int n;
if (scanf("%d", &n) != 1) return 0; /* lê quantidade de registros */
int contador = 0;
for (int i = 0; i < n; ++i) {
int ano;
char sexo;
int procedencia;
/* Note o espaço antes de %c para consumir whitespace residual */
if (scanf("%d %c %d", &ano, &sexo, &procedencia) != 3) {
/* entrada incompleta; aborta ou quebra */
break;
}
sexo = toupper((unsigned char) sexo);
if (sexo == 'F' && procedencia == 0) {
contador++;
}
}
printf("%d\n", contador);
return 0;
}