Agenda eletrônica feita em C

Publicado por Flávio 13/09/2006

[ Hits: 22.477 ]

Download agenda_eletronica feita em C.cpp




Essa é uma agenda escrita na linguagem C, para um trabalho de minha faculdade. Espero que ajude a muitos, foi utilizado o quicksort como algoritmo de ordenação e a busca binária. Abraço a todos.

  



Esconder código-fonte

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define cabecalho "---------------------------------------------------------\nDoctum - Faculdade Doctum de Cataguases\nTrabalho de Projeto e Analise de Algoritmos\nAlunos: Flávio Procaci, Jonathas Silva\n---------------------------------------------------------\n"

typedef struct {
   unsigned long int codigo;
   char nome[50];
   char endereco[150];
   char telefone[15];
   char email[50];
} contato_t;

/* Variaveis Globais */
contato_t *lista;
unsigned long int numero_de_contatos, codigo_max, i;

/* Declaracao das funcoes */
void limpar_tela (void);
void ler_arquivo (void);
void menu (void);
void procurar_contato (void);
int comparar_nomes (char*, char*);
void adicionar_contato (void);
void inserir_por_nome (contato_t);
void editar_contato (void);
void remover_contato (void);
void apaga_contato (long int);
void listar_nomes (void);
void sair (void);


void swap(contato_t listas[], int ind_um, int ind_dois)
 
{
   contato_t aux;
   
   aux = listas[ind_um];
   listas[ind_um] = listas[ind_dois];
   listas[ind_dois] = aux;
}


int partition(contato_t listas[], int esq, int dir)
{
   int prim = esq-1;
   int ult = dir;

   while (1){
   
      while (comparar_nomes(listas[++prim].nome, listas[dir].nome) < 0)
      ;
      while (comparar_nomes(listas[dir].nome, listas[--ult].nome) < 0)
         if (ult == esq)
            break;
      if (prim >= ult)
               break;
      swap(listas, prim, ult);
   }
   swap(listas, prim, dir);
   return prim;
}


void quicksort(contato_t listas[], int esq, int dir)
{
   int meio;
   if (dir > esq){
      meio = partition(listas, esq, dir);
      quicksort(listas, esq, meio - 1);
      quicksort(listas, meio + 1, dir);
   }
}

int busca_binaria(char chave[])
{
   int limiteInf, limiteSup, metade;

   limiteInf = 0;
   limiteSup = numero_de_contatos;

   while (limiteInf <= limiteSup) {
      metade = (limiteInf + limiteSup)/2;
      if ( comparar_nomes(chave, lista[metade].nome) == 0 )
         return metade;           // retorna somente o indice metade!!!
      if ( comparar_nomes( chave , lista[metade].nome) == -1 )
         limiteSup = metade - 1;
      else
         limiteInf = metade + 1;
   }
    
   return -1;
}

int busca_iguais(int metade, char chave[])
{
   int limiteInf,limiteSup;


   limiteInf = metade; //faz isso pra caso soh existir apenas 1, tanto 
   limiteSup = metade; //o superior quanto o inferior serem o termo encontrado
    
     
   while (limiteInf > 0){ //acha as chaves iguais abaixo
      limiteInf = limiteInf - 1;
      if (comparar_nomes( chave , lista[limiteInf].nome ) == 0 ){}
      else {
         limiteInf = limiteInf + 1;
         break;
      }
   }
   while (limiteSup < (numero_de_contatos-1)){ //acha as chaves iguais acima
      limiteSup = limiteSup + 1;
      if ( comparar_nomes( chave , lista[limiteSup].nome) == 0){}
      else {
         limiteSup = limiteSup - 1;
         break;
      }
   }
   if (limiteInf == limiteSup){ //se forem iguais eh pq so existe 1 q eh a metade
      printf ("%4ld - %s\n", lista[metade].codigo, lista[metade].nome);
      return 1;
   }
   else{
      for ( ;limiteInf <= limiteSup; limiteInf++){ //imprime do menor ao maior do vetor
      printf ("%4ld - %s\n", lista[limiteInf].codigo, lista[limiteInf].nome); 
      }
      return 2;
   } 
}

void limpar_tela ()
{
   system ("clear");
}

void ler_arquivo()
{
   FILE *arquivo;
   numero_de_contatos = codigo_max = 0;
   arquivo = fopen("dados", "a"); /* Cria o arquivo caso ele nao exista */
   fclose(arquivo);
   arquivo = fopen("dados", "r");
   fscanf (arquivo, "%ld %ld\n\n", &numero_de_contatos, &codigo_max);

   lista = malloc(numero_de_contatos * sizeof(contato_t) );

   for (i = 0; i < numero_de_contatos; i++){
      fscanf(arquivo, "%ld\n%[^\n]\n%[^\n]\n%[^\n]\n%[^\n]\n\n", &lista[i].codigo, lista[i].nome, lista[i].endereco, lista[i].telefone, lista[i].email);
   }
   fclose(arquivo);
}

