[C con Clase] duda con qsort??

Steven Davidson srd4121 en njit.edu
Mar Dic 6 20:45:54 CET 2011


Hola Álex,

2011/12/6 Alejandro Fernández <cronopiomx en discapnet.es>:
> Hola, amigos, estoy implementando un programa que  dado, dada una varias
> cadenas de misma longitud de caracteres cuente la suma alfabetica de cada
> uno de sus caracteres eso lo metemos en un arreglo y despues ordenamos ese
> arreglo de menor a mayor, pero despues si existen varias sumas iguales hay
> que decidirse por el orden lexicografico de las palabras, amigo como puedo
> hacer eso con el qsort de stdlib.h y como implemento el metodo compare
> quie se le pasa a esta funcion.
>
> ejemplo
> AACATGAAGG   esta sumada es 26
> TTTTGGCCAA  esta sumada es 5
> TTTGGCCAAA esta sumada es 26
>
> al ordenar te queda 5 26 26,
> ahora los 2 (26) tengo que decidirme por orden alfabetico, de acuerdo a
> los strings de arriba, e imprimir los strings de nuevo pero ordenados por
> suma y lexicograficamente.
>

Bien. Como sabes la función estándar 'qsort()' se basa en usar una
función que debes proveer que sirve para comparar un elemento con otro
del array que también suministres. Esta comparación sirve para
determinar cuál elemento va antes que otro. Por lo tanto, tienes que
representar los dos conceptos o variables de tu problema como un solo
elemento en un solo array. Opto por crear una estructura, como por
ejemplo,

struct Biosecuencia
{
  char szSecuencia[11];
  int nComputo;
};

Luego creamos un array de estas estructuras,

Biosecuencia lista[1000];

Ahora queremos ordenar la lista de estas parejas de cadenas y
cantidades usando 'qsort()', por lo que tenemos que definir la lógica
que da el problema en cuanto a la forma de comparar dos elementos de
tipo 'Biosecuencia'. Por lo tanto, el prototipo que te interesa es,

int comparar2Biosecuencias( const void *p1, const void *p2 );

Si 'p1' < 'p2', entonces debe retornar un entero < 0,
Si 'p1' = 'p2', entonces debe retornar 0 (cero), y
Si 'p1' > 'p2', entonces debe retornar un entero > 0.

Esto es muy parecido a cómo funciona 'strcmp()', declarada en <cstring>.

Obviamente, tendríamos que tratar 'p1' y 'p2' como punteros a la
estructura 'Biosecuencia'. Por lo que sugiero que hagas esto nada más
comenzar,

int comparar2Biosecuencias( const void *p1, const void *p2 )
{
  Biosecuencia *pbs1 = (Biosecuencia *) p1;
  Biosecuencia *pbs2 = (Biosecuencia *) p2;
  ...
}

Esto es más fácil tratar cada parámetro. Te dejo que implementes el
resto del código para esta función, ya que se basa en implementar la
lógica que ya has descrito. Te avanzo que necesitarías usar 'strcmp()'
para comparar dos cadenas de caracteres.

La invocación de 'qsort()' será la siguiente,

Biosecuencia lista[1000];
...
qsort( lista, 1000, sizeof (Biosecuencia), comparar2Biosecuencias );

Puedes consultar la referencia de estas dos funciones en nuestra
página. Para 'qsort()', puedes ir directamente a:
http://c.conclase.net/librerias/?ansifun=qsort#inicio  y para
'strcmp()', puedes dirigirte a:
http://c.conclase.net/librerias/?ansifun=strcmp#inicio


Espero haber aclarado la duda para orientarte mejor.

Steven




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