Para as questões abaixo, suponha que você já tem a struct a seguir:
struct data {
    int dia, mes, ano;
};
struct pessoa {
    char nome[40];
    struct data nasc, admissao, saida;
    int identidade, cpf;
};
e também um vetor de funcionários
struct pessoa funcs [50];
Escreva um algoritmo que imprime uma lista de todas as pessoas que nasceram em 1995.

Passo 1

O enunciado dá as definições de struct e o vetor e pede para imprimir uma lista de todas as pessoas que nasceram em 1995. Informações relevantes que eu peguei do enunciado:
  • As structs dadas são:
struct data {
    int dia, mes, ano;
};
struct pessoa {
    char nome[40];
    struct data nasc, admissao, saida;
    int identidade, cpf;
};
  • Existe um vetor com capacidade para 50 funcionários:
struct pessoa funcs[50];
  • Pedido: imprimir (listar) todas as pessoas cujo campo de ano de nascimento é 1995, isto é, todas as entradas com funcs[i].nasc.ano == 1995.
Observação sobre quantidade: o enunciado não fornece um contador com quantas posições do vetor estão efetivamente preenchidas. Isso é uma informação útil para a implementação prática (usar um n válido). Vou explicar duas opções: (A) função que recebe n (número real de funcionários preenchidos) — ideal e mais segura; (B) assumir que se deve verificar todas as 50 posições — simples mas só é seguro se o vetor estiver devidamente inicializado.

Passo 2

Escolha do método (por que e como): a solução mais direta e básica que funciona em prova é percorrer (iterar) o vetor de structs e, para cada funcionário, verificar o campo do ano de nascimento. Se for igual a 1995, imprime os dados desejados.
Por que esse método?
  • Usa somente construções básicas de C: laço for, acesso ao campo da struct com . e condicional if.
  • É rápido de escrever e de entender na prova.
  • Não exige bibliotecas especiais nem lógica complexa.

Passo 3

Mini-aula sobre os elementos que vamos usar (pouco a pouco, sem pular etapas):
  1. Acesso a campo de struct em um vetor:
  • Se funcs é um vetor de struct pessoa, então o funcionário na posição i é funcs[i].
  • O ano de nascimento desse funcionário é funcs[i].nasc.ano.
  1. Laço for para percorrer um vetor:
  • Sintaxe típica:
for (int i = 0; i < n; i++) {
    // corpo
}
  • i começa em 0 porque os índices em C começam em zero.
  • n é o número de elementos que se deseja verificar; se não houver n, pode-se usar 50 (tamanho do vetor).
  1. Condicional if para filtrar ano:
  • Condição: if (funcs[i].nasc.ano == 1995) { /* imprime */ }
  • O operador == compara igualdade entre inteiros.
  1. Impressão com printf:
  • Para imprimir o nome (array de char) usa-se "%s".
  • Para imprimir dia/mes/ano de modo legível, pode-se usar "%02d/%02d/%d" para que dia e mês apareçam com dois dígitos (ex.: 05/03/1995).
  • Exemplo: printf("%s - %02d/%02d/%d\n", funcs[i].nome, funcs[i].nasc.dia, funcs[i].nasc.mes, funcs[i].nasc.ano);

Passo 4

Estrutura geral da função (explicação passo-a-passo):
  • Definir uma função que recebe o vetor e a quantidade n de funcionários válidos:
    • void imprime1995(struct pessoa funcs[], int n)
  • Dentro da função:
    • Inicializar um contador int encontrados = 0; para saber se encontramos alguém (útil para mensagem caso nenhum seja encontrado).
    • Fazer um for de i = 0 até i < n.
    • Em cada iteração, testar if (funcs[i].nasc.ano == 1995).
    • Se verdadeiro, imprimir nome e data de nascimento (ou outros campos desejados) e incrementar encontrados.
  • Ao final do laço, se encontrados == 0, imprimir uma mensagem como "Nenhuma pessoa nascida em 1995.".
