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.

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;
}

Exercícios relacionados