Ir para conteúdo
Fórum Script Brasil
  • 0

Exclusão lógica


nomad_0009

Pergunta

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)
    {
    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);
    }
}

Editado por nomad_0009
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...