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 remover contato.
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
Vamos criar um programa em C que mantém uma lista dinâmica de contatos e salva/carrega de um arquivo binário ao iniciar e encerrar.
Passo 2
Defina uma struct para representar um contato, contendo nome, telefone, dia e mês de aniversário:
typedef struct {
char nome[100];
char telefone[20];
int dia;
int mes;
} Contato;
Passo 3
Implemente funções para carregar contatos do arquivo “agenda.bin”. Se o arquivo não existir, comece com lista vazia. Use
fopen
em modo “rb”, fseek
/ftell
ou leitura em loop até fread
retornar diferente de 1.Passo 4
Implemente função para salvar todos os contatos no final do programa, abrindo “agenda.bin” em “wb” e chamando
fwrite
para gravar o array inteiro de contatos.Passo 5
Para gerenciar dinamicamente o array de contatos, use um ponteiro
Contato *agenda
e um contador int n_contatos
. Ao adicionar, faça agenda = realloc(agenda, (n_contatos+1)*sizeof(Contato))
e incremente n_contatos
.Passo 6
Para remover um contato, peça o nome, procure no array, e se encontrar, mova todos os elementos à frente uma posição para trás e reduza
n_contatos
em 1, fazendo realloc
para ajustar o tamanho.Passo 7
Monte um menu de texto num loop
while(1)
com opções: 1) Listar contatos; 2) Adicionar contato; 3) Remover contato; 4) Sair. Após escolher “Sair”, chame a função de salvar e faça free(agenda)
.Passo 8
Compile com
gcc agenda.c -o agenda
e execute: o programa vai ler o arquivo binário existente, permitir operações e gravar as mudanças ao sair.Resposta
Segue o código completo em C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char nome[100];
char telefone[20];
int dia;
int mes;
} Contato;
// Carrega contatos de "agenda.bin" em agenda e retorna número de contatos
int carregar_contatos(Contato **agenda) {
FILE *fp = fopen("agenda.bin", "rb");
if (!fp) return 0; // arquivo não existe ainda
// Descobre quantos contatos existem
fseek(fp, 0, SEEK_END);
long bytes = ftell(fp);
int n = bytes / sizeof(Contato);
rewind(fp);
*agenda = malloc(n * sizeof(Contato));
if (!*agenda) {
fclose(fp);
perror("malloc");
exit(1);
}
size_t lidos = fread(*agenda, sizeof(Contato), n, fp);
if (lidos != (size_t)n) {
fprintf(stderr, "Erro ao ler contatos\n");
exit(1);
}
fclose(fp);
return n;
}
// Salva contatos em "agenda.bin"
void salvar_contatos(Contato *agenda, int n) {
FILE *fp = fopen("agenda.bin", "wb");
if (!fp) {
perror("fopen");
return;
}
fwrite(agenda, sizeof(Contato), n, fp);
fclose(fp);
}
// Lista todos os contatos
void listar(Contato *agenda, int n) {
if (n == 0) {
printf("Nenhum contato cadastrado.\n");
return;
}
for (int i = 0; i < n; i++) {
printf("%d) %s - %s - %02d/%02d\n", i+1,
agenda[i].nome,
agenda[i].telefone,
agenda[i].dia,
agenda[i].mes);
}
}
// Adiciona um contato
Contato *adicionar(Contato *agenda, int *pn) {
Contato c;
printf("Nome: ");
fgets(c.nome, sizeof(c.nome), stdin);
c.nome[strcspn(c.nome, "\n")] = '\0';
printf("Telefone: ");
fgets(c.telefone, sizeof(c.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);
getchar(); // consome \n pendente
Contato *tmp = realloc(agenda, (*pn + 1) * sizeof(Contato));
if (!tmp) {
perror("realloc");
return agenda;
}
agenda = tmp;
agenda[*pn] = c;
(*pn)++;
return agenda;
}
// Remove contato por nome
Contato *remover(Contato *agenda, int *pn) {
char alvo[100];
printf("Nome do contato a remover: ");
fgets(alvo, sizeof(alvo), stdin);
alvo[strcspn(alvo, "\n")] = '\0';
int idx = -1;
for (int i = 0; i < *pn; i++) {
if (strcmp(agenda[i].nome, alvo) == 0) {
idx = i;
break;
}
}
if (idx == -1) {
printf("Contato nao encontrado.\n");
return agenda;
}
// desloca para trás
for (int i = idx; i < *pn - 1; i++) {
agenda[i] = agenda[i+1];
}
(*pn)--;
Contato *tmp = realloc(agenda, (*pn) * sizeof(Contato));
if (tmp) agenda = tmp;
printf("Contato removido.\n");
return agenda;
}
int main() {
Contato *agenda = NULL;
int n_contatos = carregar_contatos(&agenda);
int opc;
do {
printf("\n--- Agenda de Contatos ---\n");
printf("1. Listar contatos\n");
printf("2. Adicionar contato\n");
printf("3. Remover contato\n");
printf("4. Sair\n");
printf("Escolha opcao: ");
scanf("%d", &opc);
getchar(); // consome \n
switch(opc) {
case 1:
listar(agenda, n_contatos);
break;
case 2:
agenda = adicionar(agenda, &n_contatos);
break;
case 3:
agenda = remover(agenda, &n_contatos);
break;
case 4:
salvar_contatos(agenda, n_contatos);
free(agenda);
printf("Saindo...\n");
break;
default:
printf("Opcao invalida\n");
}
} while (opc != 4);
return 0;
}