/* * File: calcular.cpp * Author: Miguel Guanira * * Created on 21 de octubre de 2009, 08:27 AM */ #include #include #include int esOperando(char **, int); enum Logico {NO, SI}; //NO = 0, SI = 1 int main(int argc, char** argv) { float pila[20], *top, num1, num2; Logico seguir = SI; //Verifica si la expresión es correcta int i = 1; top = pila; // analizamos uno a uno los argumentos de la línea de comandos while (--argc > 0 && seguir){ if (esOperando(argv, i)) *top++ = atof(argv[i]); // apilamos el argunmento // el ++ se aplica a top, y no a *top else { // si es un operador, desapilamos dos operandos y los evaluamos if (top != pila){ // si la pila no está vacía num2 = *--top; if(top != pila) num1 = *--top; // el -- se aplica a top, y no a *top else //hubo un error en la expresión seguir = NO; } else //hubo un error en la expresión seguir = NO; if (seguir){ // si no hubo error en la expresión switch (argv[i][0]){ // apilamos el resultado case '+': *top++ = num1 + num2; break; case '-': *top++ = num1 - num2; break; case 'x': *top++ = num1 * num2; break; case '/': *top++ = num1 / num2; break; default: seguir = NO; } } } i++; } if(seguir) printf("Resultado= %f\n", pila[0]); else printf("Error en los datos\n"); return (EXIT_SUCCESS); } int esOperando(char **argv, int i){ // un operando es un número real positivo o negativo if (isdigit(argv[i][0]) || (argv[i][0]=='-' && isdigit(argv[i][1]))) return 1; return 0; }