Propenso a errores: forma de función para lograr una matriz de enteros de búsqueda binaria

Es posible implementar una función para lograr la búsqueda binaria, lo primero que pensamos es el siguiente código:

// 二 分 查找
#include <stdio.h> 
#include <string.h> 
int cz_sz (int num [], int a) 
{ 
	int left, right, mid; 
	izquierda = 0; 
	derecha = tamaño de (núm) / tamaño de (núm [0]) - 1; 
	mid = (izquierda + derecha) / 2; 
	while (izquierda <= derecha) 
	{ 

	if (num [mid]> a) 
	{ 
		right = mid + 1; 
	} 
	else 
		if (num [mid] <a) 
		{ 
			left = mid + 1; 
		} 
		else 
			return mid; 
	} 
	si (izquierda> derecha) 
		return 0; 
} 


int main () 
{ 
	int izquierda, derecha, medio; 
	int a, t; 
	int num [] = {1,2,3,4,5,6,7,8,9,10}; 
	printf ("请 输入 你 要 查找 的 值:");
	scanf ("% d", & a);
	t = cz_sz (num, a); 
	if (0 == t) 
	{ 
		printf ("no encontrado \ n"); 
		
	} 
	else 
	{ 
		printf ("encontrado, subíndice:% d \ n", t); 
	} 
	return 0; 

}

Entonces lo encontrará vergonzosamente:
cuando ingresa algunos números en la matriz, en realidad me devolvió uno ... no hay mucho que decir en la imagen de arriba:
M (} I109`J9JVFT0@J1RZD6T.png

???? Qué está sucediendo

Resulta que a la matriz solo se le pasa la primera dirección cuando se pasan los parámetros. , Por lo que provocará un error al calcular la longitud.
Nuestra solución es poner la longitud de la matriz calculada en la función principal y agregar un parámetro adicional a la función principal para resolver el problema.
Amigos, debemos recordar: el parámetro formal es en realidad solo una copia temporal del parámetro real. Los cambios en el parámetro formal no cambiarán el valor del parámetro real. El valor solo se puede cambiar estableciendo una conexión a través de la llamada por dirección (en resumen: ¡usa punteros!)

Podemos cambiar la función de la siguiente manera:

// 二 分 查找
#include <stdio.h> 
#include <string.h> 
int cz_sz (int num [], int a, int b) 
{ 
	int left, right, mid; 
	izquierda = 0; 
	derecha = b - 1; 
	
	while (izquierda <= derecha) 
	{ 
		mid = (izquierda + derecha) / 2; 

		if (num [mid]> a) 
		{ 
			right = mid + 1; 
		} 
		else 
			if (num [mid] <a) 
			{ 
				left = mid + 1; 
			} 
			else 
				return mid; 
	} 
	
		return 0; 
} 


int main () 
{ 
	int a, t; 
	int num [] = {1,2,3,4,5,6,7,8,9,10}; 
	int b = tamaño de (núm) / tamaño de (núm [0]);
	printf ("请 输入 你 要 查找 的 值:"); 
	scanf_s ("% d", & a);
 
	t = cz_sz (num, a, b); 
	if (0 == t) 
	{ 
		printf ("no encontrado \ n"); 

	} 
	else 
	{ 
		printf (" encontrado, el subíndice es:% d \ n ", t); 
	} 
	

}


Ahora no hay problema con la implementación, espero que los lectores puedan compartir la tecnología y señalar cualquier problema, jaja. ¡Entonces, la función scanf_s es el requisito de especificación de mi programa en VS2019! ! ! ! !











Supongo que te gusta

Origin blog.51cto.com/15144773/2678897
Recomendado
Clasificación