elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ordenar alfabeticamente Nombres (Struct)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar alfabeticamente Nombres (Struct)  (Leído 9,616 veces)
Ja_90

Desconectado Desconectado

Mensajes: 51



Ver Perfil
Ordenar alfabeticamente Nombres (Struct)
« en: 22 Octubre 2014, 01:51 am »

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
  1. /* Leer 3 estructuras del arreglo "empleado" que contiene la siguiente info:
  2.    nombre
  3.    dirección ( calle, numero, localidad)
  4.    edad
  5.    sexo ( M = masculino, F = femenino)
  6.    a) Listar los empleados menores de 25 anos
  7.    b) Ordenar el vector por nombre y listarlo  */
  8.  
  9. /*---- LIBRARIES ----*/
  10.  
  11. #include <iostream>
  12. #include <string>  
  13.  
  14. #define LEN 3
  15.  
  16. using std::cout;
  17. using std::cin;
  18. using std::endl;
  19. using std::string;
  20.  
  21. /*---- FUNTIONS ----*/
  22.  
  23. void Read_Data(struct Employees people[],int);    //Read input data
  24.  
  25. void Less_25years(struct Employees people[],int); //Show the employees under 25 years old
  26.  
  27. //--------------------------------------------------//
  28. //void Sorted_Data();  //sorted alphabetically       <<<<----| Funtion
  29. //--------------------------------------------------//
  30.  
  31. void Show_Data(struct Employees people[],int);    //Show the employees names
  32.  
  33. /*---- STRUCTS -----*/
  34.  
  35. struct Direction
  36. {
  37.    char street[15];
  38.    char Number[15];
  39.    string local;
  40. };
  41.  
  42. struct Employees
  43. {
  44.    string Naame;
  45.    unsigned int age;
  46.    char sex;
  47.  
  48.    struct Direction home;
  49. };
  50.  
  51. /*---- Main Funtion -----*/
  52.  
  53. int main()
  54. {
  55.    cout << "********* STRUCT, INFO - EMPLOYEES **********\n\n";
  56.  
  57.    struct Employees Data[LEN];
  58.  
  59.    int i;
  60.  
  61.    Read_Data(Data,i);
  62.  
  63.    cout << "-------EMPLOYEES UNDER 25 YEARS OLD-------- \n\n";
  64.  
  65.    Less_25years(Data,i);
  66.  
  67.    cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
  68.  
  69.    //---------------------------------------------------------//
  70.    // funtion //sorted alphabetically  (BUBBLE SORT)            <<<----Here Funtion
  71.    //--------------------------------------------------------//
  72.  
  73.  
  74.    Show_Data(Data,i);  //Show the employees names
  75.  
  76.    return 0;
  77. }
  78.  
  79. /// READ_DATA FUNTION ///
  80.  
  81. void Read_Data(struct Employees people[], int i)
  82. {
  83.    for(i=0 ; i<LEN ; i++)
  84.    {
  85.        cout << "Employee Name: ";
  86.        getline(cin,people[i].Naame);
  87.  
  88.        cout << "Age: ";
  89.        cin >> people[i].age;
  90.        cin.ignore();
  91.  
  92.        cout << "Sex (M)-(F): ";
  93.        cin >> people[i].sex;
  94.        cin.ignore();
  95.  
  96.        cout << "\nDIRECTION \n";
  97.  
  98.        cout << "Street: ";
  99.        cin.getline (people[i].home.street, 15);
  100.  
  101.        cout << "Number: ";
  102.        cin.getline(people[i].home.Number, 15);
  103.  
  104.        cout << "Location: ";
  105.        getline(cin,people[i].home.local);
  106.  
  107.        cout << endl;
  108.    }
  109. }
  110.  
  111. /// LESS_25years FUNTION ///
  112.  
  113. void Less_25years(struct Employees people[],int i)
  114. {
  115.   for(i=0 ; i<LEN ; i++)
  116.   {
  117.        if(people[i].age < 25)
  118.        {
  119.            cout << "Name: " << people[i].Naame << endl;
  120.            cout << "Age: " << people[i].age<< endl;
  121.            cout << "Sex: " << people[i].sex << endl;
  122.            cout << "Street: " << people[i].home.street << endl;
  123.            cout << "Number: " << people[i].home.Number << endl;
  124.            cout << "Location: " << people[i].home.local << endl;
  125.        }
  126.    }
  127.    cout << endl;
  128. }
  129.  
  130. /// Sorted_Data FUNTION ///   //Show the employees names sorted alphabetically
  131.  
  132.  
  133.  
  134. /// SHOW_DATA FUNTION ///
  135.  
  136. void Show_Data(struct Employees people[],int i)
  137. {
  138.    for(i=0 ; i<LEN ; i++)
  139.    {
  140.        cout << "Name: " << people[i].Naame << endl;
  141.        cout << "Age: " << people[i].age<< endl;
  142.        cout << "Sex: " << people[i].sex << endl;
  143.        cout << "Street: " << people[i].home.street << endl;
  144.        cout << "Number: " << people[i].home.Number << endl;
  145.        cout << "Location: " << people[i].home.local << endl;
  146.    }
  147. }
  148.  
  149.  

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


