Dev - C++ - Ayuda con este intento de Struct en Dev C++

   
Vista:
Imágen de perfil de Camilo

Ayuda con este intento de Struct en Dev C++

Publicado por Camilo (3 intervenciones) el 21/07/2014 17:41:45
Hola a todos.
Esta es mi primera duda que publico en este foro. Agradecería muchísimo a quien pueda ayudarme.
Necesito desarrollar un programa para una tarea de programación.
La versión de Dev C++ es 5.6.2
Y el programa dice así:

/* El programa captura información de cada equipo de Futbol
Registro para 30 jugadores
Registre el Nombre de cada Jugador
Registre el Nombre del equipo
Arroje todos los registros del equipo
Calcule el Peso promedio del equipo
Calcule la Edad promedio del equipo*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
	//Declaración de variables
	struct JUGADORES
	{
		string nomJugador[30];
		int edJugador[30];
		double pesJugador[30];
	}J[30];
 
	int numJugador=1, contador=0;
	double pesProm=0, edadProm=0;
	char sn;
	string nomEquipo;
 
	//Presentación y recepción de variables
	cout << "\t LIGA INDEPENDIENTE DEL PACIFICO" << endl;
	cout << "\t Futbol club" << endl;
	cout << "\t----------------------------------" << endl;
 
	//Ciclo para registrar datos de los jugadores
	for (int i=0; i<30; i++)
	{
		cout << "Digite el nombre del equipo: ";
		cin >> nomEquipo;
 
		cout << "Dijite el nombre del jugador #" << numJugador++ << ": ";
		cin >> J[numJugador].nomJugador;
		cout << "Digite el peso de " << nomJugador << ": ";
		cin >> J[numJugador].pesJugador;
		cout << "Digite la edad de " << nomJugador << ": ";
		cin >> J[numJugador].edJugador;
 
		cout << "desea agregar mas jugadores? s/n: ";
		cin >> sn;
		if (sn == 'n')
		{
			i=30;
		}
	}
 
	// Muestra del Resultado
	system ("cls");
	cout << "\t LIGA INDEPENDIENTE DEL PACIFICO" << endl;
	cout << "\t Futbol club" << endl;
	cout << "\t----------------------------------" << endl;
	cout << "Nombre del equipo: " << nomEquipo << endl;
	cout << "----------------------------------" << endl;
	cout << "\tResultados: " << endl;
 
	for (int out=0; out<numJugador; out++ )
	{
		cout << "Nombre: " << J[out].nomJugador << "\tpeso: "<< J[out].pesJugador << "kg. " << "edad: " << J[out].edJugador << endl;
	}
 
	cout << "----------------------------------" << endl;
	cout << "Peso Promedio del equipo: " << pesProm << endl;
	cout << "Edad Promedio del equipo: " << edadProm << endl << endl;
}
 
/* Espero puedan ayudarme, Gracias :D */
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Ayuda con este intento de Struct en Dev C++

Publicado por vangodp (287 intervenciones) el 23/07/2014 05:27:00
2 cosas.
La estructura mejor la declaras antes de main y mejor que sea luego después de los includes.
otra cosas es que no entiendo por que declaras un string asi:
string mistring[30];
si un string se declara asi:
string mistring;
¿No lo estarás confundiendo con una cadena de caracteres?
char mistring[30]; ???

cuando creas J[30];

ya estas creando 30 variables para nombre, edad y peso no hace falta esos [30]
Lo que haces así:
1
2
3
4
5
struct JUGADORES {
   string nomJugador[30];
   int edJugador[30];
   double pesJugador[30];
}J[30];

en realidad seria asi:
1
2
3
4
5
struct JUGADORES {
   string nomJugador;
   int edJugador;
   double pesJugador;
}J[30];

Eso es asi por que estas declarando un nombre para cada jugador y no 30 nombres para cada jugador ni 30 edades ni 30 pesos.

mira este código y lo entenderás:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
 
struct JUGADORES {
    string nombre;
} j[10];
 
int main() {
   j[0].nombre = "pepe";
   j[1].nombre = "pablito";
 
   cout << j[0].nombre << endl;
   cout << j[1].nombre << endl;
}

