Menu
Coddy logo textTech

Comparación genérica

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 52 de 61.

Las funciones genéricas como qsort y bsearch de la biblioteca estándar de C necesitan una forma de comparar elementos sin conocer sus tipos. La solución es una función de comparación: una función que escribes y que el algoritmo genérico llama cada vez que necesita comparar dos elementos.

La firma estándar para las funciones de comparación es:

int compare(const void* a, const void* b);

Ambos parámetros son const void* porque la función genérica no sabe qué tipo estás ordenando. El valor de retorno sigue una convención específica:

Valor de retornoSignificado
Negativoa aparece antes que b
Ceroa es igual a b
Positivoa aparece después que b

Dentro de tu función de comparación, conviertes los punteros void* al tipo real y comparas los valores. Así es como se comparan enteros:

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

El truco de la resta funciona bien para los enteros: si a es menor, el resultado es negativo; si son iguales, cero; si es mayor, positivo. Ahora esta función se puede pasar a qsort para ordenar un arreglo de enteros en orden ascendente.

challenge icon

Desafío

Fácil
Escribe una función compare_ints que compare dos enteros siguiendo la convención estándar de las funciones de comparación utilizada por algoritmos genéricos como qsort.

Tu función debe comparar los dos valores y devolver un resultado que indique su relación de orden.

Convención del valor de retorno:

  • Devuelve un valor negativo si el primer entero aparece antes que el segundo (first < second)
  • Devuelve cero si ambos enteros son iguales
  • Devuelve un valor positivo si el primer entero aparece después que el segundo (first > second)

Parámetros:

  • a (int): El primer entero que se debe comparar
  • b (int): El segundo entero que se debe comparar

Devuelve: Un entero que indica el orden: negativo si a < b, cero si a == b, positivo si a > b.

Pista: El truco de la resta de la lección proporciona una solución elegante de una sola línea.

Pruébalo tú mismo

int compare_ints(int a, int b) {
    // Escribe el código aquí
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online