Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DeMoNcRaZy en 9 Marzo 2015, 16:25 pm



Título: [SOLUCIONADO] Consulta - Introducir varios datos en Struct [C++]
Publicado por: DeMoNcRaZy en 9 Marzo 2015, 16:25 pm
Buenas,

Estos practicando las estructuras en c++ y bien hasta el momento más o menos voy bien y ahora tengo una consulta, he ingresado datos y luego los he mostrado, hasta hay bien, pero la cosa es si puedo introducir más de 1 dato, osea repetir progresivamente hasta que yo quieras.

Aquí mi código:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(){
  6.  
  7. int ver;
  8.  
  9. struct Personaje{
  10. char nombre[30];
  11. int edad;
  12. char empresa[30];
  13. }Trabajador;
  14.  
  15. cout << "Nombre: ";
  16. cin >> Trabajador.nombre;
  17.  
  18. cout << "Edad: ";
  19. cin >> Trabajador.edad;
  20.  
  21. cout << "Empresa: ";
  22. cin >> Trabajador.empresa;
  23.  
  24. cout << "Pulsa '1' si quieres ver los datos: ";
  25. cin >> ver;
  26.  
  27. if(ver == 1){
  28. cout << "Nombre: " << Trabajador.nombre << endl;
  29. cout << "Edad: " << Trabajador.edad << endl;
  30. cout << "Empresa: " << Trabajador.empresa << endl;
  31. }else;
  32.  
  33. cin.get();
  34. return 0;
  35. }

Eso hace que tu metas 3 datos y luego los muestre, pero me gustaría saber si pudiera meter varios datos más y luego buscar 1 en especial y me lo diga.

