Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Rockmore en 16 Marzo 2011, 19:34 PM

Título: [C++] Reordenar vector dinámico de objetos
Publicado por: Rockmore en 16 Marzo 2011, 19:34 PM
Saludos. Liado ando con un gestor de agenda, en el que he de reordenar por nombre los contactos cada vez que añado uno nuevo. Por supuesto, pensé en la burbuja, pero, a pesar de que compila sin problemas, no reordena nada. He aquí mi código:
Código (cpp) [Seleccionar]
//Clase Agenda
class Agenda{
private:
    Contacto *lista;
    int N;
public:
    //Constructor por defecto
    Agenda(){
        N=0;
        lista=NULL;
        return;
    }
    //Destructor
    ~Agenda(){
        if(lista){
            delete[]lista;
        }
    }
    //Metodo aniadir contacto
    void NuevoContacto(void){
        //Creacion vector Contacto auxiliar
        Contacto *aux=new Contacto[N+1];
        //Recoleccion de datos anteriores
        for(int i=0;i<N;i++){
            aux[i]=lista[i];
        }
        //Peticion de dato nuevo
        cin>>aux[N];
        cin>>aux[N].fnac;
        cin>>aux[N].dir;
        //Eliminacion de vector Contacto obsoleto
        if(lista!=NULL){
            delete[]lista;
        }
        //Recreacion de vector Contacto util
        lista=aux;
        N++;
        Ordenar(lista,N);
        return;
    }

//.........

    //Metodo reordenacion de contactos
    void Ordenar(Contacto listado[], int n){
        Contacto aux;
        bool centinela;
        for(int i=0;i<n&&centinela==true;i++){
            centinela=false;
            for(int j=0;j<n;j++){
                if(listado[j-1].VerNombre()>listado[j].VerNombre()){
                    aux=listado[j-1];
                    listado[j-1]=listado[j];
                    listado[j]=aux;
                    centinela=true;
                }
            }
        }
        return;
    }
};

¿Dónde está el fallo?
Título: Re: [C++] Reordenar vector dinámico de objetos
Publicado por: Akai en 16 Marzo 2011, 20:05 PM
Falta código para entender completamente lo que estás haciendo, pero básicamente creo que es esto:
Código (cpp) [Seleccionar]
listado[j-1].VerNombre()>listado[j].VerNombre()

No puedes comparar "nombres" de esa forma, C++ es potente, pero no hace magia. Puedes comparar enteros, floats, carácteres, booleanos entre sí, pero no tipos compuestos, estructuras, vectores, u objetos de una clase.

Para tu caso, las cadenas se comparan con strcmp (http://cplusplus.com/reference/clibrary/cstring/strcmp/). Si usas strings (http://cplusplus.com/reference/string/string/), lo puedes hacer con string.compare() (http://cplusplus.com/reference/string/string/compare/).

Opciones:
1)comparas utilizando la función o clase y método dichos arriba.

2) sobrecargas el operador > para tu clase Contacto para que realice la comparación de lo dicho en la opción 1 (si te ves con ánimo, para ampliar te irá bien) o implementarte tu propio método para comparar cadenas(Mejor no te compliques la vida, mira la opción 1).
Título: Re: [C++] Reordenar vector dinámico de objetos
Publicado por: Rockmore en 17 Marzo 2011, 19:05 PM
Bueno, después de darle mil vueltas logré encontrar los dos fallos que había, como siempre, tonterías, pero que hacen que te vuelvas loco.
Para empezar, el símbolo > funciona, el tema es que el booleano centinela no estaba inicializado, por tanto, no entraba en el bucle de ordenación. Por otro lado, el bucle interno empezaba en j=0, cuando debía hacerlo en j=1. El código resultante del método es el siguiente.
Código (cpp) [Seleccionar]
//Metodo reordenacion de contactos
    void Ordenar(void){
        Contacto aux;
        bool centinela=true;
        for(int i=0;i<N&&centinela;i++){
            centinela=false;
            for(int j=1;j<N;j++){
                if(lista[j-1].VerNombre()>lista[j].VerNombre()){
                    aux=lista[j];
                    lista[j]=lista[j-1];
                    lista[j-1]=aux;
                    centinela=true;
                }
            }
        }
        return;
    }

De todos modos, gracias por el aporte. Lo tendré en cuenta para futuros programas, que se avecinan chungos.  ;)