[C con Clase] Duda con estructuras
Steven Davidson
srd4121 en njit.edu
Lun Jul 16 02:18:46 CEST 2012
Hola Óscar,
Ya te han contestado, pero quiero comentar tu código fuente.
On 7/15/2012 11:27 AM, Oscar wrote:
> ************* Mi código : ****************
> #include <iostream>
> #include <stdio.h>
> #include <string.h>
En C++, los ficheros de cabecera estándares originalmente de C son:
<cstdio> y <cstring>, respectivamente. En tu caso, no necesitas
<cstdio>, porque usas <iostream>.
> using namespace std;
> struct Tjugadores {
Aconsejo un mejor nombre, ya que este tipo de dato no representa varios
jugadores, sino solamente uno. Usaría el nombre 'Tjugador'.
> char nombre[100];
> int puntos;
> };
> int main()
> {
> struct Tjugadores lista[6];
No necesitas escribir 'struct'. C++ entiende que 'Tjugadores' es un tipo
de dato definido a partir de 'struct'.
> char mayorj[100];
> char menorj[100];
> int mayorp;
> int menorp;
No necesitas definir estas cuatro variables. Al fin y al cabo, lo que
estás haciendo es determinando cuál jugador es el mayor y cuál el menor.
Para representar jugadores, creamos el tipo 'Tjugadores', o 'Tjugador',
como sugerí antes. Esto es,
Tjugador mayor, menor;
La ventaja es que podemos copiar registros usando el operador de
asignación. Por ejemplo,
menor = mayor = lista[0];
Y sí, las cadenas de caracteres se copian implícitamente.
Por otro lado, el copiar 104 bytes (más o menos) constantemente no es la
mejor forma de afrontar este problema. Típicamente, en estos casos,
hacemos uso del índice del array, ya que representa a cada registro (o
estructura). Por lo tanto, haríamos esto:
int menor, mayor;
menor = mayor = 0; // índice 0 => primer elemento del array
Y ahora usaríamos estos índices. Por ejemplo,
if( lista[n].puntos > lista[mayor].puntos )
mayor = n;
Así no tenemos que estar guardando la misma información en diferentes
sitios.
> int n;
> for (n=0; n<=5; n++)
> {
> cout << "Ponga el nombre del jugador : ";
> cin >> lista[n].nombre;
> cout << "Nota de " << lista[n].nombre << " : ";
> cin >> lista[n].puntos;
> }
> mayorp = lista[0].puntos;
> menorp = lista[0].puntos;
> strcpy (mayorj, lista[0].nombre);
> strcpy (menorj, lista[0].nombre);
> for(n=0; n<=5; n++)
No sugiero comenzar por n=0, porque ya hemos tratado este caso
previamente, como un caso especial. Esto es justamente lo que hace el
autor del código original.
> if (lista[n].puntos > mayorp)
> {
> mayorp = lista[n].puntos;
> strcpy(mayorj, lista[n].nombre);
> }
> if (lista[n].puntos < menorp)
Aquí sugiero usar 'if/else'; esto es,
if( ... )
{
// mayor
...
}
else if( ... )
{
// menor
...
}
> {
> menorp = lista[n].puntos;
> strcpy(menorj, lista[n].nombre);
> }
> cout << "El jugador con mas puntos es : " << mayorj << endl;
> cout << "El jugador con menor puntos es : " << menorj << endl;
Recuerda que C++ obliga a 'main()' a retornar un entero. Por convenio,
se retorna 0 (cero) para indicar una terminación correcta del programa.
> }
> Un saludo y gracias
>
>
Espero que esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase