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 listar os contatos cujo nome inicia com uma dada letra.
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.
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
O enunciado pede um gerenciador de agenda que guarda nome, telefone e aniversário (dia e mês) de cada contato, permite listar contatos cujo nome começa com uma letra informada e persiste os dados em arquivo binário ao encerrar/reiniciar o programa. Para isso vamos usar struct em C, operações de leitura/gravação em arquivo binário e manipulação de strings.
Passo 2
Definir a estrutura do contato em C. Cada contato terá campos para nome (string), telefone (string) e dois inteiros para dia e mês. Além disso manteremos um vetor dinâmico (ou estático de tamanho máximo) e um contador de contatos.
Passo 3
Implementar a função load_contacts: abre o arquivo binário (por exemplo “agenda.dat”) em modo leitura (“rb”). Se o arquivo existir, ler a quantidade de contatos e em seguida ler todos os registros para popular o vetor em memória. Se não existir, inicializar com zero contatos.
Passo 4
Implementar a função save_contacts: abre (ou cria) o arquivo binário em modo escrita (“wb”), escreve primeiro o número de contatos e depois grava todos os registros do vetor no arquivo.
Passo 5
Implementar a função add_contact: solicita ao usuário nome, telefone, dia e mês, preenche um struct contato e adiciona ao vetor incrementando o contador.
Passo 6
Implementar a função list_by_initial: pede ao usuário uma letra, percorre o vetor de contatos e imprime aqueles cujo nome[0] (convertido para maiúscula) corresponde à letra (convertida para maiúscula).
Passo 7
No main: chamar load_contacts, exibir um menu simples com opções: cadastrar contato, listar por inicial, sair. Em ‘sair’ chamar save_contacts e terminar o programa. Tratar a limpeza de buffer ao ler strings para evitar lixo.
Passo 8
Testar o programa em casos como: nenhum contato no arquivo, apenas um contato, nomes com iniciais minúsculas, vários contatos, e confirmar que os dados são persistidos corretamente no arquivo binário.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_CONTATOS 1000
#define MAX_NOME 100
#define MAX_TELEFONE 20
#define ARQUIVO “agenda.dat”
#define MAX_NOME 100
#define MAX_TELEFONE 20
#define ARQUIVO “agenda.dat”
typedef struct {
char nome[MAX_NOME];
char telefone[MAX_TELEFONE];
int dia;
int mes;
} Contato;
char nome[MAX_NOME];
char telefone[MAX_TELEFONE];
int dia;
int mes;
} Contato;
Contato agenda[MAX_CONTATOS];
int n_contatos = 0;
int n_contatos = 0;
void load_contacts() {
FILE *f = fopen(ARQUIVO, “rb”);
if (f == NULL) return; // nenhum arquivo existente
fread(&n_contatos, sizeof(int), 1, f);
fread(agenda, sizeof(Contato), n_contatos, f);
fclose(f);
}
FILE *f = fopen(ARQUIVO, “rb”);
if (f == NULL) return; // nenhum arquivo existente
fread(&n_contatos, sizeof(int), 1, f);
fread(agenda, sizeof(Contato), n_contatos, f);
fclose(f);
}
void save_contacts() {
FILE *f = fopen(ARQUIVO, “wb”);
if (f == NULL) {
printf(“Erro ao abrir arquivo para salvar.\n”);
return;
}
fwrite(&n_contatos, sizeof(int), 1, f);
fwrite(agenda, sizeof(Contato), n_contatos, f);
fclose(f);
}
FILE *f = fopen(ARQUIVO, “wb”);
if (f == NULL) {
printf(“Erro ao abrir arquivo para salvar.\n”);
return;
}
fwrite(&n_contatos, sizeof(int), 1, f);
fwrite(agenda, sizeof(Contato), n_contatos, f);
fclose(f);
}
void add_contact() {
if (n_contatos >= MAX_CONTATOS) {
printf(“Agenda cheia!\n”);
return;
}
Contato c;
printf("Nome: ");
// limpa buffer antes de fgets
getchar();
fgets(c.nome, MAX_NOME, stdin);
c.nome[strcspn(c.nome, “\n”)] = ‘\0’;
printf("Telefone: ");
fgets(c.telefone, MAX_TELEFONE, stdin);
c.telefone[strcspn(c.telefone, “\n”)] = ‘\0’;
printf(“Dia de aniversario: “);
scanf(”%d”, &c.dia);
printf(“Mes de aniversario: “);
scanf(”%d”, &c.mes);
agenda[n_contatos++] = c;
printf(“Contato adicionado com sucesso!\n”);
}
if (n_contatos >= MAX_CONTATOS) {
printf(“Agenda cheia!\n”);
return;
}
Contato c;
printf("Nome: ");
// limpa buffer antes de fgets
getchar();
fgets(c.nome, MAX_NOME, stdin);
c.nome[strcspn(c.nome, “\n”)] = ‘\0’;
printf("Telefone: ");
fgets(c.telefone, MAX_TELEFONE, stdin);
c.telefone[strcspn(c.telefone, “\n”)] = ‘\0’;
printf(“Dia de aniversario: “);
scanf(”%d”, &c.dia);
printf(“Mes de aniversario: “);
scanf(”%d”, &c.mes);
agenda[n_contatos++] = c;
printf(“Contato adicionado com sucesso!\n”);
}
void list_by_initial() {
char letra;
printf(“Digite a letra inicial: “);
getchar();
scanf(”%c”, &letra);
letra = toupper(letra);
printf(“Contatos com inicial ‘%c’:\n”, letra);
for (int i = 0; i < n_contatos; i++) {
if (toupper(agenda[i].nome[0]) == letra) {
printf(“Nome: %s, Telefone: %s, Aniversario: %02d/%02d\n”,
agenda[i].nome,
agenda[i].telefone,
agenda[i].dia,
agenda[i].mes);
}
}
}
char letra;
printf(“Digite a letra inicial: “);
getchar();
scanf(”%c”, &letra);
letra = toupper(letra);
printf(“Contatos com inicial ‘%c’:\n”, letra);
for (int i = 0; i < n_contatos; i++) {
if (toupper(agenda[i].nome[0]) == letra) {
printf(“Nome: %s, Telefone: %s, Aniversario: %02d/%02d\n”,
agenda[i].nome,
agenda[i].telefone,
agenda[i].dia,
agenda[i].mes);
}
}
}
int main() {
load_contacts();
int opc;
do {
printf("\n— Menu da Agenda —\n");
printf(“1. Cadastrar contato\n”);
printf(“2. Listar por inicial\n”);
printf(“3. Sair\n”);
printf(“Escolha uma opcao: “);
scanf(”%d”, &opc);
switch (opc) {
case 1:
add_contact();
break;
case 2:
list_by_initial();
break;
case 3:
save_contacts();
printf(“Agenda salva. Saindo…\n”);
break;
default:
printf(“Opcao invalida. Tente novamente.\n”);
}
} while (opc != 3);
return 0;
}
load_contacts();
int opc;
do {
printf("\n— Menu da Agenda —\n");
printf(“1. Cadastrar contato\n”);
printf(“2. Listar por inicial\n”);
printf(“3. Sair\n”);
printf(“Escolha uma opcao: “);
scanf(”%d”, &opc);
switch (opc) {
case 1:
add_contact();
break;
case 2:
list_by_initial();
break;
case 3:
save_contacts();
printf(“Agenda salva. Saindo…\n”);
break;
default:
printf(“Opcao invalida. Tente novamente.\n”);
}
} while (opc != 3);
return 0;
}