void menu ()
{
   char opcao[10];
   
   while (1){
      printf ("Escolha uma opcao:\n[P]rocurar por um Contato\n[A]dicionar um Contato\n[E]ditar um Contato\n[R]emover um contato\n[L]istar Nomes\n[S]air\n\n");
      printf (">> ");
      gets(opcao);
      switch (opcao[0]){
         case 'p':
         case 'P':
            procurar_contato();
            break;
         case 'a':
         case 'A':
            adicionar_contato();
            break;
         case 'e':
         case 'E':
            editar_contato();
            break;
         case 'r':
         case 'R':
            remover_contato();
            break;
         case 'l':
         case 'L':
            listar_nomes();
            break;
         case 's':
         case 'S':
            sair();
         default:
            limpar_tela();
            printf("Opcao invalida!!!\n\n");
      }
   }
}

void procurar_contato()
{
   char nome_procurado[50];
   long int posicao, codigo_view, count = 0;
   int metade;
   posicao = -1;

   limpar_tela ();

   printf ("Qual nome deseja procurar?\n>> ");
   gets(nome_procurado);
   limpar_tela ();
   
   metade = busca_binaria(nome_procurado);
   if (metade == -1){
      printf ("\nO contato procurado nao existe.\n\n");
      return;
   }
   count = busca_iguais(metade,nome_procurado);
   
   if (count > 1){
      do{
         printf ("\nDigite o codigo do contato que deseja obter mais detalhes:\n>> ");
         scanf ("%ld", &codigo_view);
         limpar_tela ();
         for (i = 0; i < numero_de_contatos; i++)
            if (codigo_view == lista[i].codigo){
               posicao = i;
               break;
            }
         if (posicao == -1){
            printf ("Codigo inexistente.\n");
         }
      }while(posicao == -1);
      printf ("\nNome: %s\nEndereco: %s\nTelefone: %s\nE-mail: %s\n\n", lista[posicao].nome, lista[posicao].endereco, lista[posicao].telefone, lista[posicao].email);
      gets (nome_procurado);
   }
   else
   printf ("\nNome: %s\nEndereco: %s\nTelefone: %s\nE-mail: %s\n\n", lista[metade].nome, lista[metade].endereco, lista[metade].telefone, lista[metade].email);
   return;
}


int comparar_nomes (char *nome1, char *nome2)
{
   int c;
   
   for (c=0; c < strlen(nome1); c++) {
      if (toupper(nome1[c]) < toupper(nome2[c])) {
         return -1;
      }
      else if (toupper(nome1[c]) > toupper(nome2[c])) {
         return 1;
      }
   }
   return 0;
}



void adicionar_contato ()
{
   contato_t novo;
   codigo_max++;
   numero_de_contatos++;
   novo.codigo = codigo_max;
   limpar_tela ();
   printf ("Nome: ");
   gets (novo.nome);
   printf ("Endereco: ");
   gets (novo.endereco);
   printf ("Telefone: ");
   gets (novo.telefone);
   printf ("E-mail: ");
   gets (novo.email);
   lista = realloc(lista, numero_de_contatos * sizeof(contato_t));
   inserir_por_nome(novo);
}

void inserir_por_nome(contato_t novo)
{
   unsigned long int posicao = (numero_de_contatos-1);
   
   lista[posicao] = novo;
   quicksort(lista,0,posicao);
   limpar_tela ();
   puts("Contato inserido com sucesso!\n");
   return;
}


void editar_contato ()
{
   long int codigo_edit, posicao;
   char aux[50];
   posicao = -1;
   
   limpar_tela();
   puts ("Cod. | Nome");
   for (i = 0; i < numero_de_contatos; i++){
      printf ("%4ld - %s\n", lista[i].codigo, lista[i].nome);
   }
   printf ("\nTotal de contatos: %ld\n\n", numero_de_contatos);
   do{
      printf("Insira o codigo do contato a ser editado ou digite zero(0) para voltar: ");
      scanf("%ld", &codigo_edit);
      if( codigo_edit == 0){
         return;
      }
      for(i = 0; i < numero_de_contatos; i++)
         if(codigo_edit == lista[i].codigo){
            posicao = i;
            break;
         }
      if(posicao == -1){
         printf("Codigo inexistente.\n");
      }
   }while( posicao == -1);
   printf("\nNome: %s\nEndereco: %s\nTelefone: %s\nE-mail: %s\n\n", lista[posicao].nome, lista[posicao].endereco, lista[posicao].telefone, lista[posicao].email);
   puts("Digite os novos dados para altera-los ou pressione\nENTER para manter os dados originais:\n");
   gets(aux);
   printf("Nome: ");
   gets(aux);
   if(strlen(aux) > 0){
      strcpy(lista[posicao].nome, aux);
   }
   printf("Endereco: ");
   gets(aux);
   if(strlen(aux) > 0){
      strcpy(lista[posicao].endereco, aux);
   }
   printf("Telefone: ");
   gets(aux);
   if(strlen(aux) > 0){
      strcpy(lista[posicao].telefone, aux);
   }
   printf("E-mail: ");
   gets(aux);
   if(strlen(aux) > 0){
      strcpy(lista[posicao].email, aux);
   }
   limpar_tela();
   puts("Dados alterados com sucesso.\n");
   quicksort(lista,0, (numero_de_contatos-1) );
   return;
}

void remover_contato ()
{
   long int codigo_remove, posicao;
   char opcao[100];
   posicao = (-1);
   
   limpar_tela ();
   
   if (numero_de_contatos == 0){
      puts ("Nao existem contatos para serem removidos.\n");
      return;
   }
   puts ("Cod. | Nome");
   for (i = 0; i < numero_de_contatos; i++){
      printf ("%4ld - %s\n", lista[i].codigo, lista[i].nome);
   }
   printf ("\nTotal de contatos: %ld\n\n", numero_de_contatos);
   do{
      printf ("Insira o codigo do contato a ser removido: ");
      scanf ("%ld", &codigo_remove);
      for (i = 0; i < numero_de_contatos; i++)
         if (codigo_remove == lista[i].codigo){
            posicao = i;
            break;
         }
      if (posicao == (-1)){
         printf ("\aCodigo inexistente.\n");
      }
   }while(posicao == -1);
   
   invalido:
   printf ("\nDeseja mesmo remover o seguinte contato?\n\nNome: %s\nEndereco: %s\nTelefone: %s\nE-mail: %s\n\n[S]im\n[N]ao\n\n>> ", lista[posicao].nome, lista[posicao].endereco, lista[posicao].telefone, lista[posicao].email);
   
   gets (opcao);
   switch (opcao[0]){
      case 's':
      case 'S':
         apaga_contato (posicao);
         limpar_tela ();
         puts ("Contato removido com sucesso.\n");
         break;
      case 'n':
      case 'N':
         limpar_tela ();
         break;
      default:
         limpar_tela ();
         goto invalido;
   }
   return;
}

void apaga_contato (long int posicao)
{
   for (i = posicao; i < (numero_de_contatos - 1); i++){
      lista[i] = lista[i+1];
   }
   numero_de_contatos--;
   lista = realloc (lista, numero_de_contatos * sizeof (contato_t));
}

void listar_nomes ()
{
   long int posicao, codigo_view;
   char opcao[1];
   posicao = -1;
   
   limpar_tela();
   puts ("Cod. | Nome");
   for (i = 0; i < numero_de_contatos; i++){
      printf ("%4ld - %s\n", lista[i].codigo, lista[i].nome);
   }
   printf ("\nTotal de contatos: %ld\n\n", numero_de_contatos);
   if (numero_de_contatos > 0){
      printf ("Digite o codigo do contato que deseja obter mais detalhes:\n>> ");
      do{
         scanf ("%ld", &codigo_view);
         for(i = 0; i < numero_de_contatos; i++)
            if (codigo_view == lista[i].codigo){
               posicao = i;
               break;
            }
         if (posicao == -1){
            printf ("Codigo inexistente. Digite um codigo acima.\n>> ");
         }
      }while(posicao == -1);
      limpar_tela();
      printf ("Nome: %s\nEndereco: %s\nTelefone: %s\nE-mail: %s\n\n", lista[posicao].nome, lista[posicao].endereco, lista[posicao].telefone, lista[posicao].email);
      gets(opcao);
   }
   return;
}

void sair ()
{
   FILE *arquivo;
   arquivo = fopen ("dados", "w");
   fprintf (arquivo, "%ld %ld\n\n", numero_de_contatos, codigo_max);
   for (i = 0; i < numero_de_contatos; i++){
      fprintf (arquivo, "%ld\n%s\n%s\n%s\n%s\n\n", lista[i].codigo, lista[i].nome, lista[i].endereco, lista[i].telefone, lista[i].email);
   }
   fclose (arquivo);
   free (lista);
   limpar_tela ();
   exit(0);
}

int main()
{
   limpar_tela ();
   ler_arquivo ();
   puts (cabecalho);
   menu ();
   return 0;
}

Scripts recomendados

Sorteio

Números Pseudos Aleatórios

Menu animado

Classe para MySQL

[C] Parâmetros para printf


  

Comentários
[1] Comentário enviado por txutxucao em 01/12/2012 - 17:35h

tem como você fazer uma agenda dessa usando estrutura de pilha?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts