POO ordenación de arreglos

Iniciado por SojatDotar, 28 Febrero 2016, 15:53 PM

0 Miembros y 1 Visitante están viendo este tema.

SojatDotar

Buenas, tengo una duda, si tengo una clase llamada Estudiante, con los atributos privados y quisiera ordenar de menor a mayor en un procedimiento un arreglo de Estudiante


struct Estudio
{
int dia;
int mes;
int anyo;

};



class Estudiante {
private:
Estudio tiempo;
int curso;
int edad;
public:
void setTiempo(Estudio t);
Estudio getTiempo();
void setCurso(int c);
int getCurso();
void setEdad(int e);
int getEdad();
};

Ahora en el main tengo un arreglo Estudiante el tamaño del arreglo lo da el usuario y quisiera ordenar ese arreglo de estudiante de menor a mayor, como sería? ordenaria como un arreglo normal? nunca he ordenado un arreglo de objetos

ivancea96

Ordenar implica 2 cosas básicas: intercambios y comparaciones.
En un arreglo de tipos nativos:
Código (cpp) [Seleccionar]
//Comparar
if(arr[i]>arr[j])
//...
//Intercambiar
int k = arr[i];
arr[i] = arr[j];
arr[j] = k;


En tu clase Estudiante, por ejemplo:
Código (cpp) [Seleccionar]
//Comparar
if(arr[i].getEdad()>arr[j].getEdad())
//...
//Intercambiar
Estudiante k = arr[i];
arr[i] = arr[j];
arr[j] = k;


Al final es lo mismo. Solo elige cómo lo quieres comparar. Lueog ya, dependerá todo de qué quieras haces exactamente.

SojatDotar

y en caso que también quiera ordenar el struct que esta dentro de la clase?

ivancea96

Tendrás que comparar las estructuras, del modo que quieras. Si no quieres andar comaprando una a una, haz un método del tipo compareTo(x). Generalmente este tipo de funciones devuelven -1, 0 0 1, según sea menor, igual o mayor.

Hay otra forma, que no es muy lógica (en este caso), pero te puede servir, y son los operadores.

Código (cpp) [Seleccionar]
class Estudiante{
  //...

public:
   bool operator>(const Estudiante& e){
       return edad>e.getEdad();
   }
};

int main(){
   Estudiante a,b;
   a.setEdad(15);
   b.setEdad(25);
   cout << (a>b);
}


Casi todos los operadores son sobrecargables. Por ejemplo, <,>,>=,<=,==,!=,>>,<<, operador coma (,), [], (), &,|,^,||,&&, ...
Algunos, como el operador (), te permite enviarle más deun parámetro.

Atu estructura Estudio le puedes añadir un par de operadores del tipo:
Código (cpp) [Seleccionar]
bool operator>(const Estudio& e){
       if(anyo>e.anyo)
           return true;
       if(anyo<e.anyo)
           return false;
       if(mes>e.mes)
           return true;
       // etc...
}

SojatDotar

#4
Gracias, en el primer ejemplo cuando pusiste Estudiante K = Arr no entendí bien ese ejemplo




Otra pregunta se haría tal cuál si lo hago con procedimientos? es decir un void que ordene por tiempo, otra que ordene por curso y otra que ordene por edad ?

ivancea96

Lo de Estudiante K = arr[ i ] es paraintercambiar valorses. k sería una variable temporal donde almacenar el valor a itnercambiar.

Y sí, puedes hacer 4 funciones, al final solo tendrás que cambiar un par de detalles en cada una. Si te referías a otra cosa, no entendí muy bien.