Por que manter n em vez de sempre usar 50?
  • Em programas reais costuma haver menos do que a capacidade máxima. Usar n evita ler lixo em posições não inicializadas.
  • Se não houver n disponível, ainda é possível chamar a função com n = 50, mas isso pressupõe que todas as 50 posições estejam preenchidas corretamente.

Passo 5

Cuidados práticos e pequenas dicas para a prova:
  • Garanta que os nomes estejam terminados em '\0' ao preencher nome, para que printf("%s", ...) não leia lixo.
  • Se o enunciado der um número N de funcionários lidos anteriormente, use esse N como parâmetro n.
  • Se quiser listar também outros campos (identidade, cpf, data de admissão), basta adicionar mais especificadores em printf.
  • Não esqueça de incluir #include <stdio.h> no começo do arquivo.

Passo 6

Exemplo de chamada e integração com main (como usar na prova):
  • Se na sua aplicação existe uma variável int n com a quantidade válida de funcionários, basta chamar:
imprime1995(funcs, n);
  • Se não existe n e for aceitar a suposição “verifica as 50 posições”, chame:
imprime1995(funcs, 50);
  • É bom mostrar na função que ela lida com o caso “nenhum encontrado” para feedback ao usuário.

Passo 7

Resumo final do algoritmo em palavras simples (para decorar na prova):
  • Percorra o vetor de funcionários.
  • Para cada funcionário, verifique funcs[i].nasc.ano == 1995.
  • Se for igual, imprima o nome e a data de nascimento (ou outros dados).
  • Ao terminar, se nenhum foi encontrado, avise com uma mensagem.

Resposta

#include <stdio.h>

struct data {
    int dia, mes, ano;
};
struct pessoa {
    char nome[40];
    struct data nasc, admissao, saida;
    int identidade, cpf;
};

/* Imprime uma lista de todas as pessoas (do vetor funcs) que nasceram em 1995.
   Parâmetros:
   - funcs: vetor de struct pessoa
   - n: número de posições válidas em funcs (use n = 50 se não houver outro contador)
*/
void imprime1995(struct pessoa funcs[], int n) {
    int encontrados = 0;
    for (int i = 0; i < n; i++) {
        if (funcs[i].nasc.ano == 1995) {
            printf("%s - %02d/%02d/%d\n",
                   funcs[i].nome,
                   funcs[i].nasc.dia,
                   funcs[i].nasc.mes,
                   funcs[i].nasc.ano);
            encontrados++;
        }
    }
    if (encontrados == 0) {
        printf("Nenhuma pessoa nascida em 1995.\n");
    }
}

/* Exemplo de uso:
   - Preencher funcs e definir n corretamente antes de chamar.
   - Se todas as 50 posições estiverem preenchidas com dados válidos, chamar com n = 50.
*/
int main(void) {
    struct pessoa funcs[50];
    int n = 0;

    /* Aqui normalmente o programa preencheria funcs[0..n-1] e ajustaria n.
       Como exemplo mínimo, pode-se preencher manualmente uma ou duas entradas.
       Exemplo de preenchimento rápido (opcional):
    */
    /*
    n = 2;
    snprintf(funcs[0].nome, sizeof(funcs[0].nome), "Maria Silva");
    funcs[0].nasc.dia = 10; funcs[0].nasc.mes = 5; funcs[0].nasc.ano = 1995;
    snprintf(funcs[1].nome, sizeof(funcs[1].nome), "Joao Souza");
    funcs[1].nasc.dia = 3; funcs[1].nasc.mes = 11; funcs[1].nasc.ano = 1994;
    */

    /* Chame a função com o número de funcionários válidos.
       Se não houver um contador, e todas as 50 posições forem válidas, use 50.
    */
    imprime1995(funcs, n);

    return 0;
}

Exercícios relacionados