Operaciones matemáticas con números en cadena

Iniciado por petrusqui, 1 Abril 2012, 18:09 PM

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

petrusqui

Buenas,

Estos dias he estado pensado en como poder hacer un programa que haga operaciónes matemáticas, pero en vez de pedir al usuario que operación quiere realizar, tenga que introducir una cadena y hacer las operaciones, un ejemplo.

5 + 2 - 1

No necesito que me escriban el código ni nada por el estilo, solo necesito alguna idea de como hacer-lo. Como soy nuevo, esto se me hace bastante complicado...

Gracias de antemano.


Saludos

BlackZeroX

Usa una conversión de estructuras infija a postija, y después EVALÚA la estructura postfija!¡.

Dulces Lunas!¡.
The Dark Shadow is my passion.

$Edu$

Depende a que grado de dificultad quieres hacer que realize operaciones, dependera como lo haras. Por ejemplo.. tenes pensado que haga cosas como esta:

5 + 2 - 1 * 3 + 6

o como esta:

(7+3)*4-1(4+5(2*3+1)+6)+10

¿?

petrusqui

Cita de: BlackZeroX (Astaroth) en  1 Abril 2012, 18:49 PM
Usa una conversión de estructuras infija a postija, y después EVALÚA la estructura postfija!¡.

Dulces Lunas!¡.

Ui, todavia no he llegado a este nivel, cuando lea un poco más me pongo seguro en estudiar las diferentes estructuras :)

Gracias por la respuesta.

Cita de: $Edu$ en  1 Abril 2012, 19:04 PM
Depende a que grado de dificultad quieres hacer que realize operaciones, dependera como lo haras. Por ejemplo.. tenes pensado que haga cosas como esta:

5 + 2 - 1 * 3 + 6

o como esta:

(7+3)*4-1(4+5(2*3+1)+6)+10

¿?

La primera que no hace mucho que empece en C/C++ :P

Gracias por la respuesta :D

avesudra

Si quieres meterle signos de operación de dividir y multiplicar te complicas más la vida pues tienes que mirar la prioridad yo lo haría así si solo fuese sumar y restar :
-Pedir la cadena.
-Buscar el primer operando en la cadena.
LOOP(mientras cadena no sea igual que '\0')
{
-Cortar la cadena(con la función de abajo)desde el operando anterior
(si es la primera vez será[0] )hasta ese operando y convertirla a int
con la función atoi()(ya que sólo te quedarán los números).
-Si ese operando es - pasar ese valor en negativo.
-Sumar ese valor convertido, a una variable resultado.
-Buscar el siguiente operando en la cadena.
}
Imprimir la variable resultado.

Código (cpp) [Seleccionar]
char *substring(size_t start, size_t stop, const char *src, char *dst, size_t size)
{
   int count = stop - start;
   if ( count >= --size )
   {
      count = size;
   }
   sprintf(dst, "%.*s", count, src + start);
   return dst;
}

Recuerdo esto solo es para sumar o restar , si quieres hacer multiplicaciones y divisiones tienes que complicarlo mas.Yo optaría por ir haciéndolo poco a poco y después ya le añades más operaciones , prioridad con paréntesis etc..
Puede haber algun fallo , si és así hazlo saber.
Un saludo :)
Regístrate en


farresito

Cita de: avesudra en  1 Abril 2012, 19:38 PM
Si quieres meterle signos de operación de dividir y multiplicar te complicas más la vida pues tienes que mirar la prioridad yo lo haría así si solo fuese sumar y restar :
-Pedir la cadena.
-Buscar el primer operando en la cadena.
LOOP(mientras cadena no sea igual que '\0')
{
-Cortar la cadena(con la función de abajo)desde el operando anterior
(si es la primera vez será[0] )hasta ese operando y convertirla a int
con la función atoi()(ya que sólo te quedarán los números).
-Si ese operando es - pasar ese valor en negativo.
-Sumar ese valor convertido, a una variable resultado.
-Buscar el siguiente operando en la cadena.
}
Imprimir la variable resultado.

