# Separar un numero decimal en C



## dragondgold (Ago 17, 2009)

hola quisiera saber si alguien sabe como podria separar un numero de 0 a 99 necesito separar por ejemplo:

si tengo el numero 52 que me lo separe en dos registro q tenga un 5 y un 2
si tengo el numero 15 que me lo separe en un 1 y un 5

me entienden? desde ya gracias


----------



## agustinzzz (Ago 17, 2009)

Si mal no recuerdo, puedes utilizar las funciones "ceil" y "floor" dividiendo o multiplicando por 10.
Ejemplo:
Si x=52
//Código de ejemplo
decena = floor(x/10); //Devuelve decena = 5, porque 52/10=5.2 y floor me lo redondea para abajo...
unidad = x-decena*10 //Devuelve unidad = 2, porque 52-5*10=2
//Fin codigo ejemplo


----------



## dragondgold (Ago 17, 2009)

huy muchas gracias de lujo! me re sirvio!


----------



## dragondgold (Ago 17, 2009)

cha te hago una pregunta yo uso el CCS compiler para mis programas en C y cuando creo un funcion que no devuelve un valor por lo tanto uso VOID me da este error al compilar: "a numeric expression must appear here" y no se que quiere q le ponga si no devuelve nada la funcion y asi no puedo compilar mis programas


----------



## agustinzzz (Ago 17, 2009)

Si puedes postear el código de la función quizás te pueda ayudar mejor, pero se me ocurre que al final de la función estás poniendo un "return", es decir un retorno. Pero si tu función no devuelve nada, esta instrucción no debería existir.
Saludos.


----------



## Chico3001 (Ago 18, 2009)

Intenta este codigo:


```
DIGITO0=NUMERO^0x0F;	// Obtiene primer digito
DIGITO1=NUMERO^0xF0;	// Obtiene segundo digito
DIGITO1=DIGITO1>>4;	// Recorre segundo digito 4 lugares a la izquierda
```


----------



## dragondgold (Ago 19, 2009)

muchas gracias chicos les presento aqui el programa que he hecho con un problema, cuando compilo me tira un error de compilacion que dice "Out of ROM, a segment or the program is too large      convertir" y lei algo de poner una directiva llamada #separate pero no puedo solucionar el problema y por lo tanto no me deja compilar tengan en cuenta que soy nuevo en C disculpen por si hay errores muy obvios


```
#include <16f84a.h>
#include <math.h>             //libreria matematica
#fuses   XT,NOWDT
#byte    PORTB=0x06
#byte    TRISB=0x86
#byte    PORTA=0x05
#byte    TRISA=0x85
#use     delay(clock=4000000)
#use     fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int      minutos1;            //minutos del reloj 1
int      segundos1;           //segundos del reloj 1
int      minutos2;            //minutos del reloj2
int      segundos2;          //segundos del reloj2
float    decena;
int      unidad;
int      x;
int      z;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void convertir(int x){                     
          decena=floor(x/10); 
          unidad=x-(decena*10);
}
//////////////////////////////////////////////////////////////////////////////////////
void mostrar(int z){
          minutos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B0);
          output_high(PIN_B0);
          output_a(unidad);
          output_low(PIN_B1);
          output_high(PIN_B1);
          segundos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B2);
          output_high(PIN_B2);
          output_a(unidad);
          output_low(PIN_B3);
          output_high(PIN_B3);
          minutos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B4);
          output_high(PIN_B4);
          output_a(unidad);
          output_low(PIN_B5);
          output_high(PIN_B5);
          segundos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B6);
          output_high(PIN_B6);
          output_a(unidad);
          output_low(PIN_B7);
          output_high(PIN_B7);         
}
    
          
void main(void){
minutos1=0;
minutos2=0;
segundos2=59;
segundos1=59;
                while(true){
                       output_a(0);
                       output_b(0b00000000);
                       if(input(PIN_B0==1) && minutos1<=99){           //pin incrementa minutos reloj 1
                         ++minutos1;
                       }                      
                       mostrar(z);
                       if(input(PIN_B1==1) && minutos2<=99){          //pin incrementa minutos reloj 2
                         ++minutos2;
                       }
                       mostrar(z);
                       if(input(PIN_A4)==0){ //si RA4 cambia a 0 se apreto el pulsador START
                         break;
                       }
                }

reloj1:                for(z=0;segundos1>=0 && minutos1>=0;--segundos1){
                       mostrar(z);
                       if(input(PIN_B3)==1){                //si el pulsador es 1 va al otro reloj
                       goto reloj2;
                       }
                       delay_ms(999.8);
                }
                       --minutos1;
                       segundos1=59;
                       goto reloj1;
/////////////////////////////////////////////////////////////////////////////////////
reloj2:                for(z=0;segundos2>=0 && minutos2>=0;--segundos2){
                       mostrar(z);
                       if(input(PIN_B4)==1){
                       goto reloj1;
                       }
                       delay_ms(999.8);
}
                       --minutos2;
                       segundos2=59;
                       goto reloj2;
}
```