He encontrado referencias acá:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=495 (http://www.aprendeaprogramar.com/mod/resource/view.php?id=495)

Pero para lo que busco hacer está usando punteros y me gustaría saber si hay alguna manera de hacerlo sin usar punteros ya que hasta hay no llego aún.

Gracias, saludos.


Título: Re: Consulta - Introducir varios datos en Struct [C++]
Publicado por: eferion en 9 Marzo 2015, 16:35 pm
Lo normal es que la declaración del struct se haga fuera de la función:

Código
  1. struct Personaje{
  2.  char nombre[30];
  3.  int edad;
  4.  char empresa[30];
  5. };
  6.  
  7. int main( )
  8. {
  9.  struct Personaje Trabajador;
  10. }

Partiendo de esta base, para no guarrear mucho el código, siempre puedes crear un array fijo de elementos:

Código
  1. int main( )
  2. {
  3.  int i;
  4.  struct Personaje Trabajadores[20];
  5.  for( i=0; i < 20; ++i )
  6.    Trabajadores[ i ].edad = 20 + i;
  7. }

El ejemplo anterior crea un array de 20 elementos de tipo "Personaje". El bucle, para mostrarte un ejemplo sobre cómo se puede acceder a los elementos de ese array, asigna una edad a cada uno de ellos: 20 al primero, 21 al segundo, 22 al siguiente y así.

Esto es con arrays de tamaño fijo. También puedes crearlos del tamaño que tu quieras haciendo uso de la memoria dinámica:

Código
  1. int main( )
  2. {
  3.  int i;
  4.  struct Personaje *Trabajadores = (struct Personaje*)malloc( 20 * sizeof( struct Personaje ) );
  5.  for( i=0; i < 20; ++i )
  6.    Trabajadores[ i ].edad = 20 + i;
  7.  
  8.  free( Trabajadores );
  9. }

En el caso de la memoria dinámica, hay que acordarse de liberar luego esta memoria para poder reutilizarla en el futuro.

Un saludo.


Título: Re: Consulta - Introducir varios datos en Struct [C++]
Publicado por: DeMoNcRaZy en 9 Marzo 2015, 17:18 pm
Buenas,

Gracias @eferion por tu respuesta, gracias a ello me he estructurado como bien dices.

Ahora he echo esto y va todo bien, pero otra duda que tengo es intentar buscar el dato según el nombre u otro dato que no sea el número del array.

He echo esto:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Personaje{
  6. char nombre[30];
  7. int edad;
  8. char empresa[30];
  9. };
  10.  
  11. int main(){
  12.  
  13. Personaje *Trabajador = new Personaje[20];
  14.  
  15. int i;
  16. int num;
  17.  
  18. for(i = 0; i < 2; i++){
  19. cout << "Nombre: ";
  20. cin >> Trabajador[i].nombre;
  21.  
  22. cout << "Edad: ";
  23. cin >> Trabajador[i].edad;
  24.  
  25. cout << "Empresa: ";
  26. cin >> Trabajador[i].empresa;
  27. }
  28.  
  29. cout << "Id del personaje: ";
  30. cin >> num;
  31.  
  32. cout << "Nombre: " << Trabajador[num].nombre << endl;
  33. cout << "Edad: " << Trabajador[num].edad << endl;
  34. cout << "Empresa: " << Trabajador[num].empresa << endl;
  35.  
  36. cin.get();
  37. return 0;
  38. }

He intentado cambiar la variable 'i' pero entonces ya el for no haría su funcionamiento bien. Me he quedado aquí un poco atrancado.

Gracias, saludos.


Título: Re: Consulta - Introducir varios datos en Struct [C++]
Publicado por: eferion en 9 Marzo 2015, 17:49 pm
Iteras el array y, para cada elemento, compruebas si los parámetros de dicho elemento coinciden con los buscados:

Código
  1. std::string nombre;
  2. std::cout << "Nombre del trabajador: " << std::endl;
  3. std::cin >> nombre;
  4.  
  5. for( int i=0; i < 20; i++ )
  6. {
  7.  if ( Trabajador[i].nombre == nombre )
  8.  {
  9.    std::cout << "Nombre: " << Trabajador[i].nombre << std::endl;
  10.    std::cout << "Edad: " << Trabajador[num].edad << std::endl;
  11.    std::cout << "Empresa: " << Trabajador[num].empresa << std::endl;
  12.  }
  13. }

PD.: si usas "new", asegúrate de hacer "delete" cuando ya no vayas a usar el array para liberar la memoria


Título: Re: Consulta - Introducir varios datos en Struct [C++]
Publicado por: DeMoNcRaZy en 9 Marzo 2015, 18:35 pm
Gracias de nuevo.

La función la cumple bien, dentro del bucle, lo que si que no se ejecuta al introducir 2 veces los datos.

Y el resultado quedaría así:

(http://i.imgur.com/vP8PJkn.png)


He intentado sacando el if del bucle y cumple una función y la otra no:

(http://i.imgur.com/Qs0UQPb.png)

- Se introduce las dos veces los datos seguidos y luego te pide el nombre, pero al ingresarlo no te muestra el contenido del if.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Personaje{
  6. char nombre[30];
  7. int edad;
  8. char empresa[30];
  9. };
  10.  
  11. int main(){
  12.  
  13. Personaje *Trabajador = new Personaje[20]; // Reservamos espacio con new
  14.  
  15. int i;
  16. string nombre;
  17.  
  18. for(i = 0; i < 2; i++){ // Se repite el proceso hasta 2 veces
  19. cout << "Nombre: ";
  20. cin >> Trabajador[i].nombre;
  21.  
  22. cout << "Edad: ";
  23. cin >> Trabajador[i].edad;
  24.  
  25. cout << "Empresa: ";
  26. cin >> Trabajador[i].empresa;
  27.  
  28. delete Trabajador; // Liberamos memoria
  29. }
  30.  
  31. cout << "Introduce el nombre del trabajador: ";
  32. cin >> nombre;
  33.  
  34. if(nombre == Trabajador[i].nombre){ // Comprobamos si el arrai es igual a la variable
  35.    cout << "Nombre: " << Trabajador[i].nombre << endl;
  36.    cout << "Edad: " << Trabajador[i].edad << endl;
  37.    cout << "Empresa: " << Trabajador[i].empresa << endl;
  38. }else;
  39.  
  40. cin.get();
  41. return 0;
  42. }

PD: Liberé memoria según me aconsejaste:
Código
  1. delete Trabajador; // Liberamos memoria

Saludos.


Título: Re: Consulta - Introducir varios datos en Struct [C++]
Publicado por: DeMoNcRaZy en 9 Marzo 2015, 22:03 pm
Gracias por la ayuda,

Ya conseguí solucionarlo.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Personaje
  6. {
  7.    char nombre[30];
  8.    int edad;
  9.    char empresa[30];
  10. };
  11.  
  12. int main()
  13. {
  14.  
  15.    Personaje *Trabajador = new Personaje[20]; // Reservamos espacio con new
  16.    const int TotalTrabajadores = 2;
  17.  
  18.    int i;
  19.    string nombre;
  20.  
  21.    for(i = 0; i < TotalTrabajadores; i++)
  22.    {
  23.        cout << "Nombre: ";
  24.        cin >> Trabajador[i].nombre;
  25.  
  26.        cout << "Edad: ";
  27.        cin >> Trabajador[i].edad;
  28.  
  29.        cout << "Empresa: ";
  30.        cin >> Trabajador[i].empresa;
  31.    }
  32.  
  33.    cout << "Introduce el nombre del trabajador: ";
  34.    cin >> nombre;
  35.    for (int i = 0; i < TotalTrabajadores; i++) //un bucle para recorrer todos los trabajadores posibles
  36.    {
  37.        if(nombre == Trabajador[i].nombre)
  38.        {
  39.            cout << "Nombre: " << Trabajador[i].nombre << endl;
  40.            cout << "Edad: " << Trabajador[i].edad << endl;
  41.            cout << "Empresa: " << Trabajador[i].empresa << endl;
  42.        }
  43.    }
  44.  
  45.    cin.get();
  46.    delete[] Trabajador; // Liberamos memoria
  47.    return 0;
  48. }

Necesitaba otro bucle para recorrerlo .

Saludos.