En línea

:D  ::::Ja_90::::   :D
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #1 en: 22 Octubre 2014, 03:03 am »

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
  1. if (emp[0].Naame > emp[1].Naame){
  2.   Employees aux;
  3.  
  4.   aux = emp[0];
  5.   emp[0] = emp[1];
  6.   emp[1] = aux;
  7. }
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


En línea

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

Desconectado Desconectado

Mensajes: 51



Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #2 en: 22 Octubre 2014, 06:30 am »

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
  1. /// Sorted_Data FUNTION ///   //Show the employees names sorted alphabetically
  2.  
  3. void Sorted_Data(struct Employees people[], int i)
  4. {
  5.   struct Employees aux;
  6.  
  7.    for(i=0 ; i<LEN; i++)
  8.    {
  9.        for(int j=0 ; j<LEN-1 ; j++)
  10.        {
  11.            if(people[j].Naame > people[i].Naame)
  12.            {
  13.                aux = people[i];
  14.                people[i] = people[j];
  15.                people[j] = aux;
  16.            }
  17.        }
  18.    }
  19. }
  20.  
« Última modificación: 22 Octubre 2014, 06:32 am por Ja_90 » En línea

:D  ::::Ja_90::::   :D
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #3 en: 22 Octubre 2014, 13:12 pm »

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
  1. #include <algorithm>
  2.  
  3. // ...
  4.  
  5. bool SortData( const Employees& emp1, const Employees& emp2 )
  6. {
  7.  return emp1.Naame < emp2.Naame;
  8. }
  9.  
  10. int main( )
  11. {
  12.  // ...
  13.  
  14.  cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
  15.  std::sort( Data, &Data[LEN], SortData );
  16.  
  17.  // ...
  18. }

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
  1.  
  2. struct Employees
  3. {
  4.    string Naame;
  5.    unsigned int age;
  6.    char sex;
  7.  
  8.    struct Direction home;
  9.  
  10.    bool operator<( const Employees& otro ) const
  11.    {
  12.      return Naame < otro.Naame;
  13.    }
  14. };
  15.  
  16. // ...
  17.  
  18. int main( )
  19. {
  20.  // ...
  21.  
  22.  cout << "-------EMPLOYEES SORTED ALPHABETICALLY----- \n\n";
  23.  std::sort( Data, &Data[LEN] );
  24.  
  25.  // ...
  26. }

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
  1. struct Employees
  2. {
  3.    string Naame;
  4.    unsigned int age;
  5.    char sex;
  6.  
  7.    struct Direction home;
  8. };
  9.  
  10. bool operator<( const Employees& emp1, const Employees& emp2 )
  11. {
  12.  return emp1.Naame < emp2.Naame;
  13. }

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".
En línea

Ja_90

Desconectado Desconectado

Mensajes: 51



Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #4 en: 22 Octubre 2014, 18:23 pm »

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
En línea

:D  ::::Ja_90::::   :D
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #5 en: 22 Octubre 2014, 18:32 pm »

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.
En línea

Ja_90

Desconectado Desconectado

Mensajes: 51



Ver Perfil
Re: Ordenar alfabeticamente Nombres (Struct)
« Respuesta #6 en: 22 Octubre 2014, 19:10 pm »

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.
En línea

:D  ::::Ja_90::::   :D
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ordenar alfabeticamente en php con numeros « 1 2 »
PHP
dominioswww 10 7,818 Último mensaje 17 Junio 2008, 03:02 am
por WHK
programa para ordenar nombres alfabeticamente
Programación Visual Basic
elcoc_o 2 5,881 Último mensaje 18 Octubre 2010, 19:04 pm
por Psyke1
Ordenar matriz alfabeticamente
Programación C/C++
programacion_c 7 10,749 Último mensaje 25 Abril 2012, 00:19 am
por david_BS
Como ordenar alfabéticamente palabras en C++
Programación C/C++
loko5755 4 21,900 Último mensaje 5 Mayo 2014, 12:04 pm
por eferion
Ordenar alfabéticamente array de punteros a char (lenguaje C)
Programación C/C++
DanielPy 4 7,811 Último mensaje 7 Enero 2015, 18:42 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines