How to store contacts from the agenda I created in an array array and list them? C

Asked

Viewed 2,484 times

1

I’m trying to develop an agenda in C. I would like to know how to store contacts from the agenda I created in an array and list them?

I’m also racking my brain when it comes to listing a phone number... (Follows print)

PLUS I would like tips to improve my code and add new features.

inserir a descrição da imagem aqui

PLUS I would like tips to improve my code and add new features.

Follows the code:

#include <string.h>
#include <conio.h>
#include <stdio.h>

struct agenda {
    int cod;
    char nome[40];
    int tel;
    int vazio; // VAZIO = 0 e DISPONÍVEL = 1
} registros[100];

void cadastrar(int cod, int pos);
int verifica_pos();
int verifica_cod(int cod);
void consultar();
void excluir();
void zerar();

int main() {
    zerar();
    int op=0, retorno, codaux, posicao;
    while(op!=4){
        printf("************ AGENDA ************\n\n\n");
        printf(">>> MENU <<<\n\n");
        printf("1 - CADASTRAR\n");
        printf("2 - CONSULTAR\n");
        printf("3 - EXCLUIR\n");
        printf("4 - SAIR\n\n");
        printf("OPCAO: ");

        scanf("%d", &op);
        fflush(stdin);
        switch(op){
            case 1: {       //CADASTRAR
                posicao = verifica_pos();
                if (posicao != -1){
                printf("\nEntre com o codigo desejado: ");
                scanf("%d", &codaux);
                    fflush(stdin);
                    retorno=verifica_cod(codaux);
                    if(retorno==1)
                        cadastrar(codaux,posicao);
                    else
                        printf("\nCodigo ja existente!");
                }
                else
                    printf("\nA agenda esta cheia!");
            break;
            }

            case 2: {       //CONSULTAR
                consultar();
                break;
            }
            case 3: {
                excluir();
                break;
            }
            case 4: {
                printf("\n\n TCHAU!!");
                break;
            }

    }
}
getch();
}

void cadastrar(int cod, int pos){
    pos = verifica_pos();
    registros[pos].cod = cod;
    printf("\nNOME: ");
    fgets(registros[pos].nome, 40, stdin);
    printf("\nTelefone: ");
    scanf("%d",&registros[pos].tel);
    registros[pos].vazio = 1;
    printf("\nCadastro Realizado com Sucesso!\n\n");    
}

int verifica_pos(){
        int cont=0;
        while(cont<=100){
            if(registros[cont].vazio==0)
            return(cont);
            cont++;
        }
    return(-1);
}

int verifica_cod(int cod){
    int cont=0;
    while(cont<=100){
        if(registros[cont].cod == cod)
        return(0);
        cont++;
    }
    return(1);
}

void consultar(){
    int cont=0, cod;
    printf("\nEntre com o codigo: ");
    scanf("%d", &cod);
    while(cont<=100){
        if(registros[cont].cod == cod){
            if(registros[cont].vazio == 1){
                printf("\nNome: %s", registros[cont].nome);
                printf("\nTelefone: %d\n\n", registros[cont].tel);
                break;
            }
        }
        cont++;
        if(cont>100)
            printf("\nCodigo nao encontrado!\n\n");
}
}

void excluir(){
    int cod, cont=0;
    printf("\nEntre com o codigo do registro que deseja excluir\n");
    scanf("%d",&cod);

    while(cont<=100){
        if(registros[cont].cod == cod)
            if(registros[cont].vazio == 1){
                registros[cont].vazio = 0;
                printf("\nExclusao realizada com sucesso!\n");
                break;
            }
            cont++;
            if(cont>100)
                printf("\nCodigo nao encontrado.\n");
    }
}

void zerar(){
    int cont;
    for(cont=0; cont<=100; cont++){
        registros[cont].vazio=0;
    }
}

2 answers

0


Here are some tips for your code and I gave some examples modifying the original code.

Tips:

1) Try not to create too large functions. The more modularized your code gets, it will be easier to understand, easier to test, easier to fix issues. This is good programming practice

Ex: The function verifica_cadastro was created to better organize the code of the main(), making it smaller and more readable.

2) In several places the code is like this: cont<=100. The lesser or equal(<=) makes the code access from the position 0 until the 100 and this is wrong because the array goes from 0 until 99. To correct, simply replace with cont<100

3) Don’t create global variables!!! This is good programming practice.

Ex: your list of records has now been declared in function main() and is being passed as an argument to the necessary functions.

4) Use the typedef to define a type for your struct. This is good programming practice.

Ex: the struct was created with the typedef, so there had been a new guy called agenda

5) The function verifica_cod checks within all elements if the code does not yet exist. However the code values have not been initialized with 0, so they have memory junk and comparing your code with memory junk can cause errors. To fix just add the line registros[cont].cod=0; within the function zerar().

6) The default c language does not have the boolean type (true or false), so it uses the values 1 and 0 for this. Take the test:

printf("%d",(2>1)); // O resultado será 1 (verdadeiro)
printf("%d",(1>2)); // O resultado será 0 (falso)

Also try to pass a int for a condition, ex:

