[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