Ejercicios de Funciones

9. Convertir texto <=> real

/*
 *   funciones para convertir de texto a real (solo positivos)
 *   y de real a texto (solo positivos)
 *
 *   Germán Andrés Xander 2021
 *
 */

#include <iostream>
#define contidad_de_decimales 4
using namespace std;

int potencia(int x, int y);
float texto_a_real(char *texto);
char* real_a_texto(float valor);

int main() {
    char texto[]="123,431594";
    cout.precision(9);

    cout<<texto_a_real(texto)<<endl;

    char * letras=real_a_texto(12345.89646);
    cout<<letras;
    delete[] letras;
    return 0;
}

int potencia(int x, int y) {
    int i,potencia=1;
    if(y == 0){
        return 1;
    }
    for(i=1; i<=y; i++){
        potencia=potencia*x;
    }
    return potencia;
}

float texto_a_real(char *texto) {
    int i = 0;
    float resultado=0;
    while (texto[i]!='.' && texto[i]!=',' && texto[i]) {	//encuentro la posición del separador
        i++;
    }
    for(int j=0; j<i; j++) {
        resultado=resultado+(texto[j]-'0')*potencia(10,i-j-1);
    }
    i++;  //salteo el punto
    int decimal=1;
    while (texto[i]) {
        float parte_decimal=float(texto[i]-'0')/potencia(10,decimal);
        resultado=resultado+parte_decimal;
        i++;
        decimal++;
    }
    return resultado;
}

char* real_a_texto(float valor) {
    int digitos=1;
    int parte_entera= int(valor);
    float parte_decimal=valor-parte_entera;
    while(parte_entera > 1) {	//cuento los dígitos enteros
        parte_entera=parte_entera/10;
        digitos++;
    }
    parte_entera= int(valor);
    char * texto = new char[digitos + contidad_de_decimales + 1]();	// +1 para el \null
    for(int i=digitos-1; i>=0; i--) {
        int resto=parte_entera%10;
        parte_entera=parte_entera/10;
        texto[i]=resto+'0';
    }
    texto[digitos]='.';

    for(int i=1; i<=contidad_de_decimales; i++) {
        parte_decimal=parte_decimal*10;
        int cifra=int(parte_decimal);
        texto[digitos+i]=cifra+'0';
        parte_decimal=parte_decimal-cifra;
    }
    return texto;
}