Ir ao conteúdo
  • Cadastre-se
48rneves15

Galera estou com um problema de busca recursiva e busca binaria

Recommended Posts

Alguem pode me ajudar com a busca binaria e a busca recursiva e com apagar um elemento struct do vetor em C.

 

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <time.h>
#include <windows.h>

///Teste para verificar sistema operacional Windows ou Linux
#ifdef __WIN32 ///para uso no Windows
#define limpatela "cls"
#else ///para uso no Linux
#define limpatela "clear"
#endif 

static int tam_vetor=0;




/** definindo o tamanho dos vetores das strings*/
#define TAM 60

/** definindo tamanho máximo para o cadastro*/
#define MAX 10

/** Estrutura cadastro pessoa*/
typedef struct registro{
    int cod;
    char nome[TAM];
    int cpf;
    int idade;
    char sexo;
    char endereco[TAM];
    int cep;
    char cidade[TAM];
    char estado[TAM];
    char cargo[TAM];
    int celular;
    char email[TAM];
   struct registro *prox;
}REG_FUNCIONARIO;

/** Criando um vetor struct para o registro*/
REG_FUNCIONARIO cadastro[MAX];

/** Protótipo da Funções*/
void pause();
void time_sleep();
void date_horas();
void dados_empresa();
void menu();
void opcao_menu(int op);
void novo_cadastro();
void exibir_tudo();
void menu_busca();
void busca_nome();
void busca_recursiva(REG_FUNCIONARIO cadastro[],int tamanho,int pesq);
void busca_idade();
void ordenar_idade();
int busca_binaria_codigo();
void bus_bin();



int main(void){
    setlocale(LC_ALL,"portuguese"); ///Definindo a linguagem
    system("color 3f");
    int tecla; ///variável de teste
    dados_empresa();///chama a função com os dados da empresa fictícia
    printf("\n\n\n\n\n\n\t\t\t\t\t\t\tBEM VINDO\n");
    printf("\t\t\t\t\estão PROGRAMA DE CADASTRO DE FUNCIONÁRIOS\n\n\n\n\n\n");
    printf("\n\n\n\n\t\t\t\t\t    Precione <ENTER> para iniciar!\n");
    tecla=getchar();///recebe o valor digitado
    if(tecla){
        menu();
    }
    return 0;
}


///Uso estético
void pause(){
    printf("\n\n\n\n\n\n\n\n\t\t\tPrecione ENTER para continuar...\n");
    getchar();///espera um digito
}
///Uso estético
void time_sleep(){
    printf("\n\n\t\t\tAguarde Carregando...\n");
    Sleep(1000);///gera um tempo de espera
}
///Uso estético
void date_horas(){
    printf("\t\t\t%s, %s\n",__DATE__,__TIME__);
}
/** Declarando um ponteiro de acesso para o arquivo */
FILE *fpessoa;

/** Dados de uma empresa fictícia */
void dados_empresa(){
    char nome[]="NR MARKETING & LOGÍSTICA LTDA - ME";
    char endereco[]="Av. josé Costa nº 23, BAIRRO: Cohama";
    char cidade[]="São Luís - MA";
    int fone=43216789;
    char cnpj[]="CNPJ 9567823410/0001-32";
    char IE[]="IE 4321.321.567.98";
    char email[]="E-mail: nrmarketing@logistica.com.br";
    printf("\n");
    date_horas(); ///imprime data e hora
    printf("\t\t\t*********************************************************************\n");
    printf("\t\t\t\t\t %s\n",nome);
    printf("\t\t\t\t %s, %s\n",endereco,cidade);
    printf("\t\t\t\t    %s, %s\n",cnpj,IE);
    printf("\t\t\t       Telefone %d, ",fone);
    printf("%s\n",email);
    printf("\t\t\t*********************************************************************\n");
}
/** função menu de opções */
void menu(){
    system(limpatela);
    int opc;
    dados_empresa();///exibe dados empresa fictícia
    puts("\n\n");
    printf("\n\n\t\t CADASTRO  DE FUNCIONÁRIOS \n\n");
    puts(" \t\t\t 1 -> NOVO CADASTRO");
    puts(" \t\t\t 2 -> EXIBIR CADASTRO");
    puts(" \t\t\t 3 -> PESQUISA CADASTRO");
    puts(" \t\t\t 4 -> ORDENAR");
    puts(" \t\t\t 5 -> REMOVER CADASTRO");
    puts(" \t\t\t 6 -> ZERAR CADASTRO");
    puts(" \t\t\t 0 -> SAIR\n");
    printf("\t\t Escolha uma opção: ");///recebe a opcao do menu
    scanf("%d",&opc);fflush(stdin);///limpar o buffer do teclado
    opcao_menu(opc);///passa o valor da opção
}
/** função verificar valor da opção */
void opcao_menu(int op){
    switch(op){
        case 1:/// INSERIR
            system(limpatela);
            novo_cadastro();
        break;
        case 2:///--------EXIBIR
            system(limpatela);
            exibir_tudo();
        break;
        case 3:///--------BUSCA
            system(limpatela);
            menu_busca();
        break;
        case 4:///--------ORDENAÇÃO
            system(limpatela);
            ordenar_idade();
        break;
        case 6:///--------ZERAR CADASTROS
            system(limpatela);
            remove("DADOs.bin");
        break;
        case 0:///--------FECHA PROGRAMA
            system(limpatela);
            dados_empresa();
            printf("\n\n\n\n\t\t\t\t\t\tAté Breve!\n\n\n\n");
            exit(1);
        default:///-------NO CASO OPCÃO DIFERENTE
            system("cls");
            printf("\n\n\t\t\tOpção Invalida!\n");
            pause();
            system(limpatela);
            menu();///retorna ao menu
    }
}

