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

Problema no codigo de busca binaria


cassiogallotti

Pergunta

Olá pessoal, queria saber se alguém poderia analizar meu código que está com problema na hora de retornar o valor da busca binária.

É o seguinte, no programa entra com a matricula de 5 alunos e seus respectivos nomes. Depois ele coloca em ordem de matricula(só porque o enunciado pediu, mas é inútil), em seguida coloca em ordem alfabética. Depois entra com um nome, que será a chave para a busca, em seguida roda a busca binária para localizar o nome e tem que retornar o numero da matricula. É aí que está o problema, aparentemente não está comparando ou não está retornando.

Desde já agradeço.

O código:

#include <cstdlib>
#include <iostream>
#define tamanho 5
#define nometamanho 30

using namespace std;
struct tno
{
   int matricula;
   char nome[nometamanho];

};
struct tfila 
{
   struct tno no[tamanho];
   int topo;

};
void iniciafila (struct tfila*fila)
{
   fila->topo=0;
}
int ordenainsercao(struct tfila*fila, struct tno no[], int tam)
{
   int j,i,aux;
   tno noaux;
   for (j=1; j<tam; j++){
      aux=no[j].matricula;
      for (i=j-1; i>=0 && no[i].matricula > noaux.matricula; i--){
         no[i+1]=no[i];
      }
      no[i+1]=noaux;
   }
}
int ordenanome (struct tfila * fila , struct tno no[] , int tam)
{
   int j,i;
   tno noaux;
   for (j=1; j<tam; j++){
      noaux,no[j];
      for (i=j-1; i>=0 && strcmp(no[i].nome,noaux.nome)>0; i--){
         no[i+1]=no[i];
      }
      no[i+1]=noaux;
   }
}
int buscabinaria (struct tfila* fila, struct tno  no[], int tam, char chave[],int nometam )
{
   int e,m,d; e=0; d=tam-1;
   while (e<=d){
      m=(e+d)/2;
      if (strcmp(no[m].nome,chave)==0){
         return no[m].matricula;
      }
      if (strcmp(no[m].nome,chave)>0){
         e=m+1;
      }
      else{
         d=m-1;
      }
     return 0;
   }
}
               

int main(int argc, char *argv[])
{
   struct tfila fila;
   int c, retornopesquisa;
   struct tno no[tamanho];
   char chave[nometamanho];
    
   iniciafila(&fila);
           
   for (c=0; c<tamanho; c++){
      cout<<"\n digite "<<c+1<<"o matricula: ";
      cin>>no[c].matricula;
      cout<<"\n digite "<<c+1<<"o nome: ";
      cin>>no[c].nome;
   }
   ordenainsercao(& fila , no, tamanho);
   ordenanome(& fila, no, tamanho);
   cout<<"\n digite nome para ser pesquisado  \n ";
   cin>>chave;
   retornopesquisa=buscabinaria(& fila, no, tamanho, chave, nometamanho);
   if(retornopesquisa==0){
      cout<<"\n nenhum nome ou  matricula encontarada  \n ";
   }
   else{
      cout<<"nome encontrado a matricula referente a este nome e: \n ";
      cout<<retornopesquisa +1;
   }
   system("PAUSE");
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Oi, 'cassiogallotti' !

int buscabinaria (struct tfila* fila, struct tno  no[], int tam, char chave[],int nometam )
{
   int e,m,d; e=0; d=tam-1;
   while (e<=d){
      m=(e+d)/2;
      if (strcmp(no[m].nome,chave)==0){
         return no[m].matricula;
      }
      if (strcmp(no[m].nome,chave)>0){
         e=m+1;
      }
      else{
         d=m-1;
      }
     return 0;
   }
}
Dê uma olhada na instrução return 0 de sua função acima. Ela está dentro do laço while quando deveria estar fora do laço. Pois se não achar na primeira girada do laço ele vai sair e encerrar a função. O correto não seria assim?:
int buscabinaria (struct tfila* fila, struct tno  no[], int tam, char chave[],int nometam )
{
   int e,m,d, retorno; e=0; d=tam-1;
   retorno = 0;
   while (e<=d){
      m=(e+d)/2;
      if (strcmp(no[m].nome,chave)==0){
         retorn= = no[m].matricula;
      }
      if (strcmp(no[m].nome,chave)>0){
         e=m+1;
      }
      else{
         d=m-1;
      }
   }
   return retorno;
}

Link para o comentário
Compartilhar em outros sites

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,4k
×
×
  • Criar Novo...