Agenda eletrônica completa em C

Publicado por Reginaldo de Matias 16/12/2006

[ Hits: 27.902 ]

Homepage: http://mundodacomputacaointegral.blogspot.com/

Download agenda.cpp




O presente script trata-se de um trabalho final da disciplina de Linguagem de Programação-I (LPG-I). Foi proposto a desenvolver uma agenda eletrônica completa com uso de estruturas (struct) e arquivos. Também verifica se o o número do CPF digitado é válido ou não.

  



Esconder código-fonte

/*****************************************************************************************
    Universidade do Estado de Santa Catarina - UDESC
    Centro de Ciências Tecnológicas - CCT
    Bacharelado em Ciência da Computação - BCC
    Acadêmico: Reginaldo de Matias
    E-mail: reginaldo.matias@gmail.com
    Trabalho Final: Linguagem de Programação - I (LPG-I)
******************************************************************************************/
 
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <stdio.h.>
#define nome_arquivo "dados.txt"
#define temp "temps.bin"
typedef struct endereco
{
 char rua[80];
 char cidade[80];
 char estado[3];
 int numero;
 long cep;
}endereco;
typedef struct veiculo
{
 char nome[80];
 char marca[30];
 char combustivel[40];
 char cor[20];
 char chassis[80];
 char placa[10];
 long ano_modelo;
}veiculo;
typedef struct dados
{
 char nome[80],cpf[15];
 long fone;
 struct endereco *end;
 struct veiculo *carro;
}dados;
int cadastrar(dados *registro);
int mostrar_cadastro(dados *registro, FILE *saida);
int listar_cadastros(FILE *saida, int tipo_lista);
int salvar_cadastros(dados *registro);
int excluir_cadastros();
dados *Buscar_Registro();
int Erro();
main()
{
 char op;
 char subopcao;
   char imprime;
   int resultado;
 dados *registro;
 for(;;)
 {
       system("cls");
          printf("\n\n\t\t+--------------------------------+\n");
          printf("\t\t|             MENU               |\n");
          printf("\t\t+--------------------------------+\n");
          printf("\t\t|\t[1] - Incluir            |\n");
          printf("\t\t|\t[2] - Exluir             |\n");
          printf("\t\t|\t[3] - Buscar             |\n");
          printf("\t\t|\t[4] - Imprimir           |\n");
          printf("\t\t|\t[5] - Creditos           |\n");
          printf("\t\t|\t[6] - Sair               |\n");
          printf("\t\t+--------------------------------+\n\n\n");
   printf("Opcao: ");
      scanf("%s",&op);
  switch (op)
  {
   case '1':
    // ALOCACAO DE MEMO PARA DADOS
    registro = (dados *)calloc(1,sizeof(dados));
    if (!registro) Erro();
    // ALOCACAO DE MEMO PARA END
    registro->end = (endereco *)calloc(1,sizeof(endereco));
    if (!(registro->end)) Erro();
    // ALOCACAO DE MEMO PARA CARRO
                registro->carro = (veiculo *)calloc(1,sizeof(veiculo));
                if (!(registro->carro)) Erro();
    // CHAMADA DA FUNCAO REGISTRO!
    cadastrar(registro);
    // SALVANDO O REGISTRO EM ARQUIVO!
    salvar_cadastros(registro);
    // LIBERACAO DE MEMO DO REGISTRO!
    free(registro);
    break;
   case '2':
       printf("Exclusao de cadastros.\n\n");
    excluir_cadastros();
    printf("\n\nPressione algo para voltar para o menu.");
    // ESPERANDO A DIGITACAO DO USUARIO!
    getch();
    break;
   case '3':
       printf("MENU:\n 1-Listar todo o conteudo do cadastro;\n 2-listar os nomes cadastrados:\n");
       subopcao =getch();
       if (subopcao == '1')
        resultado = listar_cadastros(stdout,0);
       else 
                    if (subopcao == '2')
                        resultado = listar_cadastros(stdout, 1); 
                    else
                        break;
                getch();
       break;
   case '4':
   printf("Buscar por cadastros.\n\n");
            registro = Buscar_Registro();
            if (!registro)
    {
      printf("\n\nPressione algo pra voltar ao menu!.");
      // AGUARDANDO ACAO DO USUARIO!
        getch();
                 break;
                }
    // MOSTRANDO O CADASTRO!
     mostrar_cadastro(registro, stdout);
     // PERGUNTA SE DESEJA IMPRIMIR!
    printf("\n\n CONFIRMA A IMPRESSAO? \n VERIFIQUE SE SUA IMPRESSORA ESTA DEVIDAMENTE INSTALADA!\n (CABOS,CARTUCHOS E SIMILARES). (S/N)");
    imprime = toupper(getche());// NAUM IMPORTA SE `s` EH CARACTERE MAIUSCULO OU MINUSCULO!
    if (imprime == 'S')
    {
                    FILE *stdprint;
        stdprint = fopen("LPT1", "wt");
        mostrar_cadastro(registro,stdprint);
        fprintf(stdprint, "\f");
        fclose(stdprint);
        printf("\nRegistro Impresso!");
                }              
    free(registro);   
    printf("\n\nAPERTE UMA TECLA PARA VOLTAR.");
    // aguarda por comando
    getch();
    break;
    case '5':
        printf("***********************************************\n");
        printf("\n\tAcademico: Reginaldo de Matias\t\n");
        printf("\tCiencia da Computacao - UDESC\t\n");
        printf("***********************************************\n");
        getch();
        break;
   case '6':
       exit(0); // SAI DO PROGRAMA 
    break;
  }//final do switch
 }//fim do for   
}//fim da funcao main
int cadastrar(dados *registro)
{
    int i,j,result,resto,k,result2,resto2,vet[10]; 
    system("cls");
    printf("\nDADOS PESSOAIS\n");
 
    printf("\nNome: ");
 fflush(stdin);
 gets(registro->nome);
 
    for(;;)
    {
 result=0;
 result2=0;
 j=10;
 k=11;
    printf("CPF: ");
 fflush(stdin);
 gets(registro->cpf);
 for(i=0;i<11;i++)
    vet[i]=(registro->cpf[i]-48);
    for(i=0;i<9;i++)
    {
        result=(result+(vet[i]*j));
        j--;
    }
    resto=(result%11);
    for(i=0;i<10;i++)
    {
        result2=(result2+(vet[i]*k));
        k--;
    }
    resto2=(result2%11);
    if(resto<2&&vet[9]==0)
    {
        if((resto2<2&&vet[10]==0)||(resto2>=2&&vet[10]==(11-resto2)))
            break;
        else
            printf("CPF Invalido\n");
    }
    if(resto>=2&&vet[9]==(11-resto))
    {
        if((resto2<2&&vet[10]==0)||(resto2>=2&&vet[10]==(11-resto2)))
            break;
        else
            printf("CPF Invalido\n");
    }
    else
        printf("CPF Invalido\n");
    }
 printf("Telefone: ");
 scanf("%li", ®istro->fone);
 printf("Rua: ");
 fflush(stdin);
 gets(registro->end->rua);
 printf("Numero: ");
 scanf("%i", ®istro->end->numero);
 printf("Cidade: ");
 fflush(stdin);
 gets(registro->end->cidade);
    printf("Estado: ");
 fflush(stdin);
 gets(registro->end->estado);
 
    printf("CEP: ");
 scanf("%li",®istro->end->cep);
 
    system("cls");
    printf("\nDADOS DO VEICULO\n");
    
    printf("\nModelo: ");
 fflush(stdin);
 gets(registro->carro->nome);
 
 printf("Marca: ");
 fflush(stdin);
 gets(registro->carro->marca);
 
    printf("Ano do modelo: ");
 scanf("%li",®istro->carro->ano_modelo);
 
    printf("Cor: ");
 fflush(stdin);
 gets(registro->carro->cor); 
 
    printf("Combustivel: ");
 fflush(stdin);
 gets(registro->carro->combustivel);
 
 printf("Chassis: ");
 fflush(stdin);
 gets(registro->carro->chassis);
 
 printf("Placa: ");
 fflush(stdin);
 gets(registro->carro->placa);
 return(0);
}
// fim da funcao cadastrar
int mostrar_cadastro(dados *registro, FILE *saida)
{
 fprintf(saida, "\nNome: %s", registro->nome);
 fprintf(saida, "\nCPF: %s", registro->cpf);
 fprintf(saida, "\nTelefone: %li", registro->fone);
 fprintf(saida, "\nRua: %s", registro->end->rua);
 fprintf(saida, "\nNumero: %d", registro->end->numero);
 fprintf(saida, "\nCidade: %s", registro->end->cidade);
    fprintf(saida, "\nEstado: %s", registro->end->estado);
    fprintf(saida, "\nCEP: %li",registro->end->cep); 
    fprintf(saida, "\nModelo: %s", registro->carro->nome);
    fprintf(saida, "\nMarca: %s", registro->carro->marca);
    fprintf(saida, "\nAno do modelo: %li", registro->carro->ano_modelo);
    fprintf(saida, "\nCor: %s", registro->carro->cor);
    fprintf(saida, "\nCombustivel: %s", registro->carro->combustivel);
    fprintf(saida, "\nChassis: %s", registro->carro->chassis);
    fprintf(saida, "\nPlaca: %s", registro->carro->placa);
    return(0);
}
//fim da funcao mostrarcadastro
int salvar_cadastros(dados *registro)
{
    // a funcao salvarcadastros já salva ordenado
    // as estruturas vão sendo lidas do arquivo original (dados.txt)
    // e são comparadas com a que se deseja gravar
 FILE *arquivo;
 FILE *arq_temp;
 dados *temp_registro;
 int inseriu = 0;
    
    // aloca a memoria da struct temporaria
 temp_registro = (dados *)calloc(1,sizeof(dados));
 if (!temp_registro) Erro();
 temp_registro->end = (endereco *)calloc(1,sizeof(endereco));
    if (!(temp_registro->end)) Erro();
    temp_registro->carro = (veiculo *)calloc(1,sizeof(veiculo));
    if (!(temp_registro->carro)) Erro();
 arquivo = fopen(nome_arquivo, "r");
 // se o arquivo existir
 if (!(arquivo==NULL)) 
 {
        // abre o arquivo temporario
        arq_temp = fopen(temp, "wb");
        if (!arq_temp) Erro();
     
        fread(temp_registro, sizeof(*temp_registro),1, arquivo);
        fread(temp_registro->end, sizeof(*(temp_registro->end)), 1, arquivo);
      fread(temp_registro->carro, sizeof(*(temp_registro->carro)), 1, arquivo);
      do
     {
         if ((strcmpi(registro->nome, temp_registro->nome) < 0) && (!inseriu))
         {
                // esse é o ponto de inseriro no arquivo temporario
                // só entra aqui uma vez porque está sempre ordenado
                fwrite(registro, sizeof(*registro),1, arq_temp);
          fwrite(registro->end, sizeof(*(registro->end)),1,arq_temp);
                fwrite(registro->carro, sizeof(*(registro->carro)),1,arq_temp);   
                inseriu = 1;
            }
            // imprime o registro temporario
            fwrite(temp_registro, sizeof(*temp_registro), 1, arq_temp);
            fwrite(temp_registro->end, sizeof(*(temp_registro->end)),1,arq_temp);
            fwrite(temp_registro->carro, sizeof(*(temp_registro->carro)),1,arq_temp);
            // le o proximo
            fread(temp_registro, sizeof(*temp_registro),1, arquivo);
            fread(temp_registro->end, sizeof(*(temp_registro->end)), 1, arquivo);
            fread(temp_registro->carro, sizeof(*(temp_registro->carro)), 1, arquivo);
            
        }while (!feof(arquivo));
        // pode ser que tenha que ser inserido após todos
        // então verifica se o registro foi inserido, se não foi insere
        if (!inseriu)
        {
            fwrite(registro, sizeof(*registro), 1, arq_temp);
         fwrite(registro->end, sizeof(*(registro->end)),1,arq_temp);
         fwrite(registro->carro, sizeof(*(registro->carro)),1,arq_temp);
        }
        // fecha os arquivos, deleta o dados.txt e renomeia o temporario
        fclose(arquivo);
        fclose(arq_temp);
        remove(nome_arquivo);
        rename(temp, nome_arquivo);
        remove(temp);
 }
 else
 {
     // se o arquivo não existia ? o primeiro registro então não há com quem comparar
     // mas deve reabrir para escrita
     arquivo = fopen(nome_arquivo, "w");
  fwrite(registro, sizeof(*registro), 1, arquivo);
  fwrite(registro->end, sizeof(*(registro->end)),1,arquivo);
  fwrite(registro->carro, sizeof(*(registro->carro)),1,arquivo);
  fclose(arquivo);
 }
 free(temp_registro);
 return(0);
}
//fim da funcao salvarcadastros
dados *Buscar_Registro()
{
    system("cls"); 
    char nome[80];
 int Achou = 0;
 FILE *arquivo;
 dados *registro;
 
 // aloca memoria para a struct
 registro = (dados *)calloc(1,sizeof(dados));
 if (!registro) Erro();
 // e para o ponteiro para struct interno
 registro->end = (endereco *)calloc(1,sizeof(endereco));
 if (!registro->end) Erro();
 registro->carro = (veiculo *)calloc(1,sizeof(veiculo));
 if (!registro->carro) Erro();
 
 arquivo = fopen(nome_arquivo, "r");
 if (arquivo==NULL)
  {
     printf("Nao ha pessoas cadastradas!");
     free(registro);
     return(NULL);
  } 
    printf("Digite o nome para procurar: ");
    fflush(stdin); 
    gets(nome);
 do
 {
  fread(registro, sizeof(*registro),1, arquivo);
  fread(registro->end, sizeof(*(registro->end)),1,arquivo);
  fread(registro->carro, sizeof(*(registro->carro)),1,arquivo);
  if (!feof(arquivo))
   if (!(strcmpi(registro->nome, nome)))
   {
    Achou = 1;
    break;
   }
 }
 while(!feof(arquivo) && !Achou );
 fclose(arquivo);
 if (!Achou)
 {
  printf("***\nNome: '%s' Nao pode ser encontrado.\n***", nome);
  getch();
  return(NULL);
 }
 return(registro);
}
//fim da funcao BuscarRegistro
int Erro()
{
 printf ("\n** Erro: MEMORIA INADEQUADA OU INSUFICIENTE **");
 getch();
 exit(1);
 // SINAL DE AVISO E SAIDA POSTERIOR!
 return(0);
}
//fim da funcao Erro
int listar_cadastros(FILE *saida, int tipo_lista)
{
    FILE *arquivo;
    dados *registro;
    
 // ALOCACAO DE MEMO PARA A ESTRUTURA    !
 registro = (dados *)calloc(1,sizeof(dados));
 if (!registro) Erro();
 // ALOCACAO DE MEMO PARA O PONTEIRO END!
 registro->end = (endereco *)calloc(1,sizeof(endereco));
 if (!registro->end) Erro();
 // ALOCACAO DE MEMO PARA O PONTEIRO CARRO!
 registro->carro = (veiculo *)calloc(1,sizeof(veiculo));
 if (!registro->carro) Erro();
 arquivo = fopen(nome_arquivo, "r");
 if (arquivo==NULL)
 {
     printf("NENHUM CADASTRO FOI ENCONTRADO !!");
     free(registro);
  return(0);
  }
 // TOPO
    fprintf(saida,"*** LISTA DE CADASTROS ***\n\n");
    fread(registro, sizeof(*registro),1, arquivo);
 fread(registro->end, sizeof(*(registro->end)),1,arquivo);
 fread(registro->carro, sizeof(*(registro->carro)),1,arquivo);
 
    while(!feof(arquivo))
 {
  
     // NO CASO DE SER 0, IMPRIMIRA TODOS OS DADOS!
     if (tipo_lista == 0)
     {
         mostrar_cadastro(registro,saida);
         fprintf(saida, "\n*** ***\n");
        }
       // CASO CONTRARIO, IMPRIMIRA OS NOMES APENAS!
        else
            fprintf(saida, "%s\n", registro->nome);
        fread(registro, sizeof(*registro),1, arquivo);
  fread(registro->end, sizeof(*(registro->end)),1,arquivo);
  fread(registro->carro, sizeof(*(registro->carro)),1,arquivo);
 }
 
 fclose(arquivo);
 free(registro);
 return(1);
}
// FINAL DA FUNCAO QUE LISTA OS REGISTROS!            
int excluir_cadastros()
{
    dados *registro;
    dados *temp_registro;
    FILE *arquivo;
    FILE *arq_temp;
    char confirma;
    temp_registro = (dados *)calloc(1,sizeof(dados));
    temp_registro->end = (endereco *)calloc(1,sizeof(endereco));
    temp_registro->carro = (veiculo *)calloc(1,sizeof(veiculo));
    
    registro = Buscar_Registro();
    
    // testa para ver se eh possivel excluir
    if (!registro)
        return(0);
        
    // exige a confirmacao do usuario para excluir o registo!
    mostrar_cadastro(registro,stdout);
    printf("\n\nConfirmacao:deseja realmente excluir este registro? (S/N)");
    confirma = toupper(getche());
    if (confirma == 'S')
    {
    
        arquivo = fopen(nome_arquivo, "r");
        arq_temp = fopen(temp, "wb");
    
 
      do
     {
         fread(temp_registro, sizeof(*temp_registro),1, arquivo);
          fread(temp_registro->end, sizeof(*(temp_registro->end)),1,arquivo);
          fread(temp_registro->carro, sizeof(*(temp_registro->carro)),1,arquivo);
         // comparacao dos nomes neste ponto  
         if (!feof(arquivo))
             if (strcmpi(temp_registro->nome,registro->nome))
                {
                   fwrite(temp_registro, sizeof(*temp_registro), 1, arq_temp);
                 fwrite(temp_registro->end, sizeof(*(temp_registro->end)),1,arq_temp);
                 fwrite(temp_registro->carro, sizeof(*(temp_registro->carro)),1,arq_temp);
                }
        }while(!feof(arquivo));
 // fecha os todos os dados registrados em arquivo,  renomeia o temp e deleta o agenda.bin
        fclose(arquivo);
        fclose(arq_temp);
        remove(nome_arquivo);
        rename(temp, nome_arquivo);
        remove(temp);
        // testa para ver se o arquvivo ainda possui alguma existencia
        arquivo = fopen(nome_arquivo, "r");
        if (filelength(fileno(arquivo)) == 0)
        {
            // no caso de estar  vazio, apaga!
            fclose(arquivo);
            remove(nome_arquivo);        
        }
        printf("\n\nRegistro Deletado do sistema com sucesso!");
    }
    else
        printf("\n\nTentativa de deletar o registro sem sucesso!");
    
 free(temp_registro);
    free(registro);
}

Scripts recomendados

read_sql_conf

Fwn - Formatador de arquivos .txt

Conversão integral de textos em letras maiúsculas

Conta caracteres

Conversão de arquivos texto entre Windows e Linux


  

Comentários
[1] Comentário enviado por Elessar em 21/12/2006 - 14:57h

Bacana você ter partilhado conosco o source deste programa, mas você desenvolveu ele em Turbo C para Windows, né ?

A lib conio.h não é suportada nativamente no Linux, simplesmente porque ela não segue o padrão ANSI.
Tenta reescrever o código usando curses ou algo do genêro, assim eu posso compilar aqui e ver se ficou legal :)

Valeu !

[2] Comentário enviado por coimbra em 03/01/2007 - 12:25h

Muito bom essa agenda electronica em C++, mas gostaria de saber se consegue fazer uma mas em MATLAB pois estou precisando de ajuda pra fazer uma, eu frequento o 1º ano em Eng Mecanica e tenho a cadeira de computacao e programaçao e um dos projectos e uma agenda electronica em MATLAB e eu n estou conseguindo por isso se me puder ajudar ou outra pessoa qualquer contacta o meu mail : coimbra.mateus@gmail.com
muito obrigado e continuaçao de um bom trabalho

[3] Comentário enviado por cleitonapsouza em 22/09/2009 - 20:15h

