Agenda eletrônica completa em C
Publicado por Reginaldo de Matias 16/12/2006
[ Hits: 27.903 ]
Homepage: http://mundodacomputacaointegral.blogspot.com/
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.
/***************************************************************************************** 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); }
Programinha que busca arquivos
Listar arquivos e diretórios com suas propriedades
Conversão de arquivos texto entre Windows e Linux
Números de caracteres em arquivo
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (12)