[C con Clase] Ayuda con estructuras y búsqueda!.

David Gonzalez Herrera davidgh en etb.net.co
Vie Abr 27 18:34:50 CEST 2007


Estimado Salvador,

Con fecha viernes, 27 de abril de 2007, 3:56:57, escribió:

> Para empezar, necesitamos una función de comparación. Esta función debe ajustarse al prototipo:

> int <nombre>(const void *arg1, const void *arg2);

> Cada argumento será un puntero genérico que apuntará a un elemento
> del array, de modo que disponemos de dos elementos que debemos
> comparar, y devolver un valor en función de cual consideremos mayor.
> Si consideramos que el mayor es el primero, devolveremos un valor
> mayor que cero, si el mayor es el segundo, devolveremos un valor
> menor que cero, y si sin iguales, devolveremos cero.

Que buena idea, pero pues tengo unas dudas aún, usé la función así,
imprimiendo los resultados de comparar los returns de la función:

    int cosa=0;
    for(int x=0; x<ELEM; x++){
        cosa = compararnota(&tabla[x].nota, &tabla[x+1].nota);
        cout << cosa;
    }

El devuelve 1 1 -1 respectivamentem pero no sé como usarla en mi caso
específico, pensé en un for() que itere por los valores de la tabla y
los muestre en pantalla, pero no me salé.

> Para comaparar las notas de dos alumnos podemos usar esta implementación:

> int compararnota(const void *arg1, const void *arg2)
> {
>    // Estas asignaciones nos ayudarán a crear un código más claro:
>    struct es *alumno1 = (struct es*)arg1;
>    struct es *alumno2 = (struct es*)arg2;
>     
>    if(alumno1->nota < alumno2->nota) return -1;
>    else if(alumno1->nota > alumno2->nota) return 1;
>    else return 0;
> }

Esto va super bien.

> Como verás, hemos convertido los punteros generéricos en punteros a
> estructuras es, de moso que es más sencillo comparar notas.

> El resto es ahora más evidente: comparamos las notas, si la del
> alumno 1 es menor, retornamos -1, si la menor es la del alumno 2
> retornamos 1, en otro caso retornamos 0.

> Ahora es muy simple ordenar la lista por notas, basta con invocar a la función qsort:

>     qsort(tabla, 3, sizeof(struct es), compararnota);

Pero entonces acá funcionaría guardando los resultados de qsort, o
imprimiendolos directamente, en esta parte estoy perdido.

Espero no ser muy burro y que me puedas ayudar.

Gracias.


-- 
Saludos,
 David                            mailto:davidgh en etb.net.co




Más información sobre la lista de distribución Cconclase