Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: darking664 en 5 Octubre 2013, 02:26 am



Título: [Ayuda] Ordenar por edad y por nombre, datos de un struct.
Publicado por: darking664 en 5 Octubre 2013, 02:26 am
Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #define tam 4 //constante
  6.  
  7. struct empleado{
  8. char nom[30];
  9. int edad;
  10. float sueldo;
  11. char sexo;
  12. char mat[2][30];
  13. };
  14.  
  15. //Prototipos
  16. empleado captura();
  17.  
  18. void imprimir(empleado emp);
  19. void ordenar(empleado vec[]);
  20.  
  21. using namespace std;
  22.  
  23. int main()
  24. {
  25. //vec de struct para trabajar TAM registros
  26. empleado vec[tam];
  27. int temp,temp2;
  28.  
  29. for(int i=1;i<tam;i++)
  30. vec[i]=captura();
  31.  
  32.  
  33. cout<<"\n\nRegistros Desordenados\n";
  34. for(int i=1;i<tam;i++)
  35. imprimir(vec[i]);
  36.  
  37.  
  38. //C O M P L E T A R ..... Linea de codigo que ordena el vector por edad
  39. cout<<"\n\nRegistros ordenados por EDAD\n";
  40.  
  41.  
  42. for(int i=1;i<tam-1;i++)
  43. {
  44. for(int j=1;j<tam-i-1;j++)
  45. {
  46. if (vec[j].edad> vec[j+1].edad)
  47. {
  48. temp=vec[j].edad;
  49. vec[j].edad=vec[j+1].edad;
  50. vec[j+1].edad=temp;
  51. }
  52. }
  53. }
  54.  
  55.  
  56.  
  57. for(int i=0;i<tam;i++)
  58. imprimir(vec[i]);
  59.  
  60.  
  61. //C O M P L E T A R ..... Linea de codigo que ordena el vector por nombre
  62. cout<<"\n\nRegistros Ordenados por NOMBRE\n";
  63.  
  64. for(int j=1;j<tam;j++)
  65. {
  66. temp2=strcmp(vec[j].nom,vec[j+1].nom);
  67. if(temp2>0)
  68. strcpy(vec[0].nom,vec[j].nom);
  69. strcpy(vec[j].nom,vec[j+1].nom);
  70. strcpy(vec[j+1].nom,vec[0].nom);
  71. }
  72.  
  73.  
  74. for(int i=1;i<tam;i++)
  75. imprimir(vec[i]);
  76.  
  77.  
  78.  
  79. system("PAUSE");
  80. return EXIT_SUCCESS;
  81. }
  82.  
  83.  
  84.  
  85. empleado captura()
  86. {
  87. empleado emp; //Variable local de captura
  88.  
  89. cout<<"\n\nNombre: ";
  90. cin.getline(emp.nom,30);
  91. cout<<"Edad: ";
  92. cin>>emp.edad;
  93. cout<<"Sueldo: ";
  94. cin>>emp.sueldo;
  95. cout<<"Sexo: ";
  96. cin>>emp.sexo;
  97. fflush(stdin);
  98. cout<<"mail 1: ";
  99. cin.getline(emp.mat[0],30);
  100. cout<<"mail 2: ";
  101. fflush(stdin);
  102. cin.getline(emp.mat[1],30);
  103. return emp;
  104. }
  105.  
  106. void imprimir(empleado emp)
  107. {
  108. cout<<endl<<"Nombre: "<<emp.nom;
  109. cout<<endl<<"Edad: "<<emp.edad;
  110. cout<<endl<<"Sueldo: "<<emp.sueldo;
  111. cout<<endl<<"Sexo: "<<emp.sexo;
  112. cout<<endl<<"Mail 1: "<<emp.mat[0];
  113. cout<<endl<<"Mail 2: "<<emp.mat[1]<<endl;
  114. return;
  115. }
  116.  


El programa consiste en ordenar el vector por edad y nombre alfabeticamente...
si alguien me puede orientar o ayudarme, se los agradezco mucho.

:)


