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:
#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 (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.
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.
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:
#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.
Iteras el array y, para cada elemento, compruebas si los parámetros de dicho elemento coinciden con los buscados:
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
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.
#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:
delete Trabajador; // Liberamos memoria
Saludos.
Gracias por la ayuda,
Ya conseguí solucionarlo.
#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.