Código (cpp) [Seleccionar]
char *substring(size_t start, size_t stop, const char *src, char *dst, size_t size)
{
   int count = stop - start;
   if ( count >= --size )
   {
      count = size;
   }
   sprintf(dst, "%.*s", count, src + start);
   return dst;
}

Recuerdo esto solo es para sumar o restar , si quieres hacer multiplicaciones y divisiones tienes que complicarlo mas.Yo optaría por ir haciéndolo poco a poco y después ya le añades más operaciones , prioridad con paréntesis etc..
Puede haber algun fallo , si és así hazlo saber.
Un saludo :)
La funcion atoi esta considerada obsoleta.

avesudra

#7
Cita de: farresito en  2 Abril 2012, 00:38 AM
La funcion atoi esta considerada obsoleta.
ah pues no lo sabia la verdad , bueno supongo que lo de ser novato me pasa factura, y ¿cual se utiliza en vez de esa ?
EDITO: Gracias , la que se utiliza si no me indicas otra vez lo contrario es strtol.
Regístrate en

farresito

Cita de: avesudra en  2 Abril 2012, 01:12 AM
ah pues no lo sabia la verdad , bueno supongo que lo de ser novato me pasa factura, y ¿cual se utiliza en vez de esa ?
EDITO: Gracias , la que se utiliza si no me indicas otra vez lo contrario es strtol.
No, si yo de conocimientos no voy sobrado ni mucho menos, pero son cosas que se te quedan de haberlo leido en algun sitio. Y si, efectivamente, la nueva, o la mas adecuada, funcion es strtol.

BlackZeroX

#9
Cita de: $Edu$ en  1 Abril 2012, 19:04 PM
Depende a que grado de dificultad quieres hacer que realize operaciones, dependera como lo haras. Por ejemplo.. tenes pensado que haga cosas como esta:

5 + 2 - 1 * 3 + 6

o como esta:

(7+3)*4-1(4+5(2*3+1)+6)+10

¿?

@EDU:
*A eso se llama conversión a cola de prioridad y se ocupa en la conversion de ifija a postfija

Eso es indiferente con lo que ya le dije... inclusive Sen(2*(4^(tan(4-5/5)*sqr(4+5*x)))) convirtiendo a una estructura postfija lo resuelve fácilmente con una evaluación muy sutil y limpia...

Aquí te dejo el algoritmo MUY CLARO (LEE, ENTIENDE, COMPRE, TRADUCE Y ADAPTA)... te recomiendo tener a la mano lapiz y papel y si no le entiendes revisa algunos videos en youtube sobre el tema (para que veas el proceso).

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm
tambien lee esto...
http://quegrande.org/apuntes/EI/1/EDI/teoria/06-07/tad_-_pila_-_expresiones_aritmeticas.pdf

Los códigos de la 2da liga están en Delphi si no mal recuerdo...

mírate este video... para que te quede mas claro...

(La cagaron con la música en ingles... esta mejor la original.)
Ademas de in-fija a postfija te muestra como evaluar la postfija... Así que no hay pre-testo ahora

[youtube=425,350]http://www.youtube.com/watch?v=X7U_I3QDdS8&feature=relmfu[/youtube]


Cita de: avesudra en  2 Abril 2012, 01:12 AM
ah pues no lo sabia la verdad , bueno supongo que lo de ser novato me pasa factura, y ¿cual se utiliza en vez de esa ?
EDITO: Gracias , la que se utiliza si no me indicas otra vez lo contrario es strtol.

usa sscanf();

por ejemplo:


    float Variablefloat = 0.0f;
    sscanf("10.510", "%f", &Variablefloat);
    printf("%f\n", Variablefloat);


aunque es mejor strol() y/o strod

Dulces Lunas!¡.
The Dark Shadow is my passion.