aula 215

Como criar uma agenda de aniversário e salvar em arquivo com C?

Na aula de hoje vamos iniciar uma atividade para praticar um pouco de tudo que temos estudado aqui em nosso Curso de Programação C. Vamos aprender como criar uma agenda de aniversário e salvar em arquivo em C.

Para criar uma agenda de aniversário precisamos de ao menos duas informações: nome e data, certo?

Então, vamos criar uma struct para facilitar a manipulação destes dados. A struct Contado, com nome e três inteiros, dia, mês e ano.

typedef struct{
    char nome[50];
    int dia, mes, ano;
}Contato;

Em memória nossa agenda será um vetor de Contatos. Na função main criaremos o vetor e algumas variáveis para controlar o acesso a nosso vetor, uma com o tamanho do vetor e outra com a quantidade de Contatos já inseridos no vetor.

    Contato *agenda[50];
    int tam = 50, quant = 0;

Uma funcionalidade importante é poder imprimir nossa agenda na tela. Para isso usaremos o procedimento a seguir:

void imprimir(Contato **c, int quant){
    int i;

    printf("\n\t\tLista de Contatos:\n");
    printf("\t--------------------------------\n");
    for(i = 0; i < quant; i++){
        printf("\t%d = %2d/%2d/%4d\t%s\n", i+1, c[i]->dia, c[i]->mes, c[i]->ano, c[i]->nome);
    }
    printf("\t--------------------------------\n");
}

Como nosso vetor é de ponteiros para Contatos e recebemos o endereço inicial do vetor, temos um ponteiro de ponteiro. Observe que o vetor pode ter apenas alguns contatos. Assim, não iremos imprimir todo o vetor, mas apenas a parte preenchida.

Para preencher o vetor vamos fazer uso da função a seguir:

int cadastrar_contato(Contato **c, int quant, int tam){

    if(quant < tam){
        Contato *novo = malloc(sizeof(Contato));

        printf("\nDigite o nome do contato: ");
        scanf("%50[^\n]", novo->nome);
        printf("\nDigite a data de aniversario dd mm aaaa: ");
        scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
        getchar();
        c[quant] = novo;
        return 1;
    }
    else{
        printf("\n\tImpossivel novo cadastro. Vetor cheio!\n");
        return 0;
    }
}

Esta função recebe o endereço do vetor, seu tamanho e a quantidade de Contatos já existentes no vetor. Se a quantidade for menor que o tamanho, significa que ainda há espaço no vetor, então podemos alocar um novo Contato, ler as informações e inseri-lo no vetor.

Outra funcionalidade interessante é poder alterar um Contato já cadastrado, isso será feito com a função a seguir:

void alterar_contato(Contato **c, int quant){
    int id;

    imprimir(c, quant);

    printf("\n\tDigite o codigo do contato que deseja alterar: \n");
    scanf("%d", &id);
    getchar();
    id--;

    if(id >= 0 && id < quant){
        Contato *novo = malloc(sizeof(Contato));
        printf("\nDigite o nome do contato: ");
        scanf("%50[^\n]", novo->nome);
        printf("\nDigite a data de aniversario dd mm aaaa: ");
        scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
        getchar();
        c[id] = novo;
    }
    else
        printf("\n\tCodigo invalido!\n");
}

Perceba que precisamos saber qual Contato o usuário deseja alterar. Para isso usamos o índice do vetor ao imprimir os Contatos. Se o usuário digitar um índice válido, então pedimos os novos dados do Contato e salvamos um novo Contato na posição selecionada pelo usuário.

Nas aulas seguintes veremos como salvar esta agenda em um arquivo texto e, posteriormente, fazer sua leitura.

Código completo em C para a agenda de aniversário

/*
          AGENDA DE ANIVERSÁRIOS

          Código escrito por Wagner Gaspar
          Junho de 2021
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char nome[50];
    int dia, mes, ano;
}Contato;

void imprimir(Contato **c, int quant){
    int i;

    printf("\n\t\tLista de Contatos:\n");
    printf("\t--------------------------------\n");
    for(i = 0; i < quant; i++){
        printf("\t%d = %2d/%2d/%4d\t%s\n", i+1, c[i]->dia, c[i]->mes, c[i]->ano, c[i]->nome);
    }
    printf("\t--------------------------------\n");
}

int cadastrar_contato(Contato **c, int quant, int tam){

    if(quant < tam){
        Contato *novo = malloc(sizeof(Contato));

        printf("\nDigite o nome do contato: ");
        scanf("%50[^\n]", novo->nome);
        printf("\nDigite a data de aniversario dd mm aaaa: ");
        scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
        getchar();
        c[quant] = novo;
        return 1;
    }
    else{
        printf("\n\tImpossivel novo cadastro. Vetor cheio!\n");
        return 0;
    }
}

void alterar_contato(Contato **c, int quant){
    int id;

    imprimir(c, quant);

    printf("\n\tDigite o codigo do contato que deseja alterar: \n");
    scanf("%d", &id);
    getchar();
    id--;

    if(id >= 0 && id < quant){
        Contato *novo = malloc(sizeof(Contato));
        printf("\nDigite o nome do contato: ");
        scanf("%50[^\n]", novo->nome);
        printf("\nDigite a data de aniversario dd mm aaaa: ");
        scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
        getchar();
        c[id] = novo;
    }
    else
        printf("\n\tCodigo invalido!\n");
}

int main(){

    Contato *agenda[50];
    int opcao, tam = 50, quant = 0;

    do{
        printf("\n\t0 - Sair\n\t1 - Cadastrar\n\t2 - Alterar\n\t3 - Imprimir\n\t4 - Salvar\n\t5 - Ler arquivo\n");
        scanf("%d", &opcao);
        getchar();

        switch(opcao){
        case 1:
            quant += cadastrar_contato(agenda, quant, tam);
            break;
        case 2:
            alterar_contato(agenda, quant);
            break;
        case 3:
            imprimir(agenda, quant);
            break;
        case 4:
            
            break;
        case 5:
            
            break;
        default:
            if(opcao != 0)
                printf("\n\tOpcao invalida!!!\n");
        }
    }while(opcao != 0);

    return 0;
}

Deixe um comentário

catorze + 20 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.