Agenda eletrônica feita em C
Publicado por Flávio 13/09/2006
[ Hits: 22.729 ]
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.
#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;
}
Mini-editor de texto intuitivo em ncurses
Agenda eletronica com banco de dados em arquivo texto
Rotinas para manipulaçăo de matrizes
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Warcraft II Remastered no Linux? (4)
O programa assinador digital (5)