estoy usando un PIC 16f84 para hacer un reloj de ajedrez.


----------



## agustinzzz (Ago 19, 2009)

dragongold, la verdad que tu código tiene muchos errores y el error que te tira es porque el programa ocupa más de 1024 bytes de espacio, o sea más espacio del que tiene el 16f84.
Por otro lado: ¿Qué es lo que intentas hacer?
La próxima vez que postees código, hazlo entre las etiquetas "
	
	



```
[/ code]" (sin el espacio en /code) para que aparezca como lo posteo chico3001

Algunos errores en tu programa:
1) Defines muchas variables innecesariamente.
2) Revisa el código desde cero, es decir desde que comienza el main. Si te fijas estas utilizando la función mostrar(z) y z no tiene ningún valor. También dentro de esa función utilizas "x" y nunca se le asigna un valor.
3) Trata de ser un poco más prolijo con los nombres de las variables y de utilizar menor cantidad, cuando escribas mucho código te puede ayudar a identificar mejor el objetivo de cada variable.
4) Si no entiendes lo que te dije más arriba, intenta leer algún tutorial introductorio a C++.

Saludos!
```


----------



## Chico3001 (Ago 19, 2009)

Algunos consejos para programacion en C con microcontroladores:

-Evitar al maximo posible las variables globales.... usar variables locales que puedan ser destruidas al terminar la rutina
-Usar variables tipo unsigned char en vez de int.. asi el compilador reduce el tamaño del codigo

Mas consejos en nuestro proximo capitulo.....


----------



## tecnogirl (Ago 20, 2009)

dragondgold: En que formato estan originalmente los digitos 0 a 99 que quieres separar ?, porque hay muchos... Ascii, entero corto (8 bits), entero largo (16 bits), signed/unsigned long (32 bits) complemento a dos o en flotante sin punto decimal, etc. En cada caso aplica un procedimiento diferente!. Salu2.


----------



## jmnlab (Ago 20, 2009)

Yo uso algo así para separar un número en centenas, decenas y unidades:

```
char centenas = 0;
    char decenas = 0;
    char unidades = 0;

    while(registro>=100)
    {
        registro= registro -100;
        centenas++;
    }
    while(registro>=10)
    {
        registro=registro -10;
        decenas++;
    }
    while(registro>0)
    {
        registro=registro-1;
        unidades++;
    }
```

Utiliza las opciones de optimización del compilador si no lo estás haciendo para disminuir el uso de memoria en el micro.


----------



## dragondgold (Ago 20, 2009)

el compilador me dice algo de usar la directiva #SEPARATE y cuando lo pongo el programa me funciona bien no me da ningun error exepto por una que me dice que una expresion numérica ejemplo (A,A+B) debe aparecer


----------



## dragondgold (Ago 20, 2009)

ca he modificado el programa disculpen por errores tan obvios estoy en 4º año de electronica y me he dedicado a los PICS por mi cuenta y he aprendido a programar ASM y C por mi cuenta aca les dejo el programa cambiado y con la directiva #separate agregada pero ahora me da un error diferente no ya el de la memoria ROM si no este: "Exepting a basic type" y me lo da al error en la misma linea en que puse el #separate

