Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Ordenar un arreglo de objetos de manera descendete

Estas en el tema de Ordenar un arreglo de objetos de manera descendete en el foro de C/C++ en Foros del Web. Hola tengo un arreglo de objetos que se trata de un parque de diversiones en el cual cada atraccion tiene dos atributos su nombre (string) ...
  #1 (permalink)  
Antiguo 16/05/2015, 14:05
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Ordenar un arreglo de objetos de manera descendete

Hola tengo un arreglo de objetos que se trata de un parque de diversiones en el cual cada atraccion tiene dos atributos su nombre (string) y su nivel de diversion (int).

yo leo 3 valores m que es la cantidad de atracciones, que es mayor a 1 y menor 100000; un n que son la cantidad de atracciones populares, osea, las atracciones que tienen un nivel de divesion mas alto y tambien leo un valor h que por ahora no lo estoy usando pero despues lo usare por que son para leer las aristas con las que se conectaran las atracciones,

por ahora mi problema es que tengo que ordenar ese arreglo de mayor a menor ya que las atracciones con mayor nivel de diversion van primero...

y bueno yo estaba usando el ordenamiento de seleccion (selection sort) que es de menor a mayor pero lo modifique como yo crei para poder ordenarlo ascendentemente, pero mi problema es que no me ordena y nunca antes habia ordenado un arreglo de objetos y tengo dudas con eso, podrian ayudarme por favor con el codigo

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class atraccion {
  6.     private:
  7.     int x;
  8.     string name;
  9.     public:
  10.    
  11.     atraccion () {}
  12.     atraccion (int var, string nnombre){
  13.         x=var;
  14.         name = nnombre;
  15.     }
  16.     ~atraccion() {}
  17.    
  18.     void set_x (int val) {              //modifica el x
  19.         x = val;
  20.     }
  21.    
  22.     int get_x () {                      //devuelve el x
  23.         return x;
  24.     }
  25.    
  26.     void set_name ( string nom) {           //modifica el nombre
  27.         name =nom;
  28.     }
  29.    
  30.     string get_name () {                    //devuelve el nombre
  31.         return name;
  32.     }
  33. };
  34.  
  35.  
  36.  
  37. int main (){
  38.     int m, n, h,div;
  39.     int posmayor,mayor;
  40.     int mat[h][h];
  41.     int x,y;
  42.     int indexmax,aux;
  43.     string nombre;
  44.     atraccion ar [100000];              //arreglo que almacena cada atraccion
  45.    
  46.     cin>>m>>n>>h;
  47.    
  48.         for (int i=0;i<m;i++) {
  49.             cin>>nombre;
  50.             cin>>div;
  51.             ar[i].set_name(nombre);
  52.             ar[i].set_x (div);
  53.         }
  54.        
  55.         for (int h=0;h<=m-1;h++){               //ordenamiento
  56.             posmayor = h;
  57.             mayor = ar[h].get_x();
  58.             for (int k=h+1; k<=m; k++){
  59.                 if (ar[k].get_x() > mayor) {
  60.                     mayor = ar[k].get_x();
  61.                     posmayor =k;
  62.                 }
  63.             }
  64.             ar[posmayor] = ar[h];
  65.             ar[h].set_x(mayor);
  66.         }
  67.        
  68.         for (int j=0;j<n;j++) {
  69.             cout<<ar[j].get_name()<<endl;
  70.         }
  71.    
  72.     return 0;
  73. }
  #2 (permalink)  
Antiguo 17/05/2015, 11:38
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Información Respuesta: Ordenar un arreglo de objetos de manera descendete

Hay 2 errores en tu algoritmo de ordenamiento:

Primer error: Condición de los bucles for
Tal y como se puede deducir de tu código m es el número total de elementos de tu arreglo, lo que implica que los datos con los que tu quieres trabajar se almacenan desde ar[0] hasta ar[m-1].


Como ya sabrás al implementar el algoritmo de ordenamiento por selección vamos mirando de izquierda a derecha dato a dato y a su vez comprobamos que todos los de la derecha de este no sean (en este caso) mayores que el primero. Por tanto, tu parte más externa del bucle tiene que funcionar hasta llegar a m-2 y tu parte más interna del bucle hasta m-1. Aquí te dejo el fragmento que tú tenías escrito y la versión correcta del mismo.