/** função INSERIR novo elemento */
void novo_cadastro(){
    char sn;///variável de teste
    system(limpatela);
    fpessoa=fopen("DADOs.bin","a+b"); ///abri o arquivo
    if(fpessoa==NULL){
        printf("\n\n\t\t\tERRO: Arquivo vazio!\n");
        pause();
        menu();///retorna ao menu
    }
    int rfve,i=0;///variaveis de controle
    dados_empresa();
    if(!cadastro){///verificar o espaço do vetor struct
        printf("\n\n\t\t\tMemória Indisponível\n");
        pause();
        menu();
    }
    int x=0;///variável de controle
    fseek(fpessoa,0,SEEK_END);///move a posição de leitura para o fim do arquivo
        x=ftell(fpessoa);///recebe quantidade de byte do arquivo possui
    if(x==0){
        cadastro.cod=1;///recebe valor 1 para o primeiro cadastro
    }else{
        /// Posiciona a leitura do arquivo para o inicio
        fseek(fpessoa,x-sizeof(struct registro),SEEK_SET);
        /// Ler os dados gravados em binário
        fread(&cadastro,sizeof(struct registro),1,fpessoa);
        /// recebe mais 1 e incrementa para cada novo
        cadastro.cod=cadastro.cod+1;
    }

    ///recebe os dados de uma nova pessoa
    printf("\nCADASTRO DE FUNCIONÁRIO\n");fflush(stdin);
    printf("Nome: ");gets(cadastro.nome); fflush(stdin);
    printf("Idade: ");scanf("%d",&cadastro.idade);fflush(stdin);
    //printf("Endereço: ");gets();fflush(stdin);
    // printf("Cidade: ");gets();fflush(stdin);
    printf("Cep: ");scanf("%d",&cadastro.cep); fflush(stdin);
    // printf("");gets();fflush(stdin);
    fseek(fpessoa,0,SEEK_END);
    ///Salva os dados no arquivo
    rfve=fwrite(&cadastro,sizeof(struct registro),1,fpessoa);
    if(rfve==1){ ///verifica se está sendo salvo
        system(limpatela);
        printf("\n\n\n\t\t\t\tSalvo com sucesso!\n");
        printf("\n\n\n\n\t\t\tDESEJA CADASTRAR NOVO ?[s/n] ");
        scanf("%c",&sn);fflush(stdin);
    }else{
        system(limpatela);
        printf("\n\n\n\t\t\tNão foi possível salvar!\n");
        pause();
    }
    i++;
    tam_vetor++;
    fclose(fpessoa);///fecha o arquivo
    if(sn=='s'||sn=='S'){
        system(limpatela);
        time_sleep();
        system(limpatela);
        novo_cadastro();
    }else{ /// senão nao desejar continuar
        system(limpatela);
        time_sleep();
        system(limpatela);
        menu(); /// retorna ao menu
    }
}
/** função EXIBIR dados gravados */
void exibir_tudo(){
    system(limpatela);
    fpessoa=fopen("DADOs.bin","r+b");///abri o arquivo
    if(fpessoa==NULL){
        printf("\n\n\n\t\t\tERRO: Arquivo vazio!\n");
        pause();
        menu();
    }
    time_sleep();
    system(limpatela);
    int rfve,i=0;///variáveis de controle
   /** FALTA===============================================================
        organizar a exibição dos dados, os dados devem aparecer lado a lado
        com suas demais itens dos cadastros.
   =========================================================================*/
    printf("\n\t\t\tLISTANDO TODOS OS REGISTROS\n\n\n");
    rfve=fread(cadastro,sizeof(struct registro),1,fpessoa);///ler os dados gravados
    while(rfve==1){///verifica se é verdadeiro e exibe
        printf("\t\tCodigo: %d\n",cadastro.cod);
        printf("\t\tNome: %s\n",cadastro.nome);
        printf("\t\tIdade: %d\n",cadastro.idade);
        printf("\t\tCep: %d\n",cadastro.cep);
        i++; ///incrementa
        rfve=fread(&cadastro,sizeof(struct registro),1,fpessoa);/// refaz a leitura
        printf("\n");
        break;
        }
        fclose(fpessoa); ///fecha o arquivo
    pause();
    menu();///retorna ao menu
}

/// Menu de seleção de busca
void menu_busca(){
    int op;
    dados_empresa();
    printf("\n\n\t\t\t*************************************\n");
    printf("\t\t\t\tCOMO DESEJA PROCURAR?\n");
    printf("\t\t\t*************************************\n");
    printf("\n\t\t\t\t 1 -> Nome\n");
    printf("\t\t\t\t 2 -> Idade\n");
    printf("\t\t\t\t 3 -> E-mail\n");
    printf("\t\t\t\t 4 -> Celular\n");
    printf("\t\t\t\t 5 -> Código\n");
    printf("\t\t\t\t 0 -> Voltar\n");
    printf("\n\n\t\t\t\tDigite a opção: ");
    scanf("%d",&op);fflush(stdin);

    switch(op){
        case 1:/// --------BUSCAR POR NOME E CPF
            system(limpatela);
            busca_nome();
            break;
        case 2:/// --------BUSCA POR IDADE
            system(limpatela);
            busca_idade();
            break;
        case 3:/// --------BUSCA POR E-MAIL
            system(limpatela);
            break;
        case 5:/// --------BUSCA POR NUMERO DE CELULAR
            system(limpatela);
             bus_bin();
            break;
        case 0:/// --------RETORNAR AO MENU PRINCIPAL
            system(limpatela);
            menu();
        default:/// -------DIGITO ERRADO
            system(limpatela);
            printf("\n\n\t\t\t=================================\n");
            printf("\t\t\t\tOpção inválida ");
            printf("\t\t\t\tTente Novamente!\n");
            printf("\t\t\t=================================\n");
            pause();
            system(limpatela);
            menu_busca();
            break;
    }
}
/** Função busca pelo nome */
void busca_nome(){
    system(limpatela);
    fpessoa=fopen("DADOs.bin","r+b");///abri o arquivo
    if(fpessoa==NULL){ ///verifica a existencia do arquivo
        printf("\n\n\t\t\tERRO: Arquivo vazio!\n");
        pause();
        menu();
    }
    else{
        char npesquisa[30];///variável recebe nome de pesquisa
        int n_cpf;
        int rfve,i=0,veri=0;///variável de controle
        rfve=fread(cadastro,sizeof(struct registro),1,fpessoa);///ler o arquivo
        printf("\n\n\tDIGITE O NOME: ");
        gets(npesquisa);fflush(stdin);///recebe o nome de busca
       // printf("\n\n\tDIGITE O CPF: ");
       // scanf("%d",&n_cpf);fflush(stdin);///recebe o CPF de busca
    time_sleep();
    system(limpatela);
    rewind(fpessoa);///retorna ao inicio do arquivo
    while(1){
        rfve=fread(&cadastro,sizeof(struct registro),1,fpessoa);///ler o arquivo
        if(rfve==0)///verifica se é falso
            break; ///encerra
            ///compara os nomes e o CPF
        if((strcmpi(cadastro.nome,npesquisa)==0)){
            printf("Nome: %s\n",cadastro.nome);
            printf("cep: %d\n",cadastro.cep);
            veri=1;///atribui o valor 1 para ser verdadeiro
            break;
        }
        i++;///incrementa
    }
    if(veri==0){///se valor continuar com 0 será falso
        printf("\n\n\t\tNao encontrado!\n");
    }
    fclose(fpessoa);///fecha o arquivo
    }
    pause();
    menu_busca();
}
///****************************************/////*
/*void busca_recursiva(struct registro cadastro[],int tamanho,int pesq){
    while(inicio<=fim){
        rn=fread(&cadastro,sizeof(struct registro),1,fpessoa);
        int meio;
        meio=(inicio+fim)/2;
        if(cadastro[meio].idade==pesq){
            return meio;
        }else if(cadastro[meio].idade<pesq){
            return busca_binaria_recursiva(meio+1,fim,pesq);
        }else{
            return busca_binaria_recursiva(inicio,meio-1,pesq);
        }
    }
    return -1;
}
*/
/** Função busca por idade */
void busca_idade(){
    system(limpatela);
    fpessoa=fopen("DADOs.bin","r+b");///abri o arquivo
    if(fpessoa==NULL){ ///verifica a existencia do arquivo
        printf("\n\n\t\t\tERRO: Arquivo vazio!\n");
        pause();
        menu();
    }
    else{
        int n_idade;///variável recebe idade de pesquisa
        int rfve,i=0;///variável de controle
       // rfve=fread(cadastro,sizeof(struct registro),1,fpessoa);///ler o arquivo
        printf("\n\n\tDIGITE A IDADE: ");
        scanf("%d",&n_idade);fflush(stdin);///recebe a idade para ser buscada no vetor
        rewind(fpessoa);///retorna ao inicio do arquivo
        system(limpatela);
        time_sleep();
        system(limpatela);
        while(1){
            if(cadastro.idade==n_idade){
                rfve=fread(&cadastro,sizeof(struct registro),1,fpessoa);///ler o arquivo
                printf("\n\n\t\tENCONTRADO:\n\n");
                printf("\t\t\tNome: %s\n",cadastro.nome);
                printf("\t\t\tIdade: %d\n",cadastro.idade);
                printf("\t\t\tCep: %d\n",cadastro.cep);
                break;
            }else{
                system(limpatela);
                printf("\n\n\t\t\tNão Encontrado!\n");
            }
            i++;
        }
    fclose(fpessoa);///fecha o arquivo
    }
    pause();
    menu_busca();
}
///****************************************////////
void ordenar_idade(){
    REG_FUNCIONARIO *cad;
    int nbyte,i,j,k,rfne;
    int *n1,*n2;
    nbyte=tam_vetor;
    rfne=fread(&cadastro,sizeof(struct registro),1,fpessoa);
    time_sleep();
    if(rfne==1){
    for(i=0;i<nbyte;i++){
        n1=cadastro.idade;
        for(j=i+1;j<nbyte;j++){
            n2=cadastro[j].idade;
            if(cadastro.idade>cadastro[j].idade){
                cad=cadastro.idade;
                cadastro.idade=cadastro[j].idade;
                cadastro[j].idade=cad;
            }
        }
    }
    }
    system(limpatela);
}

///***************************************/////////
int busca_binaria_codigo(struct registro cadastro[],int n){
    system(limpatela);
    dados_empresa();
    int tam=MAX;
    int esq=0,dir=tam-1,meio=0;
    fread(&cadastro,sizeof(struct registro),1,fpessoa);
    rewind(fpessoa);
    while(esq<=dir){
        fread(&cadastro,sizeof(struct registro),1,fpessoa);
        meio=(dir+esq)/2;
        if(cadastro[meio].cod==n){
            return meio;
        }else if(n>cadastro[meio].cod){
            esq=meio+1;
        }else
            dir=meio-1;
    }
    return -1;
}
///**************************************///////
void bus_bin(){
    system(limpatela);
    dados_empresa();
    int res,i=0;
    int n_codigo;
    printf("\n\nInforme o codigo: ");
    scanf("%d",&n_codigo);fflush(stdin);
    time_sleep();
    system(limpatela);
    res=busca_binaria_codigo(cadastro,n_codigo);
    if(res==-1){
        printf("\nNao encontrado\n");
    }else{
        fread(&cadastro,sizeof(struct registro),1,fpessoa);
        printf("\n\n\t\t\tEncontrado: \n\n");
        printf("\t\t\tCódigo: %d",cadastro.cod);
        printf("\t\t\tNome: %s\n",cadastro.nome);
        printf("\t\t\tIdade: %d\n",cadastro.idade);
        printf("\t\t\tCep: %d\n",cadastro.cep);
    }
    pause();
    system(limpatela);
    menu_busca();
}


 

 

Por enquanto so fiz até aqui.

alguns itens presentes na struct não estão todos presentes na inserção por motivos de agilizar e facilitar os testes.

Agradeço desde já quem puder me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×