nomad_0009 Posted October 28, 2022 at 07:36 PM Share Posted October 28, 2022 at 07:36 PM Olá, colegas programadores. Estou tentando fazer um programa que apresente um menu, e, digitada a tecla 1, leia certos dados (CPF, Nome, e-mail, etc..) com seus determinados testes de consistência, guarde-os em um arquivo binário e repita, quantas vezes for solicitado. O problema: Deve haver uma exclusão lógica no CPF, o usuário não pode digitar o mesmo CPF duas vezes. Apesar de ter montado ela do jeito que o orientador fez, o programa não manda a mensagem de erro quando digito duas vezes o mesmo CPF. Peço ajuda. Aqui está o programa (LINGUAGEM - C++): #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #include<conio.c> #define cor 15 struct estrut1 { float cpf; char nome[40]; char sexo; struct estrut2 { int dia, mes, ano; }dnasc; char email[35]; char excluido; int curso; char p; }agenda; FILE *fp; void mascara_dados(); void salvar_dados(); void digitar_dados(); void abrir_arquivo(); void reiniciar(); int checar_chave_primaria(); int menu(); main() { fflush(stdin); int a; a = menu(); switch(a) { case(1): reiniciar(); break; default: system("cls"); gotoxy(18,10); printf("Alternativa invalida (Pressione qualquer tecla p/ continuar)"); getch(); main(); } } int menu() { int op; textcolor(cor); textbackground(0); system("cls"); gotoxy(18,5);printf("Bem-vindo ao site da VUNESP"); gotoxy(18,6);printf("Selecione uma opcao."); gotoxy(18,7);printf("0 - Sair"); gotoxy(18,10);printf("1 - Cadastro"); gotoxy(15,11);scanf("%d", &op); return op; } void reiniciar() { textcolor(cor); textbackground(0); system("cls"); abrir_arquivo(); digitar_dados(); system("cls"); gotoxy(18,10);printf("Obrigado por utilizar nosso sistema! Boa sorte!"); getch();fflush(stdin); agenda.cpf = 0; agenda.p = ' '; agenda.curso = 0; agenda.sexo = ' '; strcpy(agenda.nome, " "); agenda.dnasc.dia = 0; agenda.dnasc.mes = 0; agenda.dnasc.ano = 0; strcpy(agenda.email, " "); main(); } void salvar_dados() { char conf; textcolor(1); gotoxy(18,17);printf("Confirma os dados para gravacao ? (S/N): "); do { gotoxy(58,17); conf = getchar(); }while( conf != 's' && conf != 'S' && conf != 'n' && conf != 'N' ); if( conf == 's' || conf == 'S' ) { if(fwrite(&agenda, sizeof(agenda), 1, fp) != 1) { gotoxy(18,17);printf("Erro na escrita do arquivo"); } else if(fwrite(&agenda, sizeof(agenda), 1, fp) == 1) { fflush( fp );//descarrega o buffer no disco gotoxy(18,16);printf("Dados salvos com sucesso!"); } }getch(); } void menu_dados(const char *cpf) { system("cls"); textcolor(cor); gotoxy(10,2);printf("Cadastro - Vestibulinho do CTI - Bauru, SP."); gotoxy(10,5);printf("CPF (Pressione 0 para sair.): ",cpf); gotoxy(10,6);printf("Nome: "); gotoxy(10,7);printf("Sexo(F/M)): "); gotoxy(10,8);printf("Data nascimento: / / "); gotoxy(10,9);printf("e-mail: "); gotoxy(10,10);printf("Curso (1 - Mec Noturno; 2 - Eletro Noturno; 3 - Info Noturno)"); gotoxy(16,11); printf("(4 - Mec Diurno; 5 - Eletro Diurno; 6 - Info Diurno)*: "); gotoxy(10,12);printf("Aluno de escola publica? (S/N): "); gotoxy(10,15);printf("*Integrado ao ensino medio"); } int checar_chave_primaria() { int aux,F; float aux_codigo; do { textcolor(cor); gotoxy(39,5);scanf("%f", &aux_codigo); if((aux_codigo < 10000000000) or (aux_codigo > 99999999999)) { gotoxy(18,17);textcolor(4);printf("CPF Invalido!"); getch(); fflush(stdin); gotoxy(18,17);clreol(); gotoxy(39,5);clreol(); } }while(aux_codigo < 10000000000 or aux_codigo > 99999999999); do{ rewind(fp); //reposiciona o ponteiro no início do arquivo F = 0; while(fread( &agenda,sizeof(agenda),1,fp) == 1) { if(agenda.cpf == aux && agenda.excluido == 'n') { //o código existe ou o código foi excluído mas já foi recadastrado: continuar percorrendo o arquivo para levar ponteiro para eof. F = 1; } }/*o arquivo tem que ser percorrido do início ao fim, sempre, para verificar possíveis inserções da mesma chave primária no final do arquivo e também para que o ponteiro fique em EOF, portanto, pronto para nova inclusão ao final. --> Correção de lógica no algoritmo de quando se tentava reincluir um código já deletado!! (Em outubro/2018) <-- */ if( F == 1 ) { fflush(stdin);gotoxy (18,17);printf("** C¢digo j cadastrado ! **",22); getch(); gotoxy(18,17);clreol(); gotoxy(39,5);clreol(); } }while( F == 1 ); return aux_codigo; } void digitar_dados() { menu_dados("CPF"); fflush(stdin); char curso[10]; agenda.cpf=checar_chave_primaria(); do { fflush(stdin); textcolor(cor); gotoxy(15,6);gets(agenda.nome); fflush(stdin); if(strlen(agenda.nome)<=1) { gotoxy(18,17);textcolor(4);printf("Nome invalido!"); getch(); gotoxy(18,17);clreol(); gotoxy(15,6);clreol(); } }while(strlen(agenda.nome)<=1); while(agenda.sexo != 'F' and agenda.sexo !='M' and agenda.sexo !='f' and agenda.sexo!='m') { textcolor(cor); fflush(stdin); gotoxy(22,7);agenda.sexo = getchar();fflush(stdin); if(agenda.sexo!= 'F' and agenda.sexo!='M' and agenda.sexo !='f' and agenda.sexo!='m') { gotoxy(18,17);textcolor(4);printf("Sexo invalido!"); getch(); fflush(stdin); gotoxy(18,17);clreol(); gotoxy(22,7);clreol(); } } while(agenda.dnasc.dia <= 0 or agenda.dnasc.dia > 31 or agenda.dnasc.mes <=0 or agenda.dnasc.mes >12 or agenda.dnasc.ano <= 0 or agenda.dnasc.ano>2022) { textcolor(cor); gotoxy(26,8);scanf("%d",&agenda.dnasc.dia);fflush(stdin); gotoxy(29,8);scanf("%d",&agenda.dnasc.mes);fflush(stdin); gotoxy(32,8);scanf("%d",&agenda.dnasc.ano);fflush(stdin); if (agenda.dnasc.dia <= 0 or agenda.dnasc.dia > 31 or agenda.dnasc.mes <=0 or agenda.dnasc.mes >12 or agenda.dnasc.ano <= 0 or agenda.dnasc.ano>2022) { gotoxy(18,17);textcolor(4);printf("Data invalida!"); getch(); fflush(stdin); gotoxy(18,17);clreol(); textcolor(cor); gotoxy(26,8);clreol();printf(" / / "); } } do { textcolor(cor); fflush(stdin); gotoxy(17,9);gets(agenda.email); if(strlen(agenda.email)==0 or strchr(agenda.email, '@')==NULL or strchr(agenda.email, '.')==NULL) { gotoxy(18,17);textcolor(4);printf("E-mail invalido!"); getch(); fflush(stdin); gotoxy(18,17);clreol(); gotoxy(17,9);clreol(); } }while(strlen(agenda.email)<=1 or strchr(agenda.email, '@')==NULL or strchr(agenda.email, '.')==NULL); while(agenda.curso < 1 or agenda.curso > 6) { fflush(stdin); textcolor(cor); gotoxy(70,11);scanf("%d", &agenda.curso); if (agenda.curso < 1 or agenda.curso > 6) { gotoxy(18,17);textcolor(4);printf("Selecione um dos cursos na tela, por favor."); getch(); fflush(stdin); gotoxy(18,17);clreol(); gotoxy(70,11);clreol(); } } do { textcolor(cor); fflush(stdin); gotoxy(41,12); agenda.p = getchar(); if (toupper(agenda.p)!='S' and toupper(agenda.p)!='N') { gotoxy(18,17);textcolor(4);printf("Digite S(SIM) ou N(não), por favor"); getch(); fflush(stdin); gotoxy(18,17);clreol(); gotoxy(41,12);clreol(); } }while(toupper(agenda.p)!='S' and toupper(agenda.p)!='N'); agenda.excluido='N'; salvar_dados(); } void abrir_arquivo() { if((fp = fopen("arq.bin", "ab+")) == NULL) { gotoxy(18,11);printf("Erro na abertura do arquivo."); exit(1); } } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.