Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 4 Enero 2016, 02:10 am



Título: [Súper solucionado] Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: NOB2014 en 4 Enero 2016, 02:10 am
Hola a todos.
Bueno como el enunciado lo dice es lo que quiero hacer, lo que pasa es que la parte fraccionaria no sale limpia como yo deseo, o sea, el programa que expongo a continuación la parte fraccionaria da como resultado 0.345000 y lo que necesito es 345000 a secas sin el cero y el punto, hay alguna manera de lograrlo.-

#include <stdio.h>
#include <windows.h>
 
int main(void){
   float numero = 12.345;
   int parte_entera;
   double parte_decimal;   
   
   parte_entera = numero/1;
   parte_decimal = numero-parte_entera;
   
   system( "cls" );   
   printf( "\n La parte entera   %d", parte_entera );
   printf( "\n La parte decimal  %f", parte_decimal );
   
   return 0;
}

Desde ya muchas gracia y un abrazo.
Daniel


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: 0xFer en 4 Enero 2016, 03:24 am
Multiplicalo por 1000


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: NOB2014 en 4 Enero 2016, 03:54 am
Hola 0xFer.
Gracias por ocuparte, lo que vos propones daría 12345 y lo que necesito es:
entero   = 12
fraccion = 345
Ya encontré una manera solo que no descubro cuál es la condición para finalizar el while, no voy a saber si la parte fraccionaria tiene 1,2,3,10 dígitos.-

while( a <= 2){
   parte_decimal  *=10;
   a++;
}

Saludos.
Daniel


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: engel lex en 4 Enero 2016, 04:23 am
usa etiquetas GeSHi al publicar código

espero se entienda(y funcione)
Código
  1. float numero = 12.123;
  2. int entero = numero;
  3. numero -= entero;
  4.  
  5. while((numero - (int)numero) != 0){
  6.   numero  *=10;
  7. }


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: MAFUS en 4 Enero 2016, 09:55 am
Hazlo a mano, sobre un papel y apunta los pasos que vas haciendo.
Después solo tienes que traducirlo a C.
Ten en cuenta varias cosas:
Que ocurre si el numero original es entero
Que ocurre si el tiene infinitos decimales.

Por otra parte, si no es un ejercicio y necesitas esa funcionalidad para un programa mas grande, piensa que ya existe esta función en la librería estándar de C.


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: kondrag_X1 en 4 Enero 2016, 11:13 am
y porque no utilizas %n.mf para decir el numero de decimales que quieres?

por ejemplo
printf("%n.mf",numero);

n -> indica la cantidad de números por delante de la coma
m -> la cantidad de números por detrás de la coma.
 así tu número 12,123
printf("parte entera   : %4.0f",numero); 12
printf("parte decimal : %0.4f",numero); 123


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: user-marcos en 4 Enero 2016, 11:51 am
Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.  float f = 12.598;
  6.  int entero = (int)f;
  7.  float decimal = f - entero;
  8. }
  9.  


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: NOB2014 en 4 Enero 2016, 13:22 pm
Hola.
Tengo consultas para los 4, pero no las voy a poner todas juntas, solo que el código de user-marcos me da correcto como debe ser la parte entera pero la parte fraccionaria da como resultado: 0.598000. Lo que necesito es que dé: 598 sin cero a la izquierda ni el punto o sea un número entero.-

Código:
#include <stdio.h>
#include <windows.h>
 
int main(void){
float f = 12.598;
int entero = (int)f;
float decimal = f - entero;

system( "cls" );
printf("\n parte entera   : %d",entero);
printf("\n parte decimal : %f",decimal);

return 0;
}

engel lex te dejo el código como yo lo interprete, la lógica es la correcta, pero no sé qué pasa el resultado de la parte fraccionaria no es la esperada:12300015.000000, voy a hacer algunas prácticas para intentar que de el resultado que yo necesito.-

Código:
#include <stdio.h>
#include <windows.h>
 
int main(void){
float numero = 12.123;
int entero = numero;
numero -= entero;
 
while((numero - (int)numero) != 0){
numero  *=10;
}

system( "cls" );
printf("\n parte entera   : %d", entero);
printf("\n parte decimal : %f", numero);

return 0;
}

Por el momento es todo, luego les hago la consulta a los otros 2 foristas.-

Me es imposible utilizar las etiquetas GeSHi, no sé que pasa.-

Saludos.
Daniel


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: user-marcos en 4 Enero 2016, 13:27 pm
Lo que he puesto antes estaba incompleto.

Código
  1. #include<stdio.h>
  2. #include <math.h>
  3.  
  4. #define NUMERO_DECIMALES 4
  5. int main()
  6. {
  7.  float f = 12.5985;
  8.  int entero = (int)f;
  9.  float decimal = f - entero;
  10.  int i_decimal = decimal * pow(10,NUMERO_DECIMALES);
  11.  printf("%i",i_decimal); // ->  5985
  12. }
  13.  


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: MAFUS en 4 Enero 2016, 17:57 pm
A ver, ¿qué tal así?

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. unsigned p_fraccionaria(double d) {
  5.    unsigned retvalue;
  6.  
  7.    d = fabs(d);
  8.    d -= (unsigned long)d;
  9.    d *= 1000000; // <-- 6 decimales ya es bastante precision
  10.  
  11.    retvalue = d;
  12.  
  13.    if(retvalue < d)        // <-- por si en la conversion ha habido
  14.        ++retvalue;         // <-- perdida de precision
  15.    else if(retvalue > d)   //
  16.        --retvalue;         //
  17.  
  18.    if(retvalue)                // <-- Si no es 0, intentamos
  19.        while(!(retvalue % 10)) // <-- quitar 0 por la derecha
  20.            retvalue /= 10;     //
  21.  
  22.    return retvalue;
  23. }
  24.  
  25. int main() {
  26.    double num;
  27.  
  28.    num = 12.34;
  29.    printf("%f : %u\n", num, p_fraccionaria(num));
  30.  
  31.    num = 12.34567890123;
  32.    printf("%f : %u\n", num, p_fraccionaria(num));
  33.  
  34.    num = 12.00;
  35.    printf("%f : %u\n", num, p_fraccionaria(num));
  36.  
  37.    num = 12;
  38.    printf("%f : %u\n", num, p_fraccionaria(num));
  39.  
  40.    num = -12.34;
  41.    printf("%f : %u\n", num, p_fraccionaria(num));
  42.  
  43.    return 0;
  44. }


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: Noob_boy en 4 Enero 2016, 18:07 pm
yo lo que haría seria hacer el logaritmo en base 10 en entero del numero con sus decimales y así obtendría la parte entera, luego se la restas al numero original y obtienes la parte fraccionaria.

mira yo lo utilice para obtener el reverso de un numero
Código
  1. int reverso(int num){
  2. int reverso=0,exp=log10(num);
  3. while(num>0){
  4. reverso = reverso + (num%10)*pow(10,exp);
  5. exp--;
  6. num=num/10;
  7. }
  8. return reverso;


edito:

He probado ha hacerlo y he visto una manera más simple de hacerlo

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4. float num=44.5;
  5. int entera=num;
  6. float fracionaria=num-entera;
  7. }
  8.  
creo que era eso lo que se buscaba


Título: Re: Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: NOB2014 en 4 Enero 2016, 20:47 pm
Hola, gente.
MAFUS, gracias por ocuparte, el ejemplo de user-marcos funciona a la perfección y es en parte lo que proponías, en cuanto a hacerlo en un papel ya lo hice y lo quiero aplicar al código de engel lex pero todavía no lo logro.
Citar
Qué ocurre si el número original es entero,

ya lo probé y da como parte fraccionaria:cero(correcto)
Citar
Que ocurre si tiene infinitos decimales
me parece que esto se soluciona con: #define NUMERO_DECIMALES 4.-
Por último, decirte que voy a probar el código que posteaste se lo ve interesante.- 
Noob_boy, me gustaría que postearas algún ejemplo de lo que propones, te imaginaras que con 63 años ya no me acuerdo de logaritmo, desde ya muchas gracias.-

Saludos.
Daniel


Título: Re: [Súper solucionado] Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: geeke en 4 Enero 2016, 22:11 pm
Tambien dispones de modf incluida en math.h la cual hace justo lo que buscas:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main(void)
  5. {
  6.    double num = 32.125, fract, entero;
  7.  
  8.    fract = modf(num, &entero);
  9.    printf ("Entera: %g\nDecimal: %g\n", entero, fract);
  10.  
  11.    return 0;
  12. }

Saludos


Título: Re: [Súper solucionado] Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: engel lex en 5 Enero 2016, 01:06 am
llegué tarde XD pero venia a decir que tal vez mi código falla por cosas de la precisión de la variable flotante


Título: Re: [Súper solucionado] Separar parte decimal y parte fraccionaria en lenguaje C.
Publicado por: NOB2014 en 5 Enero 2016, 18:10 pm
Hola.

Código
  1. #include<stdio.h>
  2.  
  3. int main( void ){
  4. double numero = 12.09;
  5. int entero = numero, x = 1;
  6. double decimal = numero - entero;
  7.  
  8. printf("\n %g\n", decimal);
  9.  
  10. while(x <= 2 ){
  11. decimal  *=10;
  12. x++;
  13. }
  14.  
  15. printf("\n La parte fraccionaria..:%g\n", decimal);
  16.  
  17. return 0;
  18. }

Saludos.
Daniel