Dev - C++ - Ayuda con búsqueda binaria de nombres

 
Vista:
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Xael (4 intervenciones) el 27/01/2021 22:10:51
Hola buenas. Me gustaría que me ayudaran con la función que estoy realizando de búsqueda binaria.
Al compilar me marca este error:

[Warning] passing argument 2 of 'strcmp' makes pointer from integer without a cast

La funcion recibe como parametros un arreglo de nombres que ya estan ordenados y el numero de nombres del arreglo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void busquedaBinaria(char nombres[],int tam){
	int i=0, j=tam-1;
	int medio;
	char buscarn[MAX];
	printf("Escriba el nombre de la persona que desea encontrar");
	gets(buscarn);
	do{
		medio=((i+j)/2);
		if(strcmp(buscarn, nombres[medio]) > 0)
		    i=medio+1;
		else
		    j=medio-1;
	  }while(nombres[medio] != buscarn && i<=j);
	   if(buscarn != nombres[medio])
	     printf("Nombre no encontrado");
	   printf("El nombre es %s y esta en la posicion %d",nombres[medio],medio);
}

Espero que alguien pueda ayudarme lo más pronto posible.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Rodrigo (539 intervenciones) el 27/01/2021 23:20:10
Usa
char* nombres[]

y usa strcmp para comparar strings, no uses == o !=, como lo haces aqui (por ejemplo, linea 13 y 14)

Podrias usar el tipo "string" tambien en vez de arreglos de char y strcmp
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Xael (4 intervenciones) el 28/01/2021 00:18:09
Hola muchas gracias por su ayuda. Ya no marca ningún error pero tampoco busca el nombre. ¿Me podría decir que esta mal?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <string.h>
#define MAX 100
 
void busquedaBinaria();
 
 
int main(){
 
 
int tam=11;
 
char palabras[][MAX] = {"Mabel","Luis","Beto","Limon","Maggie","Link","Mario","Cassie"," Axel","Juan","Felipe"};
 
busquedaBinaria(palabras,tam);
return 0;
 
}
 
void busquedaBinaria(char* nombres[],int tam){
	int i=0, j=tam-1;
	int medio;
	char buscarn[10];
	printf("Escriba el nombre de la persona que desea encontrar");
	gets(buscarn);
	do{
		medio=((i+j)/2);
		if(strcmp(buscarn, nombres[medio]) > 0)
		    i=medio+1;
		else
		    j=medio-1;
	  }while(strcmp (nombres[medio],buscarn)!= 0 && i<=j);
	   if(strcmp (nombres[medio],buscarn)!= 0)
	     printf("Nombre no encontrado");
	   printf("El nombre es %s y esta en la posicion %d",nombres[medio],medio);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Rodrigo (539 intervenciones) el 28/01/2021 01:40:01
La busqueda binaria solo tiene sentido en un conjunto ordenado. El arreglo de palabras no parece estar ordenado.

Por otro lado, cuando estas en la mitad y te encuentras que lo que ves es mayor que lo que buscas, tienes que irte por la mitad izquierda, aparentemente te estas yendo por el lado derecho.
Corrige esas 2 cosas y el codigo deberia funcionar mejor.

Finalmente, el printf de la linea 35 se escribe SIEMPRE, no importa si encuentras el string o no. Es lo que quieres?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Xael (4 intervenciones) el 28/01/2021 02:33:36
Así esta con el arreglo ordenado. No entiendo que debo cambiar porque no manda el mensaje del printf final en ningun caso
Cuando pongo el nombre me pide que pulse cualquier boton para salir del programa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#define MAX 100
void busquedaBinaria();
 
int main(){
 
int tam=11;
char nombres[][MAX] = {"Aabel","Buis","Ceto","Dimon","Eaggie","Fink","Gario","Hassie"," Ixel","Juan","Kelipe"};
busquedaBinaria(nombres,tam);
return 0;
 
}
 
void busquedaBinaria(char* nombres[],int tam){
	int i=0, j=tam-1;
	int medio;
	char buscarn[MAX];
	printf("Escriba el nombre de la persona que desea encontrar \n");
	gets(buscarn);
 
	do{
		medio=((i+j)/2);
		if(strcmp(buscarn, nombres[medio]) > 0)
		    i=medio+1;
		if(strcmp(buscarn, nombres[medio]) < 0)
		    j=medio-1;
 
	  }while(strcmp(buscarn,nombres[medio])!= 0 && i<=j);
	   if(strcmp(nombres[medio],buscarn)!= 0){
	   	printf("Nombre no encontrado");
	   }
 
	   printf("El nombre es %s y esta en la posicion %d",nombres[medio],medio);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Rodrigo (539 intervenciones) el 28/01/2021 03:00:10
Te sugiero separar la lectura del string de la logica de la funcion.

Haz que tu funcion reciba el string a buscar, ademas de los parametros que ya recibe e invoca la funcion sin leer nada realmente.

Si tu funcion recibe el string a buscar y retorna true o false si el string esta o no, tampoco se hace necesario que imprima nada dentro.

Puedes crear varios test, considerando cada una de las palabras en el arreglo y palabras fuera del mismo.

La lectura del string debe ser lo que esta generando el problema, resuelvelo despues de comprobar que la funcion hace lo que esperas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con búsqueda binaria de nombres

Publicado por Xael (4 intervenciones) el 28/01/2021 05:18:31
Hola amigo te agradezco mucho por tu ayuda. Me complace anunciar que el código ya funciona correctamente. Ahora es cosa de mejorarlo.
Lo dejo aquí por si a alguien le sirve. Hay muchas cosas deficientes. Pero si hace la búsqueda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
#define TAM 100
 
int busquedaBinaria();
 
int main(){
char buscarn[TAM];
int tam=11,encontrado;
char nombres[][TAM] = {"Aabel","Buis","Ceto","Dimon","Eaggie","Fink","Gario","Hassie"," Ixel","Juan","Kelipe"};
printf("Escriba el nombre de la persona que desea encontrar \n");
gets(buscarn);
encontrado=busquedaBinaria(nombres,tam,buscarn);
if (encontrado>0)
printf("\nEl nombre %s se encuentra en la posicion %d",nombres[encontrado],encontrado);
else
printf("Nombre no encontrado");
 
return 0;
 
}
int busquedaBinaria(char nombres[][TAM],int tam, char* buscar){
	int i=0, j=tam-1;
	int medio;
	do{
		medio=((i+j)/2);
		if(strcmp(buscar, nombres[medio]) > 0)
		    i=medio+1;
		if(strcmp(buscar, nombres[medio]) < 0)
		    j=medio-1;
 
	  }while(strcmp(buscar,nombres[medio])!= 0 && i<=j);
	   if(strcmp(nombres[medio],buscar)!= 0){
	   	medio=-1;
	   }
 
	   return medio;
}

Muchas gracias por tu ayuda Rodrigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar