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.
struct data {
int dia, mes, ano;
};
struct pessoa {
char nome[40];
struct data nasc, admissao, saida;
int identidade, cpf;
};
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 condicionalif. - É 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):
- Acesso a campo de struct em um vetor:
- Se
funcsé um vetor destruct pessoa, então o funcionário na posiçãoiéfuncs[i]. - O ano de nascimento desse funcionário é
funcs[i].nasc.ano.
- Laço
forpara percorrer um vetor:
- Sintaxe típica:
for (int i = 0; i < n; i++) {
// corpo
}
icomeça em0porque os índices em C começam em zero.né o número de elementos que se deseja verificar; se não houvern, pode-se usar50(tamanho do vetor).
- Condicional
ifpara filtrar ano:
- Condição:
if (funcs[i].nasc.ano == 1995) { /* imprime */ } - O operador
==compara igualdade entre inteiros.
- 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
nde 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
fordei = 0atéi < n. - Em cada iteração, testar
if (funcs[i].nasc.ano == 1995). - Se verdadeiro, imprimir
nomee data de nascimento (ou outros campos desejados) e incrementarencontrados.
- Inicializar um contador
- 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
nevita ler lixo em posições não inicializadas. - Se não houver
ndisponível, ainda é possível chamar a função comn = 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 preenchernome, para queprintf("%s", ...)não leia lixo. - Se o enunciado der um número
Nde funcionários lidos anteriormente, use esseNcomo parâmetron. - 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 ncom a quantidade válida de funcionários, basta chamar:
imprime1995(funcs, n);
- Se não existe
ne 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;
}