commit 465ee17549ceecdf934cdf865ba4a28ebf3366de Author: Jon-William Lewis Date: Mon Mar 28 00:36:40 2016 -0500 Initial Commit diff --git a/ee.c b/ee.c new file mode 100644 index 0000000..b84f9fa --- /dev/null +++ b/ee.c @@ -0,0 +1,27 @@ + +#include "ee.h" + +int +main (int argc, const char* argv[]){ + STACK ee_stack = NULL; + int iter = 1; + while (iter < argc){ + if (isNum(argv[iter])){ + ee_stack = push(strtod(argv[iter],NULL), ee_stack); + }else if (isOperator(argv[iter][0])){ + ee_stack = push(evaluate(&ee_stack, argv[iter][0]), ee_stack); + } else{ + ERR_INVALID_INPUT = 1; + } + iter++; + } + if (ee_stack == NULL){ + ERR_NS_OPERANDS = 1; + } else if (ee_stack->tail!=NULL){ + ERR_NS_OPERATORS = 1; + } + if (!reportErrors()){ + printf("%f\n", peek(ee_stack)); + } + return 0; +} diff --git a/ee.h b/ee.h new file mode 100644 index 0000000..cbb6d5c --- /dev/null +++ b/ee.h @@ -0,0 +1,164 @@ +#include +#include +#include +#include +#include "ee_stack.h" + +int ERR_NS_OPERANDS = 0; +int ERR_NS_OPERATORS = 0; +int ERR_INVALID_INPUT = 0; +int ERR_INVALID_FACTORIAL = 0; + +// Summary +int isNum(const char*); +int isOperator(const char); + +double evaluate(STACK*, int); +double* getOperands(STACK*, int); +double fact(int n); + +int reportErrors(); + +int // Dependency of main() +isNum(const char* query){ + /* + * If query is a string, isNum(query) iff query represents a number. + */ + int foundDecimal = 0; int foundSign = 0; int noDigits = 1; + int ch=0; int issues = 0; int i = 0; + while (!issues && ( ( ch = query[i] ) != '\0') ){ + ch = query[i]; + if (isdigit(ch)){ + noDigits = 0; + }else { + if (ch == '-' || ch == '+'){ + if (foundSign){ issues = 1; } + else {foundSign = 1;} + } + else if (ch == '.'){ + if (foundDecimal) { issues = 1; } + else { foundDecimal = 1; } + } + else { issues = 1; } + } + i++; + } + if (noDigits) { issues = 1; } + return !issues; +} + +int // Dependency of main() +isOperator(const char query){ + /* + * If query is a string, isOperator iff query is a + * supported operator. + */ + + switch (query){ + case '+': + return 1; break; + case '-': + return 1; break; + case 'x': + return 1; break; + case '/': + return 1; break; + case '^': + return 1; break; + case '!': + return 1; break; + default: + return 0; break; + } +} + +double // Dependency of main() +evaluate(STACK* target_stack, int operator){ + /* + * if target_stack is a pointer to a STACK and operator is + * an integer corresponding to the ascii value of a supported + * operator, evaluate(target_stack,operator) is the result of + * applying the given operator to the appropriate number of + * operands from target_stack. + */ + double value = 0; + double a,b; a=b=0; + double* operands; + switch (operator){ + case '+' : + operands = getOperands(target_stack, 2); + value = operands[1] + operands[0]; + break; + case '-' : + operands = getOperands(target_stack, 2); + value = operands[1] - operands[0]; + break; + case 'x' : + operands = getOperands(target_stack, 2); + value = operands[1] * operands[0]; + break; + case '/' : + operands = getOperands(target_stack, 2); + value = operands[1] / operands[0]; + break; + case '^' : + operands = getOperands(target_stack, 2); + value = pow(operands[1],operands[0]); + break; + case '!' : + operands = getOperands(target_stack, 1); + if ((operands[0] != floor(operands[0]))) + { ERR_INVALID_FACTORIAL = 1; } + value = fact((int)operands[0]); + break; + default : + break; + } + return value; +} +double* // Dependency of evaluate() +getOperands(STACK* target_stack, int size){ + /* + * if target_stack is a pointer to a STACK, and size is an integer + * corresponding to the number of operands desired, + * getOperands(target_stack,size) returns an array of operands and + * pops them off *target_stack. + */ + double* operands = (double*)malloc(size*sizeof(double)); + int i = 0; + for (i=0; i