哇,它太长了.建议做成后置表达式并且提用栈, 以前我做过一个.功能挺强的:有逻辑,算术,比较及串操作
解决方案 »
- 基于MFC对话框的打印问题:A4纸的逻辑坐标设置多大?
- 利用hook进行dll注入后sendmessage的问题
- 如何更改List Control中某一个单元格的文本颜色或背景?
- CListCtrl怎么样才能够.在一个Item如何才能得到鼠标的WM_LBUTTONUP事件
- [求助]win32 console application文本动态输出的问题
- 请问怎样在程序中杀死创建的线程?
- 搞不定了,请指点:用InstallShield for Microsoft Visual C++ 6对程序打包,
- 线程函数参数传递问题,请帮忙。
- 怎样得到菜单的宽度??
- 怎样用VC编写在VB里调用的DLL
- 如何用srand()和rand()产生若干0-1之间的随机数呢?
- 视图切换是编译成功运行老是不成功,什么原因阿?
yong
#include <math.h>
#include <algorithm>
#include <iostream.h>
#include <ctype.h>using namespace std;
struct symbol
{
int m_n;
char m_c;
symbol(char c):m_c(c),m_n(0){}
bool operator() (char s)
{
switch(s)
{
case '(' : ++m_n;break;
case ')' : --m_n;break;
default : break;
}
if(m_n<0) throw 0;
return m_n==0 && s==m_c;
}
};const char* match_fun(const char*f,const char*l,const char*name)
{
int n = mismatch(f,l,name).first - f;
if( strlen(name) != n )
return 0;
return f[n]=='(' ? f+n+1 : 0;
}double interpret(const char *first,const char *last)
{
const char *mid = 0;
if(first==last)
return 0; //下面是计算 + - * / ^ 运算符
if( last != (mid=find_if( first,last,symbol('+') )) )
return interpret(first,mid)+interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('-') )) )
return interpret(first,mid)-interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('*') )) )
return interpret(first,mid)*interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('/') )) )
return interpret(first,mid)/interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('^') )) )
return pow(interpret(first,mid),interpret(mid+1,last)); //是数字
if( isdigit(*first) )
{
if( count_if(first,last,isdigit) != last-first )
throw 0; //
return atof(first);
} if( *(--last) != ')' )
throw 0; //下面计算函数
if( 0 != (mid=match_fun(first,last,"sin")) )
return sin( interpret(mid,last) );
if( 0 != (mid=match_fun(first,last,"cos")) )
return cos( interpret(mid,last) );
if( 0 != (mid=match_fun(first,last,"sqrt")) )
return sqrt( interpret(mid,last) ); //……添加你所需要处理的函数,非常遗憾的是不能处理2员函数如pow等 if( *first != '(' )
throw 0; return interpret(first+1,last);
}double interpret(const char* str)
{
try{
return interpret( str,str+strlen(str) );
}
catch(...){
return 0;
}
}void main()
{
char *str = "((3+2)*5-6*(1+1))/(8-3)";
cout<<interpret(str)<<endl;
}