Versión incorrecta
Código C++:
Ver original
  1. for (int h=0;h<=m-1;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m; k++){
  4.                ........
  5.                 }
  6.             }

Versión correcta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.                 }
  6.             }

Nota: Al trabajar de la forma incorrecta tu algoritmo de ordenación accedía a datos basura lo cual podía haber alterado los datos resultantes.

Segundo error: Intercambio de datos
A la hora de mover de sitio ambos datos sólo estás poniendo el menor con los datos del mayor pero no intercambiándolos.

Versión incorrecta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.                 }
  6. ar[posmayor] = ar[h];
  7.             }

Versión correcta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.             }
  6. atraccion intercambio
  7. intercambio=ar[posmayor];
  8. ar[posmayor] = ar[h];
  9. ar[h]=intercambio;
  10. }

Nota aclaratoria: El siguiente código no hace ninguna modificación. El operador de asignación = por defecto copia todos los datos miembros de una clase a la que quieres asignarlo

Código innecesario
Código C++:
Ver original
  1. ar[h].set_x(mayor);
  #3 (permalink)  
Antiguo 18/05/2015, 17:19
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Ordenar un arreglo de objetos de manera descendete

hola, gracias por responder, lamento que hasta ahora viera tu respuesta pero tenia cosas que hacer, hice lo que me dijiste y modifique un poco mi codigo con respecto al anterior, ya que mi arreglo de atracciones siempre debio ser de m , y ya le modifique eso, pero ahora me da segmentation, y no entiendo por que, por si acaso en el codigo cambie mi int h por que como arriba ya leia h crei que ese era el problema pero no...

¿y asi si estaria bien para que se ordene el arreglo de manera descendente?

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class atraccion {
  6.     private:
  7.     int x;
  8.     string name;
  9.     public:
  10.    
  11.     atraccion () {}
  12.     atraccion (int var, string nnombre){
  13.         x=var;
  14.         name = nnombre;
  15.     }
  16.     ~atraccion() {}
  17.    
  18.     void set_x (int val) {              //modifica el x
  19.         x = val;
  20.     }
  21.    
  22.     int get_x () {                      //devuelve el x
  23.         return x;
  24.     }
  25.    
  26.     void set_name ( string nom) {           //modifica el nombre
  27.         name =nom;
  28.     }
  29.    
  30.     string get_name () {                    //devuelve el nombre
  31.         return name;
  32.     }
  33. };
  34.  
  35.  
  36.  
  37. int main (){
  38.     int m, n, h,div;
  39.     int posmayor,mayor;
  40.     int mat[h][h];
  41.     int x,y;
  42.     int indexmax,aux;
  43.     string nombre;
  44.     atraccion intercambio;
  45.    
  46.     cin>>m>>n>>h;
  47.     atraccion ar [m];       //arreglo que almacena cada atraccion
  48.    
  49.         for (int i=0;i<m;i++) {
  50.             cin>>nombre;
  51.             cin>>div;
  52.             ar[i].set_name(nombre);
  53.             ar[i].set_x (div);
  54.         }
  55.  
  56.                     for (int w=0;w<=m-2;w++){               //ordenamiento
  57.             posmayor = w;
  58.             mayor = ar[w].get_x();
  59.             for (int k=w+1; k<=m; k++){
  60.                 if (ar[k].get_x() > mayor) {
  61.                     mayor = ar[k].get_x();
  62.                     posmayor =k;
  63.                 }
  64.             }
  65.            
  66.             intercambio = ar[posmayor];
  67.             ar[posmayor] =ar[w];
  68.             ar[w] = intercambio;
  69.         }
  70.        
  71.         for (int j=0;j<n;j++) {
  72.             cout<<ar[j].get_name()<<endl;
  73.         }
  74.    
  75.     return 0;
  76. }
  #4 (permalink)  
Antiguo 19/05/2015, 01:10
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Ordenar un arreglo de objetos de manera descendete

En la línea 59 k tiene que ser menor o igual que m-1.

Un saludo.
  #5 (permalink)  
Antiguo 19/05/2015, 12:27
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Ordenar un arreglo de objetos de manera descendete

hola gracias, aunque igual sigue dando segmentation :( , suena como si entrara en un ciclo infinito asi que probe comentando nada mas el ordenar y me sale segmentation, asi que comente tambien la variable atraccion intercambio y si me compilo, el problema es la variable intercambio?
  #6 (permalink)  
Antiguo 19/05/2015, 13:32
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Ordenar un arreglo de objetos de manera descendete

Ya he visto porqué, porque si pones un n mas grande que m el bucle que muestra los datos intenta acceder a datos a los que no puede. Disculpa, no me di cuenta de eso la primera vez. Un saludo!
Código C++:
Ver original
  1. for (int j=0;j<m;j++) {
  2.             cout<<ar[j].get_name()<<endl;
  3.         }
  #7 (permalink)  
Antiguo 19/05/2015, 14:01
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Ordenar un arreglo de objetos de manera descendete

Hola, lo que pasa es que no puedo cambiar el n, osea n es maximo 10 por que una vez que ya tenga el arreglo ordenado, tengo mostarlo desde 1 hasta n si el arreglo tiene 10 atracciones y mi n son 3 tengo que mostrar las primeras 3
  #8 (permalink)  
Antiguo 19/05/2015, 16:08
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Ordenar un arreglo de objetos de manera descendete

Mientras que pongas un n que sea menor o igual que m al introducir los datos no debe darte ese error, de hecho yo lo he compilado y ejucutado y no me ha dado ningún problema. Te dejo tu código modificado por si has bailado alguna cosa sin darte cuenta
Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class atraccion {
  6.     private:
  7.     int x;
  8.     string name;
  9.     public:
  10.    
  11.     atraccion () {}
  12.     atraccion (int var, string nnombre){
  13.         x=var;
  14.         name = nnombre;
  15.     }
  16.     ~atraccion() {}
  17.    
  18.     void set_x (int val) {              //modifica el x
  19.         x = val;
  20.     }
  21.    
  22.     int get_x () {                      //devuelve el x
  23.         return x;
  24.     }
  25.    
  26.     void set_name ( string nom) {           //modifica el nombre
  27.         name =nom;
  28.     }
  29.    
  30.     string get_name () {                    //devuelve el nombre
  31.         return name;
  32.     }
  33. };
  34.  
  35.  
  36.  
  37. int main (){
  38.     int m, n, h,div;
  39.     int posmayor,mayor;
  40.     int mat[h][h];
  41.     int x,y;
  42.     int indexmax,aux;
  43.     string nombre;
  44.     atraccion intercambio;
  45.    
  46.     cin>>m>>n>>h;
  47.     atraccion ar [m];       //arreglo que almacena cada atraccion
  48.    
  49.         for (int i=0;i<m;i++) {
  50.             cin>>nombre;
  51.             cin>>div;
  52.             ar[i].set_name(nombre);
  53.             ar[i].set_x (div);
  54.         }
  55.  
  56.                     for (int w=0;w<=m-2;w++){               //ordenamiento
  57.             posmayor = w;
  58.             mayor = ar[w].get_x();
  59.             for (int k=w+1; k<=m-1; k++){
  60.                 if (ar[k].get_x() > mayor) {
  61.                     mayor = ar[k].get_x();
  62.                     posmayor =k;
  63.                 }
  64.             }
  65.            
  66.             intercambio = ar[posmayor];
  67.             ar[posmayor] =ar[w];
  68.             ar[w] = intercambio;
  69.         }
  70.        
  71.         for (int j=0;j<n;j++) {
  72.             cout<<ar[j].get_name()<<endl;
  73.         }
  74.    
  75.     return 0;
  76. }
  #9 (permalink)  
Antiguo 19/05/2015, 19:03
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Ordenar un arreglo de objetos de manera descendete

¡OH POR DIOS! ME FUNCIONA, NO PUEDO CREERLO, DE LA EMOCION EN VERDAD NNO PUEDO... ¡GRACIAS! ¡GRACIAS!

Gracias, en verdad me hiciste la persona mas feliz del mundo, llevo desde el sabado con ese problema y con tus consejos y tu ayud ya puedo seguir avanzando con esto, no se como puedo agradecerte.

5 3 3
casa_terror 60
tazas_locas 10
barco_pirata 30
montaña_rusa 50
sillas_voladoras 40
casa_terror
montaña_rusa
sillas_voladoras

Última edición por jose_27; 19/05/2015 a las 19:30

Etiquetas: arreglo, arreglos, c++, ordenamiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:13.