Calculadora que acepta 100 dígitos. hecha en lenguaje C.

Iniciado por NOB2014, 13 Mayo 2016, 20:23 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola.
Estoy realmente trabado con esto, hace más de 2 días que le doy vueltas (tire unas 30 hojas oficio) al asunto y nada, como estoy a punto de abandonarlo por unos días me dije seguramente en ese foro debe haber mentes iluminadas que me puedan tirar una soga. - :huh: :huh: :huh:
Para comenzar, les dejo unos posibles ingresos que se pueden dar, la pregunta es: ¿alinearían las 2 cifras con respecto al punto o lo harían directamente? -

Se trata de la opción: Sumar

123.45  ==> 123.45
6.5                    6.5

12.34     ==>       12.34
1234.56            1234.56

1234.56  => 1234.56
123                123

Si desean no poner código no importa, solo necesitaría un poco de pseudocódigo para aclarar un poco el panorama.-

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Si lo queuieres es que tengan la misma cantidad de digitos despues del punto puedes usar los formato de cadena.

#include<stdio.h>

int main() {
double a = 123.45;
double b = 6.5;
printf("%f\n",a);
printf("%f\n",b);
printf("%.2f\n",a);
printf("%.2f\n",b);
printf("%.4f\n",a);
printf("%.4f\n",b);
}


Salida:

123.450000
6.500000
123.45
6.50
123.4500
6.5000


Si lo que quieres es alinearlos a la derecha y la misma cantidad de decimales necesitas manejar los números a cadenas de texto manualmente.

Podrías Almacenar la cadena del resultado en una variable sin alinear y despues moverla para que este alineada.

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Hola, Alberto. -
Mil disculpas, me olvide lo principal, te dejo lo que tengo de la función para que veas que lo estoy haciendo todo con el tipo char. - 

void alinear( char operandoUno[], char operandoDos[] ){
char resultado[MAX_COL], *pUno = NULL, *pDos = NULL;
int puntoUno=-1, puntoDos=-1; size_t i = 0, j;
memset( resultado, 0, MAX_COL-1 );


if((pUno=strchr(operandoUno, '.'))) {puntoUno = pUno-operandoUno;}
if((pDos=strchr(operandoDos, '.'))) {puntoDos = pDos-operandoDos;}

if( puntoUno != puntoDos ) {
j = puntoDos - 1;
if( puntoUno > puntoDos ){
if( puntoDos >= 0 ){
resultado[puntoUno] = '.';
}
while( 1 ){
if( isdigit([operandoDos[i])){
resultado[j] = operandoDos[i];
}

}
}
else{
printf("\n puntoDos %u > puntoUno %u", puntoDos, puntoUno);
}
}
}

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Aqui dejo un ejemplo para alinear cuando ya los tienes en cadena alineados a la izquiera, te los alinea a la derecha.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
int len; //Longitud
int desplazamiento; //
char *temp,*resultado;
temp = calloc(20,1);
resultado = calloc(30,1);
double a = 123.45;
double b = 6.5;
snprintf(temp,20,"%.2f",a); // Guardamos 123.45 en la cadena alineado a la izquierda
len = strlen(temp); // almacenanamos la longitud de temp
desplazamiento = 30 - len;
memset(resultado,' ',30); // Generamos la variable resultado de forma espaciada para linear la variable temp
memcpy(resultado+desplazamiento,temp,len); // Copiamo temp a resultado pero desplazado; para que este alineado
printf("%.2f\n",a); // Mostramos el resultado sin alinear
printf("%s\n",resultado);
// Repetimos ahora con b
memset(temp,0,20); // Limpiamos el valor de temp
memset(resultado,' ',30); // Limpiamos el valor de resultado
snprintf(temp,20,"%.2f",b);
len = strlen(temp);
desplazamiento = 30 - len;
memcpy(resultado+desplazamiento,temp,len);

printf("%.2f\n",b);
printf("%s\n",resultado);
}


Salida:

123.45
                        123.45
6.50
                          6.50


La primera linea es antes de estar alineado y la segunda linea es ya alineado.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW