From aef23227c76f430fac29eddc8dc887f66f009acb Mon Sep 17 00:00:00 2001 From: ChestnutHeng Date: Wed, 25 Nov 2015 22:43:06 +0800 Subject: [PATCH] update Exp calc --- Makefile | 12 ++++----- README.md | 4 +-- evaluate.cpp | 71 +++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 4f131fb..b38deb1 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,18 @@ make: exec main.o: main.cpp main.h - g++ -c -o main.o main.cpp + g++ -c -o main.o main.cpp -g linar.o: linar.cpp - g++ -c -o linar.o linar.cpp + g++ -c -o linar.o linar.cpp -g fours.o: fours.cpp - g++ -c -o fours.o fours.cpp + g++ -c -o fours.o fours.cpp -g numsys.o: numsys.cpp - g++ -c -o numsys.o numsys.cpp + g++ -c -o numsys.o numsys.cpp -g evaluate.o: evaluate.cpp - g++ -c -o evaluate.o evaluate.cpp + g++ -c -o evaluate.o evaluate.cpp -g MathCalc.exe: main.o linar.o fours.o numsys.o evaluate.o - g++ -o MathCalc.exe main.o linar.o fours.o numsys.o evaluate.o + g++ -o MathCalc.exe main.o linar.o fours.o numsys.o evaluate.o -g exec: MathCalc.exe ./MathCalc.exe diff --git a/README.md b/README.md index 721014a..338714d 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,6 @@ > * Ver 3.0 添加了表达式计算功能 * ver 3.1 在进制转换系统中添加了小数和负数的进制转换 - - - +* ver 3.2 在表达式计算中支持了小数和负数 diff --git a/evaluate.cpp b/evaluate.cpp index ff4bb8f..084ca1c 100644 --- a/evaluate.cpp +++ b/evaluate.cpp @@ -4,6 +4,11 @@ #include "Stack.h" #define N_OPTR 9 +#define VERIFY(_STACK_) {\ + if (_STACK_.empty()) {\ + return false;\ + }\ +} using namespace std; @@ -21,13 +26,18 @@ const char pri[N_OPTR][N_OPTR] = { }; // +,-,*,/,^,!,(,),\0 bool isdigit(char s){ - if((s <='9' && s >= '0') ||s == '.') + if((s <='9' && s >= '0')) return true; else return false; } -int power(int a,int b){ - int sum = 1; +float power(int a,int b){ + float sum = 1; + if(b < 0){ + while((b++) < 0) + sum /= a; + return sum; + } while((b--) > 0) sum *= a; return sum; @@ -40,6 +50,14 @@ char * readNumber(char *s,Stack &num){ new_num = new_num * 10; new_num += (*s - 48); } + if(*s == '.') { + int i = -1; + while(isdigit(*(++s))){ + cout << "ff"; + new_num += (*s - 48) * power(10,i); + i--; + } + } num.push(new_num); return s; } @@ -136,33 +154,46 @@ char orderBetween(char s1,char s2){ return pri[raw][col]; } -float evaluate(char *S){ +bool evaluate(char *S, float *result){ Stack opnd; Stack optr; + char *origin = S; optr.push('\0'); while(!optr.empty()){ if(isdigit(*S)){ S = readNumber(S,opnd); }else{ + if (*S == '-') { + if (S == origin) { + opnd.push(0); + } else if (S[-1] == '(') { + opnd.push(0); + } + } switch(orderBetween(optr.top(),*S)){ case '>': - { - char op = optr.pop(); - if('!' == op){ - float pOpnd = opnd.pop(); - opnd.push(calcu(op,pOpnd)); - }else{ - float pOpnd2 = opnd.pop(); - float pOpnd1 = opnd.pop(); - opnd.push(calcu(pOpnd1,op,pOpnd2)); + { + VERIFY(optr); + char op = optr.pop(); + if('!' == op){ + float pOpnd = opnd.pop(); + VERIFY(opnd); + opnd.push(calcu(op,pOpnd)); + }else{ + VERIFY(opnd); + float pOpnd2 = opnd.pop(); + VERIFY(opnd); + float pOpnd1 = opnd.pop(); + opnd.push(calcu(pOpnd1,op,pOpnd2)); + } + break; } - } - break; case '<': optr.push(*S); S++; break; case '=': + VERIFY(optr); optr.pop(); S++; break; @@ -170,7 +201,8 @@ float evaluate(char *S){ } } - return opnd.pop(); + *result = opnd.pop(); + return true; } void expression_calc(){ @@ -180,6 +212,11 @@ void expression_calc(){ cout << ">>>Input your expression:"; scanf("%s",exp); if (exp[0] == 'q') return; - cout << "Answer: " << evaluate(exp) << endl; + float output; + if (evaluate(exp, &output)) { + cout << "Answer: " << output << endl; + } else { + cout << "Syntax error." << endl; + } } }