Título: Re: [Ayuda] Ordenar por edad y por nombre, datos de un struct.
Publicado por: eferion en 5 Octubre 2013, 11:34 am
Código
  1. for(int i=1;i<tam-1;i++)
  2. {
  3. for(int j=1;j<tam-i-1;j++)
  4. {
  5. if (vec[j].edad> vec[j+1].edad)
  6. {
  7. temp=vec[j].edad;
  8. vec[j].edad=vec[j+1].edad;
  9. vec[j+1].edad=temp;
  10. }
  11. }
  12. }

Ahí estás ordenando las edades... pero le estás asignando a cada individuo una edad que no es la suya... lo que tienes que ordenar es las estructuras en sí.

Además si estás usando dos bucles ( i y j ), no tiene sentido que a la hora de cambiar el orden uses solo j.

Código
  1. for(int i=1;i<tam-1;i++)
  2. {
  3.  for(int j=1;j<tam-i-1;j++)
  4.  {
  5.    if (vec[i].edad> vec[j].edad)
  6.    {
  7.      struct empleado temp = vec[i];
  8.      vec[i]= vec[j];
  9.      vec[j] = temp;          
  10.    }
  11.  }
  12. }

En el caso de ordenar por nombre te pasa exactamente lo mismo.

PD.: intenta no usar variables globales, no suelen ser una buena idea en el 99% de los casos.

PD2.: ya que estás usando c++, lo mismo te resulta más cómodo utilizar la clase string para manejar las cadenas, en vez de char*. Además, te podrías plantear usar la clase vector en vez de un array de c para gestionar la lista de empleados.

PD3.: Hay una tercera forma de ordenar y es usando las funciones qSort y sort... pero eso es algo que dejo que investigues por tu cuenta.

Un saludo.


Título: Re: [Ayuda] Ordenar por edad y por nombre, datos de un struct.
Publicado por: rir3760 en 5 Octubre 2013, 17:55 pm
El programa consiste en ordenar el vector por edad y nombre alfabeticamente...
En el segundo fragmento que debes completar solo tienes un bucle cuando necesitas dos.

En el primer fragmento hay dos errores, el primero ya lo indico eferion y el segundo son los indices (incorrectos) utilizados. Utiliza el motor de búsqueda de los foros (o sitios como Wikipedia) para verificar como se debe implementar el algoritmo de ordenacion BubbleSort.

Un saludo


Título: Re: [Ayuda] Ordenar por edad y por nombre, datos de un struct.
Publicado por: darking664 en 7 Octubre 2013, 03:31 am
Código
  1. for(int i=1;i<tam-1;i++)
  2. {
  3.  for(int j=1;j<tam-i-1;j++)
  4.  {
  5.    if (vec[i].edad> vec[j].edad)
  6.    {
  7.      struct empleado temp = vec[i];
  8.      vec[i]= vec[j];
  9.      vec[j] = temp;          
  10.    }
  11.  }
  12. }

En el caso de ordenar por nombre te pasa exactamente lo mismo.

PD.: intenta no usar variables globales, no suelen ser una buena idea en el 99% de los casos.

PD2.: ya que estás usando c++, lo mismo te resulta más cómodo utilizar la clase string para manejar las cadenas, en vez de char*. Además, te podrías plantear usar la clase vector en vez de un array de c para gestionar la lista de empleados.

PD3.: Hay una tercera forma de ordenar y es usando las funciones qSort y sort... pero eso es algo que dejo que investigues por tu cuenta.

Un saludo.
[/quote]


GRACIAS de veras, perdona x no poder contestar ayer (se me fue la luz), y entre trabajo y tareas de las otras materias .... :S

Si, investigare mas acerca de los metodos, y me basare en las lineas que escribiste.

No entendia bien como hacerlo en el struct.
:D :D :D :D :D :D


Título: Re: [Ayuda] Ordenar por edad y por nombre, datos de un struct.
Publicado por: darking664 en 7 Octubre 2013, 03:36 am
En el segundo fragmento que debes completar solo tienes un bucle cuando necesitas dos.

En el primer fragmento hay dos errores, el primero ya lo indico eferion y el segundo son los indices (incorrectos) utilizados. Utiliza el motor de búsqueda de los foros (o sitios como Wikipedia) para verificar como se debe implementar el algoritmo de ordenacion BubbleSort.

Un saludo

Gracias,  tomare en cuenta tus sugerencias, paso a terminar el programa :D :D
Igual, perdona por no contestar rapido, como ya explique se me fue la luz y no pude seguir...

y de veras gracias, saludos