Ordenar alfabeticamente Nombres (Struct)

Iniciado por Ja_90, 22 Octubre 2014, 01:51 AM

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

Ja_90

Buenas quiero resolver este ejercicio y esto es lo que llevo... Mi duda es en como ordenar alfabeticamente los nombres de los empleados, (Se que puedo hacerlo por el metodo Burbuja y se como funciona este metodo) como comparo los string Naame.....ya que se hacerlo con strcmp pero esto es con cadenas de caracteres char. Ademas como inserto la variable auxiliar sabiendo que es una structura.... MUCHAS GRACIAS POR SUS RESPUESTAS....

Código (cpp) [Seleccionar]

/* Leer 3 estructuras del arreglo "empleado" que contiene la siguiente info:
   nombre
   dirección ( calle, numero, localidad)
   edad
   sexo ( M = masculino, F = femenino)
   a) Listar los empleados menores de 25 anos
   b) Ordenar el vector por nombre y listarlo  */

/*---- LIBRARIES ----*/

#include <iostream>
#include <string>   

#define LEN 3

using std::cout;
using std::cin;
using std::endl;
using std::string;

/*---- FUNTIONS ----*/

void Read_Data(struct Employees people[],int);    //Read input data

void Less_25years(struct Employees people[],int); //Show the employees under 25 years old

//--------------------------------------------------//
//void Sorted_Data();  //sorted alphabetically       <<<<----| Funtion
//--------------------------------------------------//

void Show_Data(struct Employees people[],int);    //Show the employees names

/*---- STRUCTS -----*/

struct Direction
{
    char street[15];
    char Number[15];
    string local;
};

struct Employees
{
    string Naame;
    unsigned int age;
    char sex;

    struct Direction home;
};

/*---- Main Funtion -----*/

int main()
{
    cout << "********* STRUCT, INFO - EMPLOYEES **********\n\n";

    struct Employees Data[LEN];

    int i;

    Read_Data(Data,i);

    cout << "-------EMPLOYEES UNDER 25 YEARS OLD-------- \n\n";

    Less_25years(Data,i);

    cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
   
    //---------------------------------------------------------//
    // funtion //sorted alphabetically  (BUBBLE SORT)            <<<----Here Funtion
    //--------------------------------------------------------//
   
   
    Show_Data(Data,i);  //Show the employees names

    return 0;
}

/// READ_DATA FUNTION ///

void Read_Data(struct Employees people[], int i)
{
    for(i=0 ; i<LEN ; i++)
    {
        cout << "Employee Name: ";
        getline(cin,people[i].Naame);

        cout << "Age: ";
        cin >> people[i].age;
        cin.ignore();

        cout << "Sex (M)-(F): ";
        cin >> people[i].sex;
        cin.ignore();

        cout << "\nDIRECTION \n";

        cout << "Street: ";
        cin.getline (people[i].home.street, 15);

        cout << "Number: ";
        cin.getline(people[i].home.Number, 15);

        cout << "Location: ";
        getline(cin,people[i].home.local);

        cout << endl;
    }
}

/// LESS_25years FUNTION ///

void Less_25years(struct Employees people[],int i)
{
   for(i=0 ; i<LEN ; i++)
   {
        if(people[i].age < 25)
        {
            cout << "Name: " << people[i].Naame << endl;
            cout << "Age: " << people[i].age<< endl;
            cout << "Sex: " << people[i].sex << endl;
            cout << "Street: " << people[i].home.street << endl;
            cout << "Number: " << people[i].home.Number << endl;
            cout << "Location: " << people[i].home.local << endl;
        }
    }
    cout << endl;
}

/// Sorted_Data FUNTION ///   //Show the employees names sorted alphabetically



/// SHOW_DATA FUNTION ///

void Show_Data(struct Employees people[],int i)
{
    for(i=0 ; i<LEN ; i++)
    {
        cout << "Name: " << people[i].Naame << endl;
        cout << "Age: " << people[i].age<< endl;
        cout << "Sex: " << people[i].sex << endl;
        cout << "Street: " << people[i].home.street << endl;
        cout << "Number: " << people[i].home.Number << endl;
        cout << "Location: " << people[i].home.local << endl;
    }
}



Sugerencias sobre el programa, como mejorarlo o simplificarlo si es posible.....

PD: Que no sea con vectores ya que todavia no he visto el tema....jejeje estoy de autodidacta y no he llegado alli...   ;D ;D ;D ;D
:D  ::::Ja_90::::   :D

rir3760

No veo cual sea el problema ya que puedes copiar las estructuras mediante el operador de asignación y en cuanto a comparar los campos (tipo string) "Naame" de dos estructuras puedes utilizar los operadores relacionales.

Para darte una idea si se quiere verificar si los dos primeros elementos están desordenados e intercambiarlos si es el caso el condicional seria:
Código (cpp) [Seleccionar]
if (emp[0].Naame > emp[1].Naame){
   Employees aux;
   
   aux = emp[0];
   emp[0] = emp[1];
   emp[1] = aux;
}

Donde "emp" es el nombre del array de estructuras. Por ultimo si no se desea realizar el intercambio manualmente se puede utilizar la función swap.

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

Ja_90

#2
rir3760 Si tenia la idea tal cual me dices pero estaba cometiendo un error...

Estaba colocando en la asignacion de la variable auxiliar asi....aux =  people.Naame.....tenia demas el .Naame....ahora bien quisiera saber el porque no se puede hacer esto...No tengo claro ese concepto, si me puedes explicar por favor te lo agradeceria.

La funcion qued asi:
Código (cpp) [Seleccionar]

/// Sorted_Data FUNTION ///   //Show the employees names sorted alphabetically

void Sorted_Data(struct Employees people[], int i)
{
  struct Employees aux;

   for(i=0 ; i<LEN; i++)
   {
       for(int j=0 ; j<LEN-1 ; j++)
       {
           if(people[j].Naame > people[i].Naame)
           {
               aux = people[i];
               people[i] = people[j];
               people[j] = aux;
           }
       }
   }
}
:D  ::::Ja_90::::   :D

eferion

Opción 1: ordenamiento explícito

Nos aprovechamos de la función "sort" definida en la librería algorithm. A esta función necesitamos pasarle una función que defina la forma en la que han de ser ordenados los elementos.

Código (cpp) [Seleccionar]

#include <algorithm>

// ...

bool SortData( const Employees& emp1, const Employees& emp2 )
{
  return emp1.Naame < emp2.Naame;
}

int main( )
{
  // ...

  cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
  std::sort( Data, &Data[LEN], SortData );

  // ...
}


Opción 2: sobrecarga de operadores

Si sobrecargamos el operador '<' de la clase "Employees", podemos ahorrarnos la función "SortData" definida en el ejemplo anterior:

Código (cpp) [Seleccionar]


struct Employees
{
    string Naame;
    unsigned int age;
    char sex;

    struct Direction home;

    bool operator<( const Employees& otro ) const
    {
      return Naame < otro.Naame;
    }
};

// ...

int main( )
{
  // ...

  cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
  std::sort( Data, &Data[LEN] );

  // ...
}


También se puede sobrecargar el operador fuera de la estructura... en ese caso es necesario que la función sea binaria (2 operadores):

Código (cpp) [Seleccionar]

struct Employees
{
    string Naame;
    unsigned int age;
    char sex;

    struct Direction home;
};

bool operator<( const Employees& emp1, const Employees& emp2 )
{
  return emp1.Naame < emp2.Naame;
}


Otras consideraciones:

* En C++ no hace falta usar "struct" cada vez que quieres crear un nuevo elemento de tipo "Employees".

* En C++ es mejor usar "const" a "define". El motivo es que "define" no indica el tipo de valor ( entero, decimal, ... ) y eso puede dar lugar a resultados no esperados en el código.

* El parámetro "i" que pasas con tanta alegría en las 3 funciones te lo puedes ahorrar... se pueden declarar variables sin miedo dentro de las funciones.

* Salvo causas de fuerza mayor, yo sustituiría los usos de "char*" en la dirección por "std::string".

Ja_90

Muchas gracias eferion tendre encuenta cada situacion que mencionaste....voy a buscar un poco mas de informacion respecto a la funcion 'sort' para seguir implementandola y sobre la opcion de sobrecargar los operadore, creo que es muy util en estos casos....y respecto a el uso de struct ya lo sabia solo que lo hago simplemente para tener claro e identificar la estructura mas facil en el codigo...igual afecta si lo pongo o no??,  tengo entendido que no... Igualmente muchas gracias.  ;-) ;D ;D
:D  ::::Ja_90::::   :D

eferion

No afecta... pero tampoco aporta nada... un parámetro de una función o una variable que declares únicamente pueden ser tipos nativos (int, float, double...), estructuras, clases y/o templates (que para el caso es como si fuesen clases)... los tipos nativos son conocidos por todos, luego si no es un tipo básico está claro que vas a a tratar con un objeto.

Ja_90

Bueno si tienes toda la razon, igual para identificar en el codigo puedo poner un simple comentario, creo que seria mas adecuado.... Nuevamente gracias por tus consejos, creo que estos pequenos detalles ayudan mucho.
:D  ::::Ja_90::::   :D