Faça um programa para gerenciar uma agenda de contatos. Para cada contato armazene o nome, o telefone e o aniversário (dia e mês). O programa deve permitir imprimir os aniversariantes do mês.
Sempre que o programa for encerrado, os contatos devem ser armazenados em um arquivo binário. Quando o programa iniciar, os contatos devem ser inicializados com os dados contidos neste arquivo binário.

Passo 1

Definir uma estrutura para representar cada contato contendo nome, telefone, dia e mês de aniversário.

Passo 2

Criar funções para carregar e salvar o vetor de contatos num arquivo binário ao iniciar e ao encerrar o programa. Na função de carregamento, abrir o arquivo em modo “rb”; se existir, ler a quantidade de contatos e depois cada struct Contact. Na função de salvamento, abrir em modo “wb”, gravar primeiro a quantidade e depois o array de contatos.

Passo 3

Implementar função para inserir um novo contato: ler os dados do usuário (com fgets ou scanf), armazenar no próximo índice do vetor e incrementar o contador.

Passo 4

Implementar função para listar aniversariantes de um determinado mês: ler o mês desejado e percorrer o vetor, imprimindo todos os contatos cujo campo month seja igual ao mês lido.

Passo 5

Montar um menu interativo em loop que ofereça as opções: 1) adicionar contato, 2) listar aniversariantes do mês, 3) sair. No case de saída, chamar a função de salvamento antes de terminar.

Passo 6

No início da função main, chamar a função de carregamento para inicializar o vetor de contatos com os dados do arquivo. Manter o vetor e o contador em variáveis globais ou estáticas para serem acessíveis por todas as funções.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CONTATOS 100
#define NOME_LEN 50
#define FONE_LEN 15
typedef struct {
char nome[NOME_LEN];
char telefone[FONE_LEN];
int dia;
int mes;
} Contact;
static Contact agenda[MAX_CONTATOS];
static int total = 0;
const char *ARQ_BIN = “agenda.bin”;
void carregar_contatos() {
FILE *f = fopen(ARQ_BIN, “rb”);
if (f) {
fread(&total, sizeof(int), 1, f);
fread(agenda, sizeof(Contact), total, f);
fclose(f);
}
}
void salvar_contatos() {
FILE *f = fopen(ARQ_BIN, “wb”);
if (!f) {
perror(“Erro ao abrir arquivo para salvar”);
return;
}
fwrite(&total, sizeof(int), 1, f);
fwrite(agenda, sizeof(Contact), total, f);
fclose(f);
}
void adicionar_contato() {
if (total >= MAX_CONTATOS) {
printf(“Agenda cheia!\n”);
return;
}
Contact *c = &agenda[total];
getchar(); // limpar buffer
printf("Nome: ");
fgets(c->nome, NOME_LEN, stdin);
c->nome[strcspn(c->nome, “\n”)] = ‘\0’;
printf("Telefone: ");
fgets(c->telefone, FONE_LEN, stdin);
c->telefone[strcspn(c->telefone, “\n”)] = ‘\0’;
printf(“Dia de nascimento: “);
scanf(”%d”, &c->dia);
printf(“Mes de nascimento: “);
scanf(”%d”, &c->mes);
total++;
printf(“Contato adicionado!\n”);
}
void listar_aniversariantes() {
int mes;
printf(“Informe o mes para listar aniversariantes: “);
scanf(”%d”, &mes);
printf(“Aniversariantes do mes %d:\n”, mes);
for (int i = 0; i < total; i++) {
if (agenda[i].mes == mes) {
printf("%s - %s (%02d/%02d)\n", agenda[i].nome,
agenda[i].telefone,
agenda[i].dia,
agenda[i].mes);
}
}
}
int main() {
int opc;
carregar_contatos();
do {
printf("\n1. Adicionar contato\n");
printf(“2. Listar aniversariantes do mes\n”);
printf(“3. Sair\n”);
printf(“Escolha uma opcao: “);
scanf(”%d”, &opc);
switch (opc) {
case 1:
adicionar_contato();
break;
case 2:
listar_aniversariantes();
break;
case 3:
salvar_contatos();
printf(“Saindo…\n”);
break;
default:
printf(“Opcao invalida!\n”);
}
} while (opc != 3);
return 0;
}

Exercícios relacionados