四则运算的实现
2013-01-08 22:58
344 查看
c++版
#include <iostream> #include <string> #include <cmath> #include <deque> using namespace std; #define LENGTH 61440 //60KB bool isNo(char c) //is Number { return c >= '0' && c <= '9' || c == '.'; } bool isSyb(const char* c)//is Symbol { return (*c == '+' || *c == '-' || *c == '*' || *c == '/') && strlen(c) == 1; //ver1.2 } bool isSyb(char c)//is Symbol { return c == '+' || c == '-' || c == '*' || c == '/'; } bool isIlg(char c) //is illegal { return !isNo(c) && !isSyb(c) && !(c == '(' || c == ')' || c == ' '); } const char* GetSubtext(const char* S,size_t bgn,size_t end) //follow "left-inclusive interval" { char* subtext = new char[end - bgn + 1]; subtext[end - bgn] = '\0'; for (size_t i = bgn; i != end; i++) subtext[i - bgn] = S[i]; return subtext; } const char* calc(const char* S,size_t len) { deque<string> words; bool inNo = false; //door for isNo //bool inSyb = false; //door for isSyb size_t NoPos = 0; //size_t SybPos = 0; size_t ParPos = 0, ParDep = 0; for (size_t i = 0; i <= len; i++) //build standard formula { if(isIlg(S[i]) && i != len) //formula illegal checking { return "The formula is illegal!"; //exit(1); } if (isNo(S[i]) && !inNo) //Number postion begin { inNo = true; NoPos = i; } if (!isNo(S[i]) && inNo) //Number postion end { inNo = false; words.push_back(GetSubtext(S,NoPos,i)); } if (isSyb(S[i])/* && !inSyb*/) { /* inSyb = true; SybPos = i; */ words.push_back(GetSubtext(S,i,i + 1)); } /* if (!isSyb(S[i]) && inSyb) { inSyb = false; words.push_back(GetSubtext(S,SybPos,i)); }*/ if (S[i] == '(') { //inPar = true; ParDep++; ParPos = i + 1; //left-inclusive interval size_t j; for (j= i + 1; ParDep && j <= len; j++) { if (S[j] == '(') ParDep++; if (S[j] == ')') ParDep--; } if (j <= len) { string recResult(calc(GetSubtext(S,ParPos,j - 1),strlen(GetSubtext(S,ParPos,j - 1)))); if (recResult == "The formula is illegal!") return "The formula is illegal!"; else if (recResult == "Parentheses is not match!") return "Parentheses is not match!"; else words.push_back(recResult); } else { //parentheses is not match return "Parentheses is not match!"; } i = j; //jump over subtext } if (S[i] == ')') return "Parentheses is not match!"; } //end for long double tempResult = 0; static char CtmpResult[50]; //check formula if (words.size() == 0) return "0."; // 0 element if (words.size() == 1 ) //1 element if( !isSyb(words.front().c_str())) { strcpy_s(CtmpResult,words.front().c_str()); return CtmpResult; } else return "The formula is illegal!"; if (words.front() == "*" || words.front() == "/") //front is symble return "The formula is illegal!"; if (words.front() == "+" || words.front() == "-") { if (!isSyb((words.begin() + 1) -> c_str())) { words.front() += *(words.begin() + 1); words.erase(words.begin() + 1); //erase second one } else return "The formula is illegal!"; } if (isSyb(words.back().c_str())) return "The formula is illegal!"; for (deque<string>::iterator i = words.begin() + 1; i < words.end(); i++) { if ((*i == "*" || *i == "/") && (isSyb((i-1) -> c_str())) && strlen((i-1) -> c_str())) return "The formula is illegal!"; if ((*i == "+" || *i == "-") && (isSyb((i-1) -> c_str())) && strlen((i-1) -> c_str())) if(!isSyb(*((i+1) -> c_str()))) { *(i + 1) = *i + *(i + 1); i = words.erase(i); } else return "The formula is illegal!"; } //start calculate for (deque<string>::iterator i = words.begin(); i != words.end(); i++) { //calculate * and / if (*i == "*") { tempResult = atof((i-1) -> c_str()) * atof((i+1) -> c_str()); _gcvt_s(CtmpResult,tempResult,47);//double to string i = words.erase(i - 1); i = words.erase(i); *i = CtmpResult; } if (*i == "/") { tempResult = atof((i-1) -> c_str()) / atof((i+1) -> c_str()); _gcvt_s(CtmpResult,tempResult,47); //double to string i = words.erase(i - 1); i = words.erase(i); *i = CtmpResult; } } for (deque<string>::iterator i = words.begin(); i != words.end(); i++) { //calculate + and - if (*i == "+") { tempResult = atof((i-1) -> c_str()) + atof((i+1) -> c_str()); _gcvt_s(CtmpResult,tempResult,47); //double to string i = words.erase(i - 1); i = words.erase(i); *i = CtmpResult; } if (*i == "-") { tempResult = atof((i-1) -> c_str()) - atof((i+1) -> c_str()); _gcvt_s(CtmpResult,tempResult,47);//double to string i = words.erase(i - 1); i = words.erase(i); *i = CtmpResult; } } strcpy_s( CtmpResult, words.front().c_str()); return CtmpResult; } void main(int argc,char* argv[]) { if (argc > 1) { cout<<argv[1]<<ends<<'='<<ends<<calc(argv[1],strlen(argv[1]))<<endl; } else { cout<<"请输入公式,如需退出请按CTRL + C。\nVER1.3 design by zuozhiwen.\n"; char S[LENGTH]; while(1) { cin.getline(S,LENGTH); cout<<calc(S,strlen(S))<<endl; } } }
C版
#include <stdio.h> #include <assert.h> int cal(int c1,char op,int c2) { if(op=='+') return c1+c2; if(op=='-') return c1-c2; if(op=='*') return c1*c2; if(op=='/') return c1/c2; } int calculate(int len,char *expstr) { assert(expstr); if(len<3) return -1; //出错的情况 char *p=expstr; int c1=p[0]-'0'; char op=p[1]; int c2=p[2]-'0'; p+=3; //只有两个操作数和一个符号的情况 while(*p) { if(*p=='*'||*p=='/') { c2=cal(c2,*p,p[1]-'0'); } else { c1=cal(c1,op,c2); op=*p; c2=p[1]-'0'; } p+=2; } //多于3个的情况 return cal(c1,op,c2); } int main() { int res=calculate(11,"1+2*3/5-6*7"); printf("value:%d",res); }
相关文章推荐
- java小练习(实现分数的四则运算)
- linux shell 实现 四则运算(整数及浮点) 简单方法
- 用栈实现四则运算计算器 implement a calculator using stack
- 程序实现自动生成30道四则运算题目(2)
- java 四则运算 栈的实现
- 3.结对编程成果报告(小学生四则运算的出题程序,Java实现)
- 实现复数的加减乘除四则运算的C#类(已测成功)
- 利用位运算实现四则运算 -- 华为面试题
- 栈实现简单的四则运算表达式
- 带括号的四则混合运算的算符优先算法java实现
- 位运算实现四则运算
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
- 【实践】js实现简易的四则运算计算器
- C语言实现四则混合运算
- 基于51单片机设计简单计算器,实现6位有效四则运算的程序设计(汇编调用C)
- 用PHP实现的四则运算表达式计算实现代码
- JavaScript实现简单的四则运算
- 将书中那个栈实现的逆波兰四则运算实现了,发现书上是例子是错的
- 栈如何运用在四则运算中(JAVA实现)
- 01:用java实现四则运算题目生成程序