[C con Clase] Duda con estructuras

Oscar pelucheloko en hotmail.com
Lun Jul 16 11:39:01 CEST 2012



-----Mensaje original----- 
From: Steven Davidson
Sent: Monday, July 16, 2012 2:18 AM
To: Lista de correo sobre C y C++
Subject: Re: [C con Clase] Duda con estructuras

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'.

>>> ¿Significa eso que se podría declarar asi? :

>>> Tjugador lista [6]


>      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;

>>> ¿Aquí lo que estas creando es "algo" ¿variables? ¿para guardar el mayor 
>>> y el menor jugador?

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

>>> ¿pero esto no es como declarar dos variables cualesquiera y asignarles 
>>> el valor de o?

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,

>>> lo del if else lo pensé, pero decidí seguir el patrón del autor.

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

>>> gracias por la aclaración :-)

_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ 





Más información sobre la lista de distribución Cconclase