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:
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)
{
Pergunta
nomad_0009
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:
#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)
Editado por nomad_0009{
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);
}
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.