A ver que no liemos.
cuando creas una cadena de caracteres se crea así char nombre[30]; por que se trata de una cadena de chars y debo reservar memoria para dicha cadena. Lo malo es que tengo un tamaño fijo. Pero cuando se trata de string no le tienes que indicar la longitud por que eso es automático y se asigna mientras va recibiendo los datos.
Un string es una cadena de datos de tamaño variable y por eso no tienes que indicar la longitud como una cadena de chars. Cuando entras el nombre por teclado se va guardando todas las letras en el buffer y no se va a parar en la memoria hasta que pulses enter, entonces es cuando el programa busca un lugar en memoria que contenga suficiente tamaño para poner el nombre y es entonces cuando se sabe su tamaño. Eso tiene una ventaja que puedes entrar con nombre tan largo como quieras. Lo malo es que no lo reserva ese espacio en la memoria hasta que pulses enter.

Ahora hablemos de los:
int edJugador[30];
double pesJugador[30];

¿Estas declarando 30 variables para edad y 30 variables para peso? ¿No te basta con una?

Ejemplo:
int edJugador;
double pesJugador;

No se si has entendido bien que es una estructura pero no tienes que declarar 30 variables sino una

Es cuando haces J[30]; al final de la estructura que se crea una variable de cada para 30 jugadores y por ejemplo para imprimir sus nombres seria:
cout << j[0].nombre << endl;
cout << j[1].nombre << endl;
cout << j[2].nombre << endl;
...y así hasta llegar a j[29].nombre.

Si quieres guardar el nombre para jugador 5 seria:
cin >> j[4].nombre;
¿lo pillas?

Para quedar mas claro mire estos vídeos:
http://v1.minidosis.org/C++/Tuplas/

Y mejor los mires todos los demas por que son muy buenos para reforzar tus conocimientos:
http://v1.minidosis.org/C++/

Las estructuras se llaman tuplas también pero se trata de estructuras ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Camilo

Ayuda con este intento de Struct en Dev C++

Publicado por Camilo (3 intervenciones) el 23/07/2014 17:01:16
Whow!
Muchísimas gracias si me quedó super claro.

Luego de tener en cuenta tu consejo el programa finalmente me quedó así, y funciona bastante bien para los requerimientos de ejercicio:

/*Captura información de cada equipo de Futbol
Registro para 30 jugadores
Registre el Nombre de cada Jugador
Registre el Nombre del equipo
Arroje todos los registros del equipo
Calcule el Peso promedio del equipo
Calcule la Edad promedio del equipo*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
 
struct JUGADOR
	{
		char nomJugador[30];
		int edJugador;
		float pesJugador;
	};
 
int main()
{
	//Declaración de variables
	JUGADOR jugador[30];
	int numJugador=0, contador=0, out;
	double pesProm=0, edadProm=0;
	char sn;
	string nomEquipo;
 
	//Presentación y recepción de variables
	cout << "\t LIGA INDEPENDIENTE DEL PACIFICO" << endl;
	cout << "\t Futbol club" << endl;
	cout << "-------------------------------------------------------" << endl;
	cout << "Digite el nombre del equipo: ";
	cin >> nomEquipo;
 
	//Ciclo para registrar datos de los jugadores
	for (int i=0; i<30; i++)
	{
		cout << "\n Dijite el nombre del jugador #" << numJugador++ << ": ";
		cin >> jugador[i].nomJugador;
		cout << "Digite el peso de " << jugador[i].nomJugador << ": ";
		cin >> jugador[i].pesJugador;
		pesProm += jugador[i].pesJugador;
		cout << "Digite la edad de " << jugador[i].nomJugador << ": ";
		cin >> jugador[i].edJugador;
		edadProm += jugador[i].edJugador;
 
		cout << "desea agregar mas jugadores? s/n: ";
		cin >> sn;
		if (sn == 'n')
		{
			i=30;
		}
	}
 
	// Muestra del Resultado
	system ("cls");
	cout << "\t LIGA INDEPENDIENTE DEL PACIFICO" << endl;
	cout << "\t Futbol club" << endl;
	cout << "\t----------------------------------" << endl;
	cout << "Nombre del equipo: " << nomEquipo << endl;
	cout << "----------------------------------" << endl;
	cout << "Resultados: " << endl;
 
	for (out=0; out<numJugador; out++ )
	{
		cout << "Nombre: " << jugador[out].nomJugador << "\tpeso: "<< jugador[out].pesJugador << "kg. " << "edad: " << jugador[out].edJugador << endl;
	}
 
	cout << "----------------------------------" << endl;
	cout << "Peso Promedio del equipo: " << pesProm/out << "kg" << endl;
	cout << "Edad Promedio del equipo: " << edadProm/out << " anyos" << endl;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con este intento de Struct en Dev C++

Publicado por vangodp (287 intervenciones) el 24/07/2014 02:37:48
Me alegro que hayas comprendido por que es mejor eso a que te lo resuelvan y luego te quede dudas.
Ya sabes...dale un pescado a un hombre y comerá un día o enséñale a pescar y comerá todos los días.
Una estructura se parece mucho a una clase, la diferencia es que no le puedes "ocultar" datos haciéndoles privados.
Si realmente quieres programar en C++ deberías dar prioridad a las clases por que por ejemplo en ella puedes poner las variables como las que tienes en tu estructura (nombre, peso....) y luego la misma clase tiene las funciones get y set para tomar y mostrar esos datos.
Pero no te compliques la vida, si aun no has entrado en tema de clases en el curso no me hagas caso y siga el orden por que de una cosa depende otra. Una vez entendido las estructuras te queda menos para entender las clases.
Otra cosa es que quieras ir viendo esos vídeos que te deje y practicando ya que son muy muy buenos. ;)

Y señalar tambien que string realmente no es un tipo de dato como lo es char. string es una clase y tiene varios metodos que son mas o menos como una navaja suiza. Por ejemplo si decalro un string asi:
string mistring = "Hola Mundo!";
luego hago:
mistring.size();

eso me va devolver el tamaño del string.
¿Recuerda cuando imprimes edad de esta forma cout << jugador[0].edad << endl;?
estas accediendo a la variable edad de jugador[0] que es lo que significa jugador[0].edad.
Pues bien, la estructura puede tener su propio método de imprimir (funcion) y la llamas de forma similar que cuando quieras imprimir: jugador[0].imprimirEdad();
Te haré un ejemplo muy simples pero te va abrir un horizonte muy grande y interesante.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
 
struct JUGADORES {
 
    //Metodos
    void getNombre() {
        cout << suNombre << endl;
    }
    void setNombre( string unNombre ) {
        suNombre = unNombre;
    }
 
    //Atributos
    string suNombre;
};
 
 
int main() {
    JUGADORES j[2];
 
    j[0].setNombre("pepe");
    j[0].getNombre();
}

Y para que veas que una clase es muy parecida a una estructura pero nos brinda la posibilidad de "ocultar datos y metodos" te dejo lo mismo pero con una clase:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
 
class JUGADORES {
 
    //Metodos
    public:
    void getNombre() {
        cout << suNombre << endl;
    }
    void setNombre( string unNombre ) {
        suNombre = unNombre;
    }
 
    //Atributos
    private:
    string suNombre;
};
 
 
int main() {
    JUGADORES j[2];
 
    j[0].setNombre("pepe");
    j[0].getNombre();
}

Ese mecanismo nos brinda la posibilidad de tener varias clases con por ejemplo una variable llamada nombre y que el al intentar acceder a la variable edad de una clase no acceda por accidente a la variable nombre de otra clase ya que no vamos a poder acceder directamente a dicha variable como lo haciamos con la estructura de esta forma:
j[0].suNombre;
Eso te va tirar un error que te dirá que el atributo es privado y no puedes acceder solamente desde su parte publica y para eso esta las funciones geters seters y otras.
Es muy interesante el tema y se puede decir que estas programando en C++ cuando sigues al menos 3 de los pilares de la programación a objetos que es herencia, polimorfismo y encapsulación.
herancia es por ejemplo cuando creamos una clase que tome el nombre del individuo y siempre que necesitemos tomar nombres usamos una clase que tome nombre dentro de otra por ejemplo jugadores.
Jugadores podia ser una clase que no haria falta escribir casi ninguna linea por que si piensas bien podia estar composto por otras clases que se encargan de tomar nombre, edad, peso.... y todas esas juntas serian esa clase jugador. Muy útil si señor.
El polimorfismo es la habilidad de cambiar una clase escrita anteriormente para adaptar a las necesidades. Por ejemplo yo quiero que una clase que haya anteriormente haga algo que la original no hace. En C++ se evita ir a la clase de la que hereda para hacer cambios que no sirvan para todas las demás.
Un ejemplo yo diría el caso penguino XD. Podíamos tener una clase ave con una función volar que cumple muy bien para la mayoría de pájaros y entonces heredar esa habilidad de volar de las aves en otras clases que por ejemplo canario, aguila y penguino, cada una de ellos emitiría un sonido diferente pero todos son ave. ¿Cual es el problema? ¡¡¡Penguino no vuela!!! A pesar de penguino ser una ave no puede volar. XD
No puedo ir a la clase ave y quitar eso de volar por que entonces las demás aves no volarían. Es ahí donde entra polimorfismo.
El polimorfismo permite cambiar esa función volar dentro de penguino para que solo el penguino no vuele. Te voy a dejar un ejemplo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
using namespace std;
 
class ave{
    public:
    void volar(){
        cout << "Volando" << endl;
    }
 
    void comer(){
        cout << "Comiendo" << endl;
    }
};
 
class carpintero :public ave {    // con lo de  :public ave   ...ya comemos y volamos
    public:
    void picarPalo(){
        cout << "Toc...toc..toc..toc...XD" << endl;
    }
};
 
class penguino : public ave {     // con lo de  :public ave   ...ya comemos y volamos
    public:
    void nadar(){
        cout << "Splashhhh ...nadando XD" << endl;
    }
    void volar(){ // Observe que penguino ya no vuela por que modificamos la funcion volar
        cout << "Los penguinos no vuelan" << endl;
    }
};
 
 
int main() {
    //creamos objetos de penguino y carpintero
    carpintero pajaroLoco;
    penguino   frost;
 
    //vamos a ver si todos comen y vuelan XD
 
    cout << "carpintero: ";
    pajaroLoco.volar();
 
    cout << "Penguino: ";
    frost.volar();
 
 
    //Ahora veremos si todos comen
    cout << "\n\ncarpintero: ";
    pajaroLoco.comer();
 
    cout << "Penguino: ";
    frost.comer();
 
    //Y a ver las habilidades especiales de ambos pajaros
    cout << "\n\ncarpintero: ";
    pajaroLoco.picarPalo();
 
    cout << "Penguino: ";
    frost.nadar();
 
    cin.ignore(); //hacemos una pausa
    return 0;
}

Aquí veras que tanto penguino como carpintero heredan de ave que todas tienen en común volar y comer pero los penguinos no vuelan y esa función esta modificada dentro de penguino (polimorfismo).

Aparte cada pájaro hace lo suyo como por ejemplo penguino nada y carpintero pica madera eso no es característico de todas las aves así que son métodos propios de penguino y carpintero solamente.

No tendría que escribir nunca mas ningún método volar y comer para pájaros.
Es mas aun debería ir mas lejos por que comer es una cosa que hacen todos los seres vivos así que ave debería heredar de "seresVivos" la posibilidad de comer y después penguino y carpintero heredarían todo de ave.
Es algo lioso pero así es la poo, no se si te das cuenta que no tienes que reescribir mucho código y eso es lo que se busca( re-aprovechamiento ).
En ese ejemplo no uso encapsulación por que no trabajo con variables pero lo has visto en el otro ejemplo.
Ya no alargo mas que para eso están los vídeos.XD
Suerte!
PD: A esta altura ya te harás dado cuanta de la potencia de C++, Todo eso unido a los punteros hacen un lenguaje imbatible. Complicado pero imbatible. XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Camilo

Ayuda con este intento de Struct en Dev C++

Publicado por Camilo (3 intervenciones) el 24/07/2014 03:31:44
En pocas palabras yo diría: Oooohhhh....! Ilumination!
Super interesante! Muchísimas Gracias VANGODP!

Te cuento que en este momento estoy estudiando diseño y programación de videojuegos en el SENA. Estoy en primer trimestre y será una carrera de un año y medio. Ya estamos iniciando con el proyecto final, y lo vamos a desarrollar con UDK el cual maneja C++

Así que este será el pan de cada día. Y obviamente entre mas tutoriales encuentre para programación orientada a objetos para videojuegos, mucho mejor.

Por si las moscas, este es mi último reel de trabajos: https://vimeo.com/80093837
Mi especialización Motion Graphics 3D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con este intento de Struct en Dev C++

Publicado por vangodp (287 intervenciones) el 24/07/2014 05:53:48
Impresionante! =D
Eso ya me supera XD
Tengo ganas de hacer un juego algún día pero no creo que sera en 2d ya que lo veo muy complicado los 3d.
Aprovecha para absorber conocimientos por que a pesar de hacerse largo en realidad no es tanto así.
No hago ningún curso en realidad voy mucho por los foros y autodata.
La verdad es que ya podía haber echo algo pero como no vivo de esto no me pilla con prisas ya que aun no tengo muy claro que es lo que voy hacer. XD
As veces por mas que sepas programas te sientas y dices. ¿Y que programo? XD
Me gusta mucho los 2D y estoy afinando con SFML y C++ a ver que sale ;)
Si necesitas algo es solo buscarme por la red, pero hay muchos fieras por aquí también que te pueden ayudar y hasta mejor que yo =)
forosdelweb, elhacker.net y y elrincóndelprogramador son buenos lugares donde buscar info también entre otros.
Hay foros especializados para C/C++ también.
Surte ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar