[C con Clase] Ejercicio tema 11 curso de conclase

Steven R. Davidson vze266ft en verizon.net
Lun Dic 11 22:48:02 CET 2006


Hola Erick,

Erick wrote:

> Hola muxaxos les ocmento que por fin estoy estudiando el curso como 
> dios manda... Tengo unas dudillas al respecto:
> - En los ejercicios del tema 11 estructuras tengo una duda en el 2. 
> Esta es mi estructura no sé si esta bien, es que quisiera que me expliquen 
> un poco más el concepto de un campo de bits.
> 
> struct Fecha2{
>        unsigned short dia;
>        unsigned short mes;
>        unsigned short anno;
>        /*Esta parte es la del problema tengo que poner así:
>     unsigned short dia:?; // No entiendo  como asignar cuántos bits  a 
> mi variable día, por ejemplo dia acepta números del 1 al 31 cuántos 
> bits es correcto, para no desperdiciar  memoria; porque  creo que el 
> ejercicio nos pide eso no o es que me estoy desviando del ejecicio...
>  */

Exacto. Lo que se pide es definir una estructura para que "comprima" al 
máximo el espacio en un 'unsigned short' que para este ejercicio ocupará 
16 bits.

Para determinar la cantidad de bits que debes asignar a cada campo, ten 
presente que "bit" significa "dígito binario". Si necesitamos 4 bits, 
entonces son 4 dígitos (binarios), por lo que implica que podemos 
representar hasta 16 valores, ya que 2^4 = 16. Mirando el problema 
inverso, si queremos representar un valor entre 0 y 54 posibles valores, 
entonces necesitamos 6 bits ya que 2^6 = 64. Esto es porque 2^5 = 32 no 
puede alcanzar el valor de 54 y por tanto necesitamos un bit de más: 6 bits.

Si necesitas más información acerca de este tema de representaciones y 
sistemas numéricos, sugiero echar un vistazo al artículo escrito por 
Salvador Pozo en nuestra página. Puedes ir directamente a: 
http://articulos.conclase.net/numeracion/numeracion.html


>         void Guardar_a(int a){
>             if(a>=1960 && a<=2087){
>                        a-=1960;
>                        sprintf(anno, "%6d", a);}
>        }
> 
>        void Guardar_m(int m){
>             if(m>=1 && m<=12)
>             sprintf(mes,"%6d",m);
>             }
> 
> 
>        void Guardar_d(int d){
>             if(d>=1 && d<=31)
>             sprintf(dia,"%6d",d);
>             }
>        }
> 

No estás usando 'sprintf()' correctamente. El primer parámetro es una 
cadena de caracteres, pero en tu código no es así.

Si vas a guardar un valor entero a otro, hazlo directamente. Esto es,

void Guardar_d( int d )
{
   if( d>=1 && d<=31 )  dia = d;
}

> Pd: Si vieron el ejercicio que opinan d emis funciopnes tomando en 
> cuenta que tan solo esoty en el ejercicio 2, aún no llegué a los otros 
> dos...

Vas bien encaminado, aunque sugiero elegir nombres más descriptivos para 
las funciones miembros.


Espero haber aclarado la duda.

Steven








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