Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 13 Mayo 2016, 20:23 pm



Título: Calculadora que acepta 100 dígitos. hecha en lenguaje C.
Publicado por: NOB2014 en 13 Mayo 2016, 20:23 pm
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.


Título: Re: Calculadora que acepta 100 dígitos. hecha en lenguaje C.
Publicado por: AlbertoBSD en 13 Mayo 2016, 20:43 pm
Si lo queuieres es que tengan la misma cantidad de digitos despues del punto puedes usar los formato de cadena.

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. double a = 123.45;
  5. double b = 6.5;
  6. printf("%f\n",a);
  7. printf("%f\n",b);
  8. printf("%.2f\n",a);
  9. printf("%.2f\n",b);
  10. printf("%.4f\n",a);
  11. printf("%.4f\n",b);
  12. }

Salida:

Código:
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.


Título: Re: Calculadora que acepta 100 dígitos. hecha en lenguaje C.
Publicado por: NOB2014 en 13 Mayo 2016, 21:05 pm
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. - 

Código
  1. void alinear( char operandoUno[], char operandoDos[] ){
  2. char resultado[MAX_COL], *pUno = NULL, *pDos = NULL;
  3. int puntoUno=-1, puntoDos=-1; size_t i = 0, j;
  4. memset( resultado, 0, MAX_COL-1 );
  5.  
  6.  
  7. if((pUno=strchr(operandoUno, '.'))) {puntoUno = pUno-operandoUno;}
  8. if((pDos=strchr(operandoDos, '.'))) {puntoDos = pDos-operandoDos;}
  9.  
  10. if( puntoUno != puntoDos ) {
  11. j = puntoDos - 1;
  12. if( puntoUno > puntoDos ){
  13. if( puntoDos >= 0 ){
  14. resultado[puntoUno] = '.';
  15. }
  16. while( 1 ){
  17. if( isdigit([operandoDos[i])){
  18. resultado[j] = operandoDos[i];
  19. }
  20.  
  21. }
  22. }
  23. else{
  24. printf("\n puntoDos %u > puntoUno %u", puntoDos, puntoUno);
  25. }
  26. }
  27. }
Saludos.


Título: Re: Calculadora que acepta 100 dígitos. hecha en lenguaje C.
Publicado por: AlbertoBSD en 13 Mayo 2016, 21:12 pm
Aqui dejo un ejemplo para alinear cuando ya los tienes en cadena alineados a la izquiera, te los alinea a la derecha.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int len; //Longitud
  7. int desplazamiento; //
  8. char *temp,*resultado;
  9. temp = calloc(20,1);
  10. resultado = calloc(30,1);
  11. double a = 123.45;
  12. double b = 6.5;
  13. snprintf(temp,20,"%.2f",a); // Guardamos 123.45 en la cadena alineado a la izquierda
  14. len = strlen(temp); // almacenanamos la longitud de temp
  15. desplazamiento = 30 - len;
  16. memset(resultado,' ',30); // Generamos la variable resultado de forma espaciada para linear la variable temp
  17. memcpy(resultado+desplazamiento,temp,len); // Copiamo temp a resultado pero desplazado; para que este alineado
  18. printf("%.2f\n",a); // Mostramos el resultado sin alinear
  19. printf("%s\n",resultado);
  20. // Repetimos ahora con b
  21. memset(temp,0,20); // Limpiamos el valor de temp
  22. memset(resultado,' ',30); // Limpiamos el valor de resultado
  23. snprintf(temp,20,"%.2f",b);
  24. len = strlen(temp);
  25. desplazamiento = 30 - len;
  26. memcpy(resultado+desplazamiento,temp,len);
  27.  
  28. printf("%.2f\n",b);
  29. printf("%s\n",resultado);
  30. }

Salida:

Código:
123.45
                        123.45
6.50
                          6.50

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

Saludos