[SOLUCIONADO] Consulta - Introducir varios datos en Struct [C++]

Iniciado por DeMoNcRaZy, 9 Marzo 2015, 16:25 PM

0 Miembros y 2 Visitantes están viendo este tema.

DeMoNcRaZy

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

using namespace std;

int main(){

int ver;

struct Personaje{
char nombre[30];
int edad;
char empresa[30];
}Trabajador;

cout << "Nombre: ";
cin >> Trabajador.nombre;

cout << "Edad: ";
cin >> Trabajador.edad;

cout << "Empresa: ";
cin >> Trabajador.empresa;

cout << "Pulsa '1' si quieres ver los datos: ";
cin >> ver;

if(ver == 1){
cout << "Nombre: " << Trabajador.nombre << endl;
cout << "Edad: " << Trabajador.edad << endl;
cout << "Empresa: " << Trabajador.empresa << endl;
}else;

cin.get();
return 0;
}


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

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.
Esta página web no está disponible - Google Chrome

eferion

Lo normal es que la declaración del struct se haga fuera de la función:

struct Personaje{
  char nombre[30];
  int edad;
  char empresa[30];
};

int main( )
{
  struct Personaje Trabajador;
}


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

int main( )
{
  int i;
  struct Personaje Trabajadores[20];
  for( i=0; i < 20; ++i )
    Trabajadores[ i ].edad = 20 + i;
}


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:

int main( )
{
  int i;
  struct Personaje *Trabajadores = (struct Personaje*)malloc( 20 * sizeof( struct Personaje ) );
  for( i=0; i < 20; ++i )
    Trabajadores[ i ].edad = 20 + i;

  free( Trabajadores );
}


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

Un saludo.

DeMoNcRaZy

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

using namespace std;

struct Personaje{
char nombre[30];
int edad;
char empresa[30];
};

int main(){

Personaje *Trabajador = new Personaje[20];

int i;
int num;

for(i = 0; i < 2; i++){
cout << "Nombre: ";
cin >> Trabajador[i].nombre;

cout << "Edad: ";
cin >> Trabajador[i].edad;

cout << "Empresa: ";
cin >> Trabajador[i].empresa;
}

cout << "Id del personaje: ";
cin >> num;

cout << "Nombre: " << Trabajador[num].nombre << endl;
cout << "Edad: " << Trabajador[num].edad << endl;
cout << "Empresa: " << Trabajador[num].empresa << endl;

cin.get();
return 0;
}


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.
Esta página web no está disponible - Google Chrome

eferion

Iteras el array y, para cada elemento, compruebas si los parámetros de dicho elemento coinciden con los buscados:

Código (cpp) [Seleccionar]
std::string nombre;
std::cout << "Nombre del trabajador: " << std::endl;
std::cin >> nombre;

for( int i=0; i < 20; i++ )
{
  if ( Trabajador[i].nombre == nombre )
  {
    std::cout << "Nombre: " << Trabajador[i].nombre << std::endl;
    std::cout << "Edad: " << Trabajador[num].edad << std::endl;
    std::cout << "Empresa: " << Trabajador[num].empresa << std::endl;
  }
}


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

DeMoNcRaZy

#4
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í:




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



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

using namespace std;

struct Personaje{
char nombre[30];
int edad;
char empresa[30];
};

int main(){

Personaje *Trabajador = new Personaje[20]; // Reservamos espacio con new

int i;
string nombre;

for(i = 0; i < 2; i++){ // Se repite el proceso hasta 2 veces
cout << "Nombre: ";
cin >> Trabajador[i].nombre;

cout << "Edad: ";
cin >> Trabajador[i].edad;

cout << "Empresa: ";
cin >> Trabajador[i].empresa;

delete Trabajador; // Liberamos memoria
}

cout << "Introduce el nombre del trabajador: ";
cin >> nombre;

if(nombre == Trabajador[i].nombre){ // Comprobamos si el arrai es igual a la variable
   cout << "Nombre: " << Trabajador[i].nombre << endl;
   cout << "Edad: " << Trabajador[i].edad << endl;
   cout << "Empresa: " << Trabajador[i].empresa << endl;
}else;

cin.get();
return 0;
}


PD: Liberé memoria según me aconsejaste:
Código (cpp) [Seleccionar]
delete Trabajador; // Liberamos memoria

Saludos.
Esta página web no está disponible - Google Chrome

DeMoNcRaZy

Gracias por la ayuda,

Ya conseguí solucionarlo.

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

struct Personaje
{
    char nombre[30];
    int edad;
    char empresa[30];
};

int main()
{

    Personaje *Trabajador = new Personaje[20]; // Reservamos espacio con new
    const int TotalTrabajadores = 2;

    int i;
    string nombre;

    for(i = 0; i < TotalTrabajadores; i++)
    {
        cout << "Nombre: ";
        cin >> Trabajador[i].nombre;

        cout << "Edad: ";
        cin >> Trabajador[i].edad;

        cout << "Empresa: ";
        cin >> Trabajador[i].empresa;
    }

    cout << "Introduce el nombre del trabajador: ";
    cin >> nombre;
    for (int i = 0; i < TotalTrabajadores; i++) //un bucle para recorrer todos los trabajadores posibles
    {
        if(nombre == Trabajador[i].nombre)
        {
            cout << "Nombre: " << Trabajador[i].nombre << endl;
            cout << "Edad: " << Trabajador[i].edad << endl;
            cout << "Empresa: " << Trabajador[i].empresa << endl;
        }
    }

    cin.get();
    delete[] Trabajador; // Liberamos memoria
    return 0;
}


Necesitaba otro bucle para recorrerlo .

Saludos.
Esta página web no está disponible - Google Chrome