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 :
d) Verifique se existe alguma mulher com idade maior que 60 anos;

Passo 1

O que o enunciado pede: verificar se existe alguma mulher com idade maior que 60 anos entre os motoristas envolvidos nos acidentes.\n
Informações disponíveis para cada motorista (cada registro):\n
  • Ano de nascimento (um número inteiro) \n
  • Sexo (caractere: M para masculino, F para feminino) \n
  • Procedência (valor inteiro: 0 - Capital, 1 - Interior, 2 - Outro estado)\n
    Pergunta específica a responder: “Existe pelo menos uma mulher com idade maior que 60 anos?” — resposta booleana (sim/não), e o programa deve imprimir essa informação.

Passo 2

Como vamos medir “idade”: usamos a fórmula \text{idade} = \text{anoAtual} - \text{anoNascimento}.\n
Explicação dessa fórmula: a idade em anos inteiros é obtida subtraindo o ano de nascimento do ano atual. Por exemplo, se \text{anoAtual}=2025 e \text{anoNascimento}=1959, então \text{idade}=2025-1959=66.\n
Precisamos do valor de \text{anoAtual}. Em C podemos obtê-lo automaticamente usando a biblioteca de tempo (<time.h>) para evitar pedir esse dado ao usuário — assim o programa funciona corretamente em qualquer ano.

Passo 3

Estratégia do programa (passo a passo lógico):\n
  1. Ler quantos registros ( n) serão informados (número de motoristas analisados). \n
  2. Obter o \text{anoAtual} via funções de tempo do sistema. \n
  3. Percorrer os n registros: para cada registro ler \text{anoNascimento}, \text{sexo} e \text{procedencia}. \n
  4. Para cada registro calcular \text{idade} = \text{anoAtual} - \text{anoNascimento}. \n
  5. Verificar a condição: se (\text{sexo} == 'F' \text{ ou } \text{sexo} == 'f') e \text{idade} > 60. \n
  6. Se a condição for verdadeira para algum registro, marcar que “existe” e podemos interromper a leitura (para ganhar tempo). \n
  7. Ao final, imprimir se existe ou não pelo menos uma mulher com idade maior que 60 anos.\n
    Observação sobre leitura do caractere sexo: ao usar \text{scanf} com "%c" é bom colocar um espaço antes do especificador, por exemplo "%c" usado como " %c", para consumir eventuais quebras de linha/espacos deixados pelo teclado.

Passo 4

Tipos de variáveis que usaremos e por quê:\n
  • \text{int anoNascimento}: ano de nascimento é um número inteiro. \n
  • \text{int anoAtual}: ano atual inteiro obtido do sistema. \n
  • \text{int idade}: diferença entre anos, também inteiro. \n
  • \text{char sexo}: guarda um único caractere, 'M' ou 'F'. \n
  • \text{int procedencia}: inteiro 0,1,2 conforme enunciado. \n
  • \text{bool existe} (ou \text{int existe} se preferir C sem <stdbool.h>): flag que indica se já encontramos uma mulher com idade >60. Inicializamos como falso.

Passo 5

Detalhes sobre obter o ano atual em C (explicado para você poder entender e reproduzir na prova):\n
  • Incluímos <time.h>. \n
  • Chamamos \text{time(NULL)} para obter a hora atual em segundos desde a Época. \n
  • Convertendo para a estrutura local com \text{localtime()} obtemos um ponteiro para \text{struct tm}. \n
  • O campo \text{tm_year} da struct contém o número de anos desde 1900. Logo para ter o ano atual em forma humana fazemos \text{anoAtual} = \text{tm\_ptr->tm\_year} + 1900.\n
    Exemplo: se \text{tm\_ptr->tm\_year} = 125, então \text{anoAtual} = 125 + 1900 = 2025.

Passo 6

Condição que usamos para decidir que “existe alguma mulher com idade maior que 60 anos”:\n
(\text{sexo} == 'F' \lor \text{sexo} == 'f') \land (\text{idade} > 60)\n
Explicando: verificamos se o caractere do sexo é F maiúsculo ou f minúsculo (para aceitar ambas), e ao mesmo tempo se a idade calculada excede 60. Se ambas forem verdadeiras, então o registro satisfaz a condição.

Passo 7

Comportamento final do programa e otimização:\n
  • Se encontrarmos uma mulher com idade >60 podemos interromper a leitura cedo usando \text{break} — isso é útil se n for grande.\n
  • Ao final imprimimos uma mensagem clara: por exemplo, “Existe pelo menos uma mulher com idade maior que 60 anos.” ou “Não existe mulher com idade maior que 60 anos.”.\n
  • Vou agora fornecer o programa completo em C que implementa essa lógica. Você pode compilar com \text{gcc} e rodar normalmente.

Resposta

#include <stdio.h>
#include <time.h>
#include <stdbool.h>

int main(void) {
    int n;
    printf("Quantidade de registros a ler: ");
    if (scanf("%d", &n) != 1 || n <= 0) {
        printf("Entrada invalida para a quantidade de registros.\n");
        return 1;
    }

    /* Obter o ano atual */
    time_t t = time(NULL);
    struct tm *tm_ptr = localtime(&t);
    int anoAtual = tm_ptr->tm_year + 1900;

    bool existe = false;
    for (int i = 0; i < n; i++) {
        int anoNascimento;
        char sexo;
        int procedencia; /* 0 - Capital, 1 - Interior, 2 - Outro estado */

        printf("Registro %d - informe: anoNascimento sexo procedencia\n", i+1);
        /* Espaço antes de %c para consumir possiveis espacos/quebras de linha */
        if (scanf("%d %c %d", &anoNascimento, &sexo, &procedencia) != 3) {
            printf("Entrada invalida no registro %d. Encerrando.\n", i+1);
            return 1;
        }

        int idade = anoAtual - anoNascimento;

        if ((sexo == 'F' || sexo == 'f') && idade > 60) {
            existe = true;
            break; /* ja encontramos, podemos parar */
        }
    }

    if (existe) {
        printf("Existe pelo menos uma mulher com idade maior que 60 anos.\n");
    } else {
        printf("Nao existe mulher com idade maior que 60 anos.\n");
    }

    return 0;
}

Exercícios relacionados