[Ayuda] Ordenar por edad y por nombre, datos de un struct.

Iniciado por darking664, 5 Octubre 2013, 02:26 AM

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

darking664

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#define tam 4 //constante

struct empleado{
char nom[30];
int edad;
float sueldo;
char sexo;
char mat[2][30];
};

//Prototipos
empleado captura();

void imprimir(empleado emp);
void ordenar(empleado vec[]);

using namespace std;

int main()
{
//vec de struct para trabajar TAM registros
empleado vec[tam];
int temp,temp2;

for(int i=1;i<tam;i++)
vec[i]=captura();


cout<<"\n\nRegistros Desordenados\n";
for(int i=1;i<tam;i++)
imprimir(vec[i]);


//C O M P L E T A R ..... Linea de codigo que ordena el vector por edad
cout<<"\n\nRegistros ordenados por EDAD\n";


for(int i=1;i<tam-1;i++)
{
for(int j=1;j<tam-i-1;j++)
{
if (vec[j].edad> vec[j+1].edad)
{
temp=vec[j].edad;
vec[j].edad=vec[j+1].edad;
vec[j+1].edad=temp;
}
}
}



for(int i=0;i<tam;i++)
imprimir(vec[i]);


//C O M P L E T A R ..... Linea de codigo que ordena el vector por nombre
cout<<"\n\nRegistros Ordenados por NOMBRE\n";

for(int j=1;j<tam;j++)
{
temp2=strcmp(vec[j].nom,vec[j+1].nom);
if(temp2>0)
strcpy(vec[0].nom,vec[j].nom);
strcpy(vec[j].nom,vec[j+1].nom);
strcpy(vec[j+1].nom,vec[0].nom);
}


for(int i=1;i<tam;i++)
imprimir(vec[i]);



system("PAUSE");
return EXIT_SUCCESS;
}



empleado captura()
{
empleado emp; //Variable local de captura

cout<<"\n\nNombre: ";
cin.getline(emp.nom,30);
cout<<"Edad: ";
cin>>emp.edad;
cout<<"Sueldo: ";
cin>>emp.sueldo;
cout<<"Sexo: ";
cin>>emp.sexo;
fflush(stdin);
cout<<"mail 1: ";
cin.getline(emp.mat[0],30);
cout<<"mail 2: ";
fflush(stdin);
cin.getline(emp.mat[1],30);
return emp;
}

void imprimir(empleado emp)
{
cout<<endl<<"Nombre: "<<emp.nom;
cout<<endl<<"Edad: "<<emp.edad;
cout<<endl<<"Sueldo: "<<emp.sueldo;
cout<<endl<<"Sexo: "<<emp.sexo;
cout<<endl<<"Mail 1: "<<emp.mat[0];
cout<<endl<<"Mail 2: "<<emp.mat[1]<<endl;
return;
}



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

:)

eferion

Código (cpp) [Seleccionar]

for(int i=1;i<tam-1;i++)
{
for(int j=1;j<tam-i-1;j++)
{
if (vec[j].edad> vec[j+1].edad)
{
temp=vec[j].edad;
vec[j].edad=vec[j+1].edad;
vec[j+1].edad=temp;
}
}
}


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 (cpp) [Seleccionar]

for(int i=1;i<tam-1;i++)
{
  for(int j=1;j<tam-i-1;j++)
  {
    if (vec[i].edad> vec[j].edad)
    {
      struct empleado temp = vec[i];
      vec[i]= vec[j];
      vec[j] = temp;           
    }
  }
}


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.

rir3760

Cita de: zagato-krono en  5 Octubre 2013, 02:26 AMEl 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

darking664

Código (cpp) [Seleccionar]

for(int i=1;i<tam-1;i++)
{
 for(int j=1;j<tam-i-1;j++)
 {
   if (vec[i].edad> vec[j].edad)
   {
     struct empleado temp = vec[i];
     vec[i]= vec[j];
     vec[j] = temp;          
   }
 }
}


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

darking664

Cita de: rir3760 en  5 Octubre 2013, 17:55 PM
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