/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Error que no encuentro.. [Busqueda Binaria]

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
xtremecopy



Registrado: 05 Oct 2007
Mensajes: 28

MensajePublicado: 22/11/2007 5:19 am
Título: Error que no encuentro.. [Busqueda Binaria]

El ejercicio es simple tengo que crear un array de N valores , ordenarlo y despues realizar consultas sobre ubicacion (Busqueda Binaria) , simple ,armo el array , los ordena pero no me encuentra los valores cuando se lo solicito , alguien me podria dar una mano ... =)

Código:

#include <conio.h>
#include <stdio.h>
#define MAX_N 15
int a[MAX_N],i,j,k,x,N,temp;
int b[MAX_N],m,s,r,w,q;
int main (void)
{printf("Ingrese el valor de N (de 1 a 15): ");
   scanf("%d", &N);

for(x=0; x<N; x++)
{
printf("Introduzca valores para la localidad %d : ",x);scanf("%d",&a[x]);
}
for(j=0;j<N; j++)
{
    for(i=0; i<N; i++)
       {
     if(a[N] > a[N+1])
       {
         temp=a[N];
         a[N]=a[N+1];
         a[N+1]=temp;
        }
      else
      {
      }
       }
}
for(k=0; k<N; k++)
{
printf("\nEl valor de la localidad %d es %d ",k,a[k]);
}
/*---------------------------------------------------------------*/
printf("\n Introduzca el valor que desea buscar: ");scanf("%d",&s);
if (a[N]<=s)
    {
       printf("El numero que usted buscaba  no se encuentra en el arreglo");
    }
else
{
m=N/2;
r=m;w=m;
q=N;
for(;;)
   {
     if(a[m]<s)
       {
    m=(q+m)/2;
    q=q+r;
       }
      else if(s<a[m])
        {
          m=(q-w)/2;
          q=q-w;
         }
       else if(s==a[m])
          {
          printf("Valor encontrado en la localidad %d", m);
          break;
          }
   }
}
getch();
}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3943
Ubicación: Mexico

MensajePublicado: 22/11/2007 9:57 am
Título:

El programa tiene varios errores.

El primero es la ordenacion mediante el metodo de la burbuja o BubbleSort, este esta muy mal implementado ya que dentro de los bucles no utilizas el valor de las variables contadoras. Puedes encontrar varios ejemplos en la base de datos de los foros sobre este metodo de ordenacion.

Otro error se encuentra en el if donde verificas si el valor a buscar es mayor o igual que el valor almacenado en el ultimo elemento del array:
Código:
if (a[N]<=s) ...

Para empezar si los valores son iguales el programa indicaria un resultado que no es el correcto y segundo, debes verificar si el valor a buscar es menor que el primer elemento o mayor que el ultimo (cuyo indice no es "N" sino "N - 1"):
Código:
if (s < a[0] || s > a[N -1]) ...


El metodo de busqueda binaria tampoco esta bien implementado ya que para empezar podrias utilizar nombres de variables mas descriptivos y te falta verificar que los limites no se rebasen.

El programa corregido en C estandar (sin, para empezar, conio) es:
Código:
#include <stdio.h>
#include <stdlib.h>

#define MAX_N 15

int main (void)
{
   int a[MAX_N];
   int num_elem;
   int i;
   int j;
   int temp;
   
   int p;
   int valor;
   
   printf("Ingrese el valor de num_elem (de 1 a 15): ");
   fflush(stdout);
   if (scanf("%d", &num_elem) != 1 || num_elem < 1 || num_elem > MAX_N)
      return EXIT_FAILURE;
   
   for (i = 0; i < num_elem; i++){
      printf("Introduzca valores para la localidad %d : ", i);
      fflush(stdout);
      if (scanf("%d",&a[i]) != 1)
         return EXIT_FAILURE;
   }
   
   for (i = 0; i < num_elem - 1; i++)
      for (j = 0; j < num_elem - 1 - i; j++)
         if (a[j] > a[j + 1]){
            temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
         }
   
   for (i = 0; i < num_elem; i++)
      printf("El valor de la localidad %d es %d\n", i, a[i]);
   
   printf("Introduzca el valor que desea buscar: ");
   fflush(stdout);
   if (scanf("%d", &valor) != 1)
      return EXIT_FAILURE;
   
   if (valor < a[0] || valor > a[num_elem -1]){
      printf("El numero que usted buscaba  no se encuentra en el arreglo");
   }else {
      i = 0;
      j = num_elem - 1;
     
      do {
         p = (i + j) / 2;
         
         if(a[p] < valor)
            i = p + 1;
         else if(a[p] > valor)
            j = p - 1;
         else {
            printf("Valor encontrado en la localidad %d\n", p);
            break;
         }
      }while (i <= j);
   }
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com