if(0)
    printf("Imprimiu"); //O 0 é considerado falso, então não imprimirá nada
if(1)
    printf("Imprimiu"); //O 1 é considerado verdadeiro, então a mensagem será impressa
if(738)
    printf("Imprimiu"); //Qualquer outro valor também é considerado como verdadeiro

Then try using this pattern for functions that should return if something is true or false.

Ex: The function verifica_cod says if a code already exists, so it has a return with the values 0 and 1. Thus, you can call the direct function on if(verifica_cod(registros, cod)).

7) The field vazio of his struct is unnecessary. Start all codes with 0, so you fix problem number 5) and can use the code field to control whether a record exists or not. When deleting a record, just set your cod as 0.

More corrections and modifications were made to the code, but are commented within the code itself:

#include <string.h>
#include <conio.h>
#include <stdio.h>

typedef struct agenda {
    int cod;
    char nome[40];
    int tel;
    //int vazio; // VAZIO = 0 e DISPONÍVEL = 1
}agenda;

void verifica_cadastro(agenda registros[]);
void cadastrar(agenda registros[], int cod, int pos);
int verifica_pos(agenda registros[]);
int verifica_cod(agenda registros[], int cod);
void consultar(agenda registros[]);
void excluir(agenda registros[]);
void zerar(agenda registros[]);

int main() {
    agenda registros[100];
    zerar(registros);
    int op=0;
    while(op!=4){
        printf("************ AGENDA ************\n\n\n");
        printf(">>> MENU <<<\n\n");
        printf("1 - CADASTRAR\n");
        printf("2 - CONSULTAR\n");
        printf("3 - EXCLUIR\n");
        printf("4 - SAIR\n\n");
        printf("OPCAO: ");

        scanf("%d", &op);
        fflush(stdin);
        switch(op){
            case 1: {       //CADASTRAR
                verifica_cadastro(registros);
                break;
            }

            case 2: {       //CONSULTAR
                consultar(registros);
                break;
            }
            case 3: {
                excluir(registros);
                break;
            }
            case 4: {
                printf("\n\n TCHAU!!");
                break;
            }

    }
}
getch();
}

// Função que verifica se é possivel cadastrar
void verifica_cadastro(agenda registros[]){
    int codaux, posicao;
    posicao = verifica_pos(registros);
    if (posicao != -1){
        printf("\nEntre com o codigo desejado: ");
        scanf("%d", &codaux);
        fflush(stdin);

        if( verifica_cod(registros, codaux) )
            cadastrar(registros, codaux, posicao);
        else
            printf("\nCodigo ja existente!");
    }
    else
        printf("\nA agenda esta cheia!");
}

void cadastrar(agenda registros[], int cod, int pos){
    //pos = verifica_pos(registros); Linha duplicada, pos já veio com seu valor
    registros[pos].cod = cod;
    printf("\nNOME: ");
    fgets(registros[pos].nome, 40, stdin);
    printf("\nTelefone: ");
    scanf("%d",&registros[pos].tel);
    //registros[pos].vazio = 1;
    printf("\nCadastro Realizado com Sucesso!\n\n");
}

int verifica_pos(agenda registros[]){
        int cont=0;
        while(cont<100){
            if(registros[cont].cod==0)
                return(cont);
            cont++;
        }
    return(-1);
}

int verifica_cod(agenda registros[], int cod){
    int cont=0;
    while(cont<100){
        if(registros[cont].cod == cod)
        return(0);
        cont++;
    }
    return(1);
}

void consultar(agenda registros[]){
    int cont=0, cod;
    printf("\nEntre com o codigo: ");
    scanf("%d", &cod);
    while(cont<100){
        if(registros[cont].cod == cod){
            printf("\nNome: %s", registros[cont].nome);
            printf("\nTelefone: %d\n\n", registros[cont].tel);
            break;
        }
        cont++;
    }
    //O if pode ficar fora do while, pois será executado apenas uma vez
    if(cont==100)
        printf("\nCodigo nao encontrado!\n\n");
}

void excluir(agenda registros[]){
    int cod, cont=0;
    printf("\nEntre com o codigo do registro que deseja excluir\n");
    scanf("%d",&cod);

    while(cont<100){
        if(registros[cont].cod == cod){
            registros[cont].cod = 0; //O código também deve ser zerado
            //registros[cont].vazio = 0;
            printf("\nExclusao realizada com sucesso!\n");
            break;
        }
        cont++;
    }
    //O if pode ficar fora do while, pois será executado apenas uma vez
    if(cont==100)
        printf("\nCodigo nao encontrado.\n");
}

void zerar(agenda registros[]){
    int cont;
    for(cont=0; cont<100; cont++){
        registros[cont].cod=0;
        //registros[cont].vazio=0;
    }
}
  • 1

    Thanks for the tips, Lucas! I hope here I have the luck to meet more people like you. :)

-2

registros[pos].cod = cod;
    printf("\nNOME: ");
   fgets(registros[pos].nome, 40, stdin);

-> how will receive the name without the scanf ??

Browser other questions tagged

You are not signed in. Login or sign up in order to post.