Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yeah_2796 en 19 Mayo 2015, 22:51 pm



Título: segmentation al ordenar un arreglo de objetos
Publicado por: yeah_2796 en 19 Mayo 2015, 22:51 pm
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  n<=10 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...

entrada:
5 3 3(este ultimo valor no hace nada todavia no es importante para el ordenar)
montaña_rusa 30
carritos_chocones 50
barco_pirata 40
tazas_locas 10
casa_terror 20

por lo tanto tendria que estar ordenado de:
carritos_chocones
barco_pirata
montaña_rusa
casa_terror
tazas_locas

y el programa deberia imprimir es:

carritos_chocones
barco_pirata
montaña_rusa


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, me da segmentation y nunca antes habia ordenado un arreglo de objetos y tengo dudas con eso, podrian ayudarme por favor con el codigo.

Código
  1. //jose luis silva 24.900.481 sección: c4
  2.  
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6.  
  7. class atraccion {
  8. private:
  9. int x;
  10. string name;
  11. public:
  12.  
  13. atraccion () {}
  14. atraccion (int var, string nnombre){
  15. x=var;
  16. name = nnombre;
  17. }
  18. ~atraccion() {}
  19.  
  20. void set_x (int val) { //modifica el x
  21. x = val;
  22. }
  23.  
  24. int get_x () { //devuelve el x
  25. return x;
  26. }
  27.  
  28. void set_name ( string nom) { //modifica el nombre
  29. name =nom;
  30. }
  31.  
  32. string get_name () { //devuelve el nombre
  33. return name;
  34. }
  35. };
  36.  
  37. int main (){
  38. int m, n, h,div;
  39. int posmayor,mayor;
  40. string nombre;
  41. atraccion intercambio;
  42.  
  43. cin>>m>>n>>h;
  44.  
  45. atraccion ar [m]; //arreglo que almacena cada atraccion
  46.  
  47. for (int i=0;i<m;i++) {
  48. cin>>nombre;
  49. cin>>div;
  50. ar[i].set_name(nombre);
  51. ar[i].set_x (div);
  52. }
  53.  
  54. for (int w=0;w<=m-2;w++){ //ordenamiento
  55. posmayor = w;
  56. mayor = ar[w].get_x();
  57. for (int k=w+1; k<=m-1; k++){
  58. if (ar[k].get_x() > mayor) {
  59. mayor = ar[k].get_x();
  60. posmayor =k;
  61. }
  62. }
  63.  
  64. intercambio = ar[posmayor];
  65. ar[posmayor] =ar[w];
  66. ar[w] = intercambio;
  67. }
  68.  
  69. for (int j=0;j<n;j++) {
  70. cout<<ar[j].get_name()<<endl;
  71. }
  72.  
  73. return 0;
  74. }
  75.