```
#include <16f84a.h>
#include <math.h>             //libreria matematica
#fuses   XT,NOWDT
#byte    PORTB=0x06
#byte    TRISB=0x86
#byte    PORTA=0x05
#byte    TRISA=0x85
#use     delay(clock=4000000)
#use     fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int      minutos1;            //minutos del reloj 1
int      segundos1;           //segundos del reloj 1
int      minutos2;            //minutos del reloj2
int      segundos2;          //segundos del reloj2
float    decena;
int      unidad;
int      x;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void convertir(int x){                     
          decena=floor(x/10); 
          unidad=x-(decena*10);
}
//////////////////////////////////////////////////////////////////////////////////////

void mostrar(){
          minutos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B0);
          output_high(PIN_B0);
          output_a(unidad);
          output_low(PIN_B1);
          output_high(PIN_B1);
          segundos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B2);
          output_high(PIN_B2);
          output_a(unidad);
          output_low(PIN_B3);
          output_high(PIN_B3);
          minutos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B4);
          output_high(PIN_B4);
          output_a(unidad);
          output_low(PIN_B5);
          output_high(PIN_B5);
          segundos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B6);
          output_high(PIN_B6);
          output_a(unidad);
          output_low(PIN_B7);
          output_high(PIN_B7);         
}
              
void main(void){
minutos1=0;
minutos2=0;
segundos2=59;
segundos1=59;

                while(true){
                       output_a(0);
                       output_b(0b00000000);
                       if(input(PIN_B0==1) && minutos1<=99){           //pin incrementa minutos reloj 1
                         ++minutos1;
                         ++minutos2;
                       }                      
                       mostrar();
                       if(input(PIN_A4)==0){ //si RA4 cambia a 0 se apreto el pulsador START
                         break;
                       }
                }

reloj1:                for(;segundos1>=0 && minutos1>=0;--segundos1){
                       mostrar();
                       if(input(PIN_B3)==1){                //si el pulsador es 1 va al otro reloj
                       goto reloj2;
                       }
                       delay_ms(999.8);
                }
                       --minutos1;
                       segundos1=59;
                       goto reloj1;
/////////////////////////////////////////////////////////////////////////////////////
reloj2:                for(;segundos2>=0 && minutos2>=0;--segundos2){
                       mostrar();
                       if(input(PIN_B4)==1){
                       goto reloj1;
                       }
                       delay_ms(999.8);
}
                       --minutos2;
                       segundos2=59;
                       goto reloj2;
}
/////////////////////////////////////////////////////////////////////////////////////
                       

                       
                       
                      
                       
                       
                        

     
                   
                   
                   
      



#SEPARATE
```
[/code]


----------



## agustinzzz (Ago 21, 2009)

Ya está, el problema que te tira es porque en la ayuda que te dí más arriba te dije que utilices la función floor.
El problema es que para poder utilizar esa función, tuviste que incluir la librería math.h, esto ocasionó que tu programa sea demasiado grande.
Aquí posteo el programa, que al menos a mí me compiló sin problemas. El único cambio que hice, fue borrar el #separate del final y cambiar el tipo de dato de decena a entero (de esta forma haces lo mismo que con floor)

```
#include <16f84a.h>
//    #include < math.h >   //libreria matematica
    #fuses XT, NOWDT
    #byte PORTB = 0x06
    #byte TRISB = 0x86
    #byte PORTA = 0x05
    #byte TRISA = 0x85
    #use delay (clock = 4000000)
       #use fixed_io (b_outputs = PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7)
   INT minutos1;   //minutos del reloj 1
   INT segundos1;   //segundos del reloj 1
   INT minutos2;   //minutos del reloj2
   INT segundos2;  //segundos del reloj2
   int decena;

    INT unidad;
    INT x;

    //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////
    VOID convertir (int x)
    {
       
       decena = x / 10;
       unidad = x - (decena * 10);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    #SEPARATE

    VOID mostrar ()
    {
       minutos1 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B0);
       output_high (PIN_B0);
       output_a (unidad);
       output_low (PIN_B1);
       output_high (PIN_B1);
       segundos1 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B2);
       output_high (PIN_B2);
       output_a (unidad);
       output_low (PIN_B3);
       output_high (PIN_B3);
       minutos2 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B4);
       output_high (PIN_B4);
       output_a (unidad);
       output_low (PIN_B5);
       output_high (PIN_B5);
       segundos2 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B6);
       output_high (PIN_B6);
       output_a (unidad);
       output_low (PIN_B7);
       output_high (PIN_B7);
    }

    VOID main (void)
    {
       minutos1 = 0;
       minutos2 = 0;
       segundos2 = 59;
       segundos1 = 59;

       WHILE (true)
       {
          output_a (0);
          output_b (0b00000000);

          IF (input (PIN_B0 == 1)&&minutos1 <= 99)
          {
             //pin incrementa minutos reloj 1
             ++minutos1;
             ++minutos2;
    }

          mostrar ();

          IF (input (PIN_A4) == 0)
          {
             //si RA4 cambia a 0 se apreto el pulsador START
             BREAK;
    }
    }

       reloj1: FOR (; segundos1 >= 0 &&minutos1 >= 0; --segundos1)
       {
          mostrar ();

          IF (input (PIN_B3) == 1)
          {
             //si el pulsador es 1 va al otro reloj
             GOTO reloj2;
    }

          delay_ms (999.8);
    }

       --minutos1;
       segundos1 = 59;
       GOTO reloj1;

       /////////////////////////////////////////////////////////////////////////////////////
       reloj2: FOR (; segundos2 >= 0 &&minutos2 >= 0; --segundos2)
       {
          mostrar ();

          IF (input (PIN_B4) == 1)
          {
             GOTO reloj1;
    }

          delay_ms (999.8);
    }

       --minutos2;
       segundos2 = 59;
       GOTO reloj2;
    }

    /////////////////////////////////////////////////////////////////////////////////////
```


----------



## dragondgold (Ago 23, 2009)

huy muchas gracias!! te lo agradesco!!


----------

