只能按照顺序挨个取吧使用Split 试试看
解决方案 »
- C#用了皮肤后,Panel和GroupBox 容器背景透明都不好使??在线等
- 如何将数据库image格式文件导出一个Doc文件
- button点第二次才弹出模式窗口
- 正则表达式,判断一个字符串长度大于等8,必须是字母数字组合,其中字母个数要超过4个.
- 在不同的程序集文件中进行序列化和反序列化
- 那有C# Windows程序设计电子版下载?
- 请教 EventArgs e 这个e 的详细用法 最好能举例
- 菜鸟问题:老是出现要求int对象的提示。
- 还是ComboBox的问题,请高手指教!
- 有关.net framework(正式版)安装问题?
- 请问C#中随机函数是什么?如何用啊?
- 我这个时候继续学习转行到软件是不是迟了?
用的时候用loadexp(string)读入你的表达式;
然后用string getresult()返回的到结果;mfc下通过编译可以运行,有表达式纠错功能。
运算符号有+ - * / ^ sin() cos() tan() ln() () 任意的组合或嵌套class supermath{
public:
int deadline;
CString errormsg;
CString expstr;
CString thesign;
float runstr(CString,int);
int isdigits(CString);
void xtrim(CString*);
void prerun(CString*);
CString getresult();
void loadexp(CString);
};void supermath::loadexp(CString str){
expstr=str;
}int supermath::isdigits(CString str)
{
int i,is=1;
char *t=str.GetBuffer(str.GetLength());
for (i=0;i<(int)strlen(t);i++)
if (!((*(t+i)>='0' && *(t+i)<='9') || *(t+i)=='.' || (*(t+i)=='-' && i==0))) is=0;
return is;
}void supermath::xtrim(CString *str)
{
char *t=str->GetBuffer(str->GetLength());
int level=0,isdotrim=1;
for(int i=0;i<(int)strlen(t)-1;i++)
{
if (*(t+i)=='(') level++;
if (*(t+i)==')') level--;
if (level==0) isdotrim=0;
}
if ((isdotrim)&&strlen(t)>1)
{
*str=str->Mid(1,str->GetLength()-2);
xtrim(str);
}
}void supermath::prerun(CString *str){
int level=0,i;
for(i=0;i<str->GetLength();i++){
if (str->Mid(i,1)=='(') level++;
if (str->Mid(i,1)==')') level--;
}
if (level!=0) errormsg="括号请成对!";
str->Replace("tg","tan");
}float supermath::runstr(CString str,int maxtime)
{
float midvar;
int i,j,level;
if (errormsg!="") return 2;
if (maxtime>deadline) {
errormsg="expression fleat!!";
return 2;
}
xtrim(&str);
if (isdigits(str)) return (float)atof(str.GetBuffer(str.GetLength()));
else {
char *exp=str.GetBuffer(str.GetLength());
char *sign=thesign.GetBuffer(str.GetLength());
for(i=0;i<10;i++){
level=0;
for(j=0;j<str.GetLength()-1;j++)
{
if (*(exp+j)=='(') level++;
if (*(exp+j)==')') level--;
if (str.Mid(j,1)==thesign.Mid(i,1) && level==0) {
CString str1=str.Mid(0,j);
CString str2=str.Mid(j+1);
switch (*(sign+i))
{
case '+':
return runstr(str1,maxtime+1)+runstr(str2,maxtime+1);break;
case '-':
if (str1=="") midvar=0; else midvar=runstr(str1,maxtime+1);
return midvar-runstr(str2,maxtime+1);break;
case '*':
return runstr(str1,maxtime+1)*runstr(str2,maxtime+1);break;
case '/':
midvar=runstr(str2,maxtime+1);
if (midvar==0) {errormsg+=" '/0'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return runstr(str1,maxtime+1)/midvar; break;
case '^':
midvar=(float)pow(runstr(str1,maxtime+1),runstr(str2,maxtime+1));
if ((midvar+1)==midvar) { errormsg+=" '-x^0.5'形错误 位置:‘"; errormsg+=str; errormsg+="’<-err.. "; return 2; }
return midvar; break;
case 'i':
return (float)sin(runstr(str2.Mid(1),maxtime+1));break;
case 'c':
return (float)cos(runstr(str2.Mid(2),maxtime+1));break;
case 't':
midvar=(float)tan(runstr(str2.Mid(2),maxtime+1));
if ((midvar+1)==midvar) {errormsg+=" 'tan(pi/2)'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return midvar; break;
case 'b':
return (float)fabs(runstr(str2.Mid(1),maxtime+1));break;
case 'l':
midvar=runstr(str2.Mid(1),maxtime+1);
if (midvar<=0) {errormsg+=" 'ln-'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return (float)log(midvar); break;
default:
errormsg+=" 内部未知错误!";
}
}
}
}
}
errormsg+="含有未知运算符 位置:‘"+str+"’<-err.. ";
return 2;
}
CString supermath::getresult()
{
deadline=10;
errormsg="";
thesign="+-/*^ictbl";
errormsg="";
CString str; prerun(&expstr);
str.Format("%f",runstr(expstr,1));
if (errormsg=="") return str; else return errormsg;
}