Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Funcion contadora digitos decimales

Estas en el tema de Funcion contadora digitos decimales en el foro de C/C++ en Foros del Web. Bueno ando haciendo una pequeña calculadora en c++ para practicar el lenguaje y que ademas me sirva para cuando tenga que verificar algo en matematica. ...
  #1 (permalink)  
Antiguo 02/02/2010, 15:25
 
Fecha de Ingreso: febrero-2010
Mensajes: 1
Antigüedad: 14 años, 1 mes
Puntos: 0
Funcion contadora digitos decimales

Bueno ando haciendo una pequeña calculadora en c++ para practicar el lenguaje y que ademas me sirva para cuando tenga que verificar algo en matematica.
El problema es que necesito una funcion que cuente los digitos decimales. He llegado a esto:

Código:
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int num_desp_coma(double);

int main(){
	double a;
	cout << "Ingrese: ";
	cin >> a;
	cout << num_desp_coma(a);
	return NULL;
}

int num_desp_coma(double num){
	int a=0;
	long int aux;
	double aux2;
	
	if(num>=1){
		aux=num;
		num=num-aux;
	}
	
	aux=0; 
	
	do{
		num=num*10;
		aux=num;
		aux2=aux;
		num=num-aux2;
		cout << ":" << num << ":";
		a++;
	}while(num<aux2);
		
	return a;
}
Lo compilan y ingresan un numero. La idea es que si por ejemplo se ingresa 145.57, la funcion devuelva 2.
Funciona perfectamente cuando ingreso 0.1111, pero si lo prueban con otro numero hace cualquier cosa y no entiendo por que, si alguien me puede ayudar se lo agradesco
  #2 (permalink)  
Antiguo 03/02/2010, 14:23
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 2
Respuesta: Funcion contadora digitos decimales

Código C:
Ver original
  1. num=num-aux;

se puede simplificar a:

Código C:
Ver original
  1. num-=aux;

no es lo que preguntas, pero lo puede mejorar
  #3 (permalink)  
Antiguo 04/02/2010, 21:06
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 6 meses
Puntos: 13
Respuesta: Funcion contadora digitos decimales

siempre y cuando no necesites hacer calculos adicionales
Puedes guardar el numero como char.
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #4 (permalink)  
Antiguo 06/02/2010, 10:41
 
Fecha de Ingreso: febrero-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Funcion contadora digitos decimales

Hola, justamente estaba necesitando esto, hace poco empece a programar y estoy media perdida :S. No se puede hacer eso más sensillo???
  #5 (permalink)  
Antiguo 07/02/2010, 07:50
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 6 meses
Puntos: 13
Respuesta: Funcion contadora digitos decimales

Hola cm_a_morir
Si dejas ke se lea el numero como una cadena de caracteres y no como numero, puedes usar esto:
Código C++:
Ver original
  1. #include <iostream.h>
  2. #include <conio.h>
  3.  
  4.  
  5. main(){
  6.  
  7.  char num[100];
  8.  int con=0;
  9.  
  10.  cout<<"Ingrese numero: ";
  11.  cin>>num;
  12.  
  13.  for(int i=0;i<100;i++){
  14.   if(num[i] == '.'){
  15.     con=strlen(num)-(i+1);
  16.   }
  17.  }
  18.  if(con == 0)
  19.   cout<<"El numero "<<num<<" no tiene decimales";
  20.  else
  21.   cout<<"El numero "<<num<<" tiene "<<con<<" decimales";
  22.  
  23.  
  24.  getch();
  25.  
  26. }
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #6 (permalink)  
Antiguo 07/02/2010, 14:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Funcion contadora digitos decimales

Gracias Mahx; ya lo entendí mejor :)
  #7 (permalink)  
Antiguo 07/02/2010, 15:28
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Funcion contadora digitos decimales

Buenas,

Sea el numero que sea, también tienes la opción de convertirlo a string:
Código C:
Ver original
  1. char numeroEnLetras[ 100 ];
  2. float numero = 3.14159265;
  3.  
  4. sprintf( numeroEnLetras, "%f", numero );

La ventaja de este código es que puedes imprimir sobre un string el numero que quieras con el formato que quieras.

Por cierto, si aceptas una sugerencia, el algoritmo de mhax, se podría optimizar un poco:
Código C:
Ver original
  1. int contarDecimales( float numero ) {
  2.     char str[ 100 ];
  3.     int i = 1;      //El primer caracter no puede ser el punto!!
  4.  
  5.     sprintf( str, "%f", numero );
  6.     while( ( str[ i ] != '.' ) && ( i < strlen( str ) ) i++;
  7.  
  8.     return ( strlen( str ) - i - 1 );
  9. }

Este algoritmo evita que tengas que recorrer hasta el final si no es necesario y, además, te ayuda a tener el numero en formato numérico si luego necesitas hacer cálculos con él (puedes saltarte la parte 'sprintf( str, "%f", numero );' si vas a pedir que te introduzcan un número por teclado como sugería mhax).

Aunque esto te puede traer un problema ya que, al menos en mi caso, '%f' sólo muestra los 5 primeros decimales del número de modo que hay que corregir un poco el algoritmo:
Código C:
Ver original
  1. int contarDecimales( float numero ) {
  2.     char str[ 100 ];
  3.     int j, i = 1;       //El primer caracter no puede ser el punto!!
  4.  
  5.     sprintf( str, "%.20f", numero );
  6.     while( ( str[ i ] != '.' ) && ( i < strlen( str ) ) ) i++;
  7.  
  8.     j = strlen( str ) - 1;
  9.  
  10.     while( ( j > i ) && ( str[ j ] == '0' ) ) j--;
  11.  
  12.     return ( j - i );
  13. }

La idea es imprimir todos los decimales y pasarle y luego ir descontando los que te has pasado (un 0 a la derecha de la coma es inútil).

Un saludo!
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #8 (permalink)  
Antiguo 08/02/2010, 19:14
 
Fecha de Ingreso: febrero-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Funcion contadora digitos decimales

gracias mhax, era lo que buscaba
  #9 (permalink)  
Antiguo 08/02/2010, 21:26
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Funcion contadora digitos decimales

Hola,

Cita:
Iniciado por genuine_carlosV2 Ver Mensaje
... Aunque esto te puede traer un problema ya que, al menos en mi caso, '%f' sólo muestra los 5 primeros decimales del número ...
Muestra solamente los 5 primeros dígitos porque el tipo de datos float tiene una precisión de 7 dígitos. Es decir, cualquier número con mayor cantidad de dígitos no se va a representar correctamente aún cuando hayas usado %.20f.

Por ejemplo, si ingresas el número 123.456, el tipo de datos float lo va a almacenar como un número exponencial, 1.23456 e +2. Y si le pides mayor precisión se la va a inventar. Si usas sprintf '%f' para mostrar ese número 'posiblemente' podría mostrar algo parecido a esto: 123.4560001, por lo que el cálculo sería inexacto (7 decimales y no 3 como se ingresó originalmente, aunque no sé si sea importante realmente).

Con el tipo de datos double obtienes una precisión de 15 digitos, (como estaba originalmente), pero aún así con números muy grandes no va a funcionar. En este caso, para mayor precisión, es mejor usar char como indica mhax.

Saludos,

Etiquetas: digitos, funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:13.