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

Salvador Pozo salvador en conclase.net
Vie Abr 27 19:03:45 CEST 2007


El pasado 2007-04-27 16:31:57, David Gonzalez escribió:
 
Hola:

DG> Que buena idea, pero pues tengo unas dudas aún, usé la función así,
DG> imprimiendo los resultados de comparar los returns de la función:
DG>     int cosa=0;
DG>     for(int x=0; x<ELEM; x++){
DG>         cosa = compararnota(&tabla[x].nota, &tabla[x+1].nota);
DG>         cout << cosa;
DG>     }
DG> El devuelve 1 1 -1 respectivamentem pero no sé como usarla en mi caso
DG> específico, pensé en un for() que itere por los valores de la tabla y
DG> los muestre en pantalla, pero no me salé.

La función de comparación sólo se usará internamente por qsort, aunque como ves, no hay inconveniente para usarla de otro modo.

Debes tener cuidado con qué parámetros le pasas, por ejemplo, en tu código, x varía de 0 a 2, pero en la última comparación estarás comparando los elementos 2 y 3 del array, y el 3 no existe.

Los valores que devuelve este bucle son irrelevantes para nuestro caso, dependerá del orden en que hayas introducido los datos. La salida es 1 1 -1 porque el elemento 0 es mayor que el 1, el 1 mayor que el 2, y el 2 se interpreta como menor que el 3 (que no existe).

DG> > Ahora es muy simple ordenar la lista por notas, basta con invocar a la función qsort:
DG> >     qsort(tabla, 3, sizeof(struct es), compararnota);

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

Lo que hace qsort es ordenar el array, y los resultados se almacenan en el mismo array. Si quieres mostrar el array ordenado tan sólo tendrás que listarlo después de la llamada a qsort.

Si posteriormente llamas a qsort con otra función de comparación, el array se ordenará de otro modo, y en general, perderemos el orden anterior.

Supongamos que tenemos un array "tabla" de enteros con estos valores: 
3, 2, 5, 1

Si la ordenamos con "qsort", el contenido de "tabla" será ahora:
1, 2, 3, 5

Aunque todo depende de la función de comparación que implementemos. Si la comparación devuelve un valor positivo cuando el primer valor sea menor que el segundo y negativo cuando el primero sea mayor, el orden será inverso, y el resultado en ese caso sería:
5, 3, 2, 1

No sé si te estoy liando más... :-)

DG> Espero no ser muy burro y que me puedas ayudar.

No te preocupes, recuerdo que en su momento también me costó mucho comprender cómo funcionan estas funciones. Hay que tener en cuenta que en este tema intervienen conceptos complicados de entender, como el uso de punteros genéricos o punteros a funciones. No es algo evidente ni sencillo.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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