Calculadora muy sencilla que resuelve una expresión matemática como esta: '51+3-20*7+18/2-44*1' y muestra el resultado en pantalla.
El código de la aplicación:
Code:
#include<stdio.h> double calcular(char * ntn); void main(void) { char ntn[1024]; double res; gets(ntn); res = calcular(ntn); printf("nResultado:nn%s = %lf", ntn, res); } double calcular(char * ntn) { int i=0, num=0; char oper=' '; double result=0.0; printf("Calculando...n"); while(1) { if(ntn[x]=='+' || ntn[x]=='-' || ntn[x]=='*' || ntn[x]=='/' || ntn[x]=='0') { switch(oper) { case '+' : result = result+num; break; case '-' : result = result-num; break; case '*' : result = result*num; break; case '/' : result = result/num; break; case ' ' : result = num; break; } if(ntn[x]=='0') return result; num=0; oper = ntn[x]; } else if(ntn[x]>=48 && ntn[x]<=57) num = (num*10)+(ntn[x]-48); i++; } } |
Lo primero que se hizo fue crear una cadena de caracteres llamada 'ntn' de longitud máxima 1024 (esta longitud puede ser la que usted desee). También se a creado una varaible flotante doble (double) llamada 'res' donde se guardará el resultado de la operación. Luego capturamos la expresión matemática que será escrita por el usuario y que solo será compuesta por sumas ( + ), restas ( - ), multiplicaciones ( * ) y divisiones ( / ). Luego se llamará a la función 'calcular()' que nos devolverá el resultado de la expresión indicada y luega será impresa en pantalla.
La función que desempeñará 'calcular()' es simplemente recibir la cadena con los operandos y resolver las operaciones indicadas con ellos. Tomar en cuenta que para simplificar la el código y no tener que poner ciertas líneas para chequeo de seguridad y otras cosas, no se utilizarán parentesis '( )' para agrupar, sino que se irá operando de izquierda a derecha y a la vez acumulando el resultado para so proxima operación. Por ejemplo, si se escribe '5+6*2', la respuesta será: 22 y no 17, ya que se calculó '5+6'=11 y luego '11*2'=22.
La función 'calcular()', va leyendo la cadena de caracteres, como no vamos a preocuparnos por la seguridad de que si alguien escribe un caracter que no sea un número o un signo de operación valida, ignoraremos cualquier caracter que no sea alguno de esos. Mientras exploramos la cadena de caracteres, si encontramos un número, tomamos una variable temporal llamada 'num' que inicialmente es cero, la multiplicamos por diez y luego le sumamos el valor numerico que leímos en la cadena.
¿Ahora por qué multiplicamos pro diez a la variable 'num' antes de sumarle el número encontrado?, esto es porque si se tiene un operando de más de un digito, y vamos leyendo de uno en uno, debemos tomar en cuenta que el próximo número no se le sumará simplemente, sino que será otro digito del operando, por ejemplo:
Si se escribe el número '73', se leerá el '7' y se sumaráa 'num' que es cero multiplicado por diez que seguirá dando cero, entonces tendremos un 7 en 'num', luego cuando se lea el '3', se multiplicara 'num' que es 7 por diez, que dará 70 y luego se le sumará el '3' dando así un 73, y así ocurrirá con cualquier número sin importar la cantidad de digitos que contenga.
Cuando se encuentre un signo de operación matemática ( + - * / ), se leerá operador, si la variable que contiene el operador anterior que es 'oper' contiene el caracter de espacio en blanco, simplemente se guarda lo que contenga 'num' en la variable del resultado temporal 'result' y se reseteará la variable 'num' a cero nuevamente para la lectura de otro número y en 'oper' se pondrá el operador leído. Pero si ya se habia escrito un operando, un signo y el otro operando, se operará el valor en 'num' con 'result' con la operación indicada en 'oper' y se resetará 'num' a cero y en 'oper' se pondrá el operador leído.
Todo ese proceso se realizará hasta el fin de la cadena de caracteres que es ' ' y luego se retornará el resultado para que sea impresa en pantalla por medio de la función 'printf()'.
Nota: cuando se compara caracteres con números como en el código, es porque se está comparando si el caracter con tiene un caracter que represente un número del 0 al 9, ya que estos son los equivalentes a el 48 y el 57 en los códigos de la tabla ASCII, y también resto un caracter que representa un número con 48, para así obtener el valor numerico que se desea representar con el caracter, por ejemplo el '0' es el 48, entonces 48 - 48 = 0, el '1' es el 49, entonces 49 - 48 = 1, el '9' es el 57, entonces 57- 48 = 9, y así para los demás números (0-9).
Para más información sobre cadenas de caracteres, punteros, funciones, tipos de datos, etc., sirvase de los demás tutoriales de C/C++.