Parabéns cara trampo da hora...
principalmente para quem está começando e não sabe que em linguagem c pode gravar em arquivo texto...

[4] Comentário enviado por Tripz90 em 20/11/2010 - 22:59h

Ei mano voce me podia dar uma ajudinha tenho um programa para fazer que é uma agenda elctronica no dev c++ em que consiste em fazer
O programa deve ter o seguinte funcionamento:
1. Quando o programa é iniciado deve perguntar ao utilizador se deseja criar uma nova agenda ou se deseja utilizar uma existente.
a. Caso escolha utilizar uma agenda existente, tem de pedir ao utilizador o caminho completo (inclui o nome do ficheiro txt) do qual deseja carregar os dados. No final de carregar os dados para o programa o ficheiro deve ser fechado.
2. O programa deve permitir:
a. Adicionar novo contacto, caso já esteja no limite dos 25 deve imitir uma mensagem de erro/alerta.
b. Procurar contacto por qualquer um dos campos.
c. Alterar um contacto.
d. Apagar um contacto, caso se apague um contacto do meio da lista não pode ficar espaços em branco na mesma, devem ser puxados para cima os contactos seguintes.
e. Guardar os dados no ficheiro.
i. Caso seja uma agenda nova, deve pedir o nome do ficheiro ao utilizador no qual deseja guardar.
ii. Caso seja uma agenda existente, deve limpar o respectivo ficheiro e guardar os dados novos.
f. Sair, deve sair do programa, enquanto esta opção não for seleccionada pelo utilizador o programa deve voltar sempre ao menu da gestão de contactos.

curtia k me ajudasses percebes bue disso :D

[5] Comentário enviado por notlee em 07/09/2012 - 20:31h

Olá preciso de uma ajuda uma agenda simples só com swite case sem struct chamando o arquivo fope
um grande abraço


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts