Ayuda con una ordenacion de un array please? :P

Iniciado por valeeen, 12 Diciembre 2015, 19:30 PM

0 Miembros y 4 Visitantes están viendo este tema.

valeeen

Buenas amigos! Para clase tengo que ordenar un array alfabeticamente, es un array que se forma a partir de la lectura de un fichero, tiene 4 columnas, la primera es el nombre que es por la que quiero ordenarlo... el caso es que he llegado a esto:

void sortByName(producto productoArray[], int pLength) {
char *temp;
int i, j;
for (i = 0; i<pLength - 1; i++) {
for (j = i + 1; j<pLength; j++) {
if (strcmp(productoArray[i].nombre, productoArray[j].nombre) > 0) {
temp = productoArray[i].nombre;
productoArray[i] = productoArray[j];
*productoArray[j].nombre = *temp;
}
}
}
for (int i = 0; i<pLength; i++)
cout << i << ". Nombre: " << productoArray[i].nombre << ", Codigo de barras: " << productoArray[i].codigobarras
<< ", Precio: " << productoArray[i].precio << ". Fecha de entrada: " << productoArray[i].fechaentrada.dia
<< "/" << productoArray[i].fechaentrada.mes << "/" << productoArray[i].fechaentrada.anyo << endl;
}


Peeeeeero, esto me cambia el nombre de todos los productos por el nombre del que seria el primero ordenado, es decir, si fuera el alfabeto, el array quedaria con todos A A A A A A A A menos el último, que deja la Z.

A esta funcion la llamo asi:

void sortByName(producto productoArray[], int pLength);

¿Podéis ayudarme?

Mil gracias!

MAFUS

Muy buenas:

Por lo pronto se me ocurre lo siguiente:
Hacer una función que compare dos productos.

int comparar_producto(const void *p1, const void *p2) {
    articulo *art1 = (articulo*) p1;
    articulo *art2 = (articulo*) p2;
    return strcmp(art1->nombre, art2->nombre);
}


Y finalmente usas la función qsort, de stdlib, para que te ordene ella sola el array.

qsort(productoArray[], pLength, sizeof(producto), comparar_producto);

valeeen

Cita de: MAFUS en 12 Diciembre 2015, 21:23 PM
Muy buenas:

Por lo pronto se me ocurre lo siguiente:
Hacer una función que compare dos productos.

int comparar_producto(const void *p1, const void *p2) {
    articulo *art1 = (articulo*) p1;
    articulo *art2 = (articulo*) p2;
    return strcmp(art1->nombre, art2->nombre);
}


Y finalmente usas la función qsort, de stdlib, para que te ordene ella sola el array.

qsort(productoArray[], pLength, sizeof(producto), comparar_producto);

Gracias Mafus por la idea! tengo un problemilla, y es que no se como pasar mi array como parametro a esa funcion que me has dicho jeje.

en el productos.h tengo la llamada a la funcion:


#include <stdlib.h>
void ordenarProductos(producto productoArray[], int pLength);


y en el productos.cpp tengo la definición en dos partes, primero:


int comparar_producto(const void *p1, const void *p2) {
articulo *art1 = (articulo*)p1;
articulo *art2 = (articulo*)p2;
return strcmp(art1->nombre, art2->nombre);
}


y despues:


void ordenarProductos(producto productoArray[], int pLength) {

qsort(productoArray[], pLength, sizeof(producto), comparar_producto);
}


Estoy empezando con C++ y está claro que algo estoy haciendo mal jeje.

A ver si me podéis ayudar!

Gracias!

Un saludo

MAFUS

Muy buenas.

Ahora que lo he visto, fallo mio.  :-(

Siendo productoArray tu array de productos declarado como

producto productoArray[pLength];

siendo pLength una constante numérica que marca el tamaño de tu array, la llamada a qsort debe ser así:

qsort(productoArray, pLength, sizeof(producto), comparar_producto);

No se si la funcion ordenarProducto debes incluirla obligatoriamente pero no te haría falta porque qsort hace todo el trabajo. Allí donde tengas ordenarProducto pones directamente qsort y tu array se debe ordenar directamente.

valeeen

Cita de: MAFUS en 13 Diciembre 2015, 02:17 AM
Muy buenas.

Ahora que lo he visto, fallo mio.  :-(

Siendo productoArray tu array de productos declarado como

producto productoArray[pLength];

siendo pLength una constante numérica que marca el tamaño de tu array, la llamada a qsort debe ser así:

qsort(productoArray, pLength, sizeof(producto), comparar_producto);

No se si la funcion ordenarProducto debes incluirla obligatoriamente pero no te haría falta porque qsort hace todo el trabajo. Allí donde tengas ordenarProducto pones directamente qsort y tu array se debe ordenar directamente.

Ha funciona a la perfección Mafus!!

Muchas gracias!

Una duda que me queda, en vez de modificar el txt original...

¿Se podría hacer un "cout" de un array temporal ordenado? Para dejar el archivo original intacto.

Gracias por la solución!

Un saludo!

MAFUS

Muy buenas.

Si a lo que te refieres a no cambiar el archivo, pues sin guardarlo en dicho archivo seguirá desordenado.
Si te refieres a seguir teniendo el array original desordenado puedes hacerle una copia y trabajar sobre la copia.

valeeen

Cita de: MAFUS en 13 Diciembre 2015, 02:37 AM
Muy buenas.

Si a lo que te refieres a no cambiar el archivo, pues sin guardarlo en dicho archivo seguirá desordenado.
Si te refieres a seguir teniendo el array original desordenado puedes hacerle una copia y trabajar sobre la copia.

Bueno, lo voy a dejar así al final jeje

Gracias por la ayuda Mafus!

Saluds