.Net下的算术表达式解析器的实现思路与源码
来源:互联网 发布:淘宝周南中学地址 编辑:程序博客网 时间:2024/04/30 06:42
作为程序设计人员经常会遇到这样的情况,需要将某个指定的字符串表达式转换为算术表达式并计算其结果.使用Delphi的朋友可以在网上获取第三方控件来实现,而.Net框架类库并没有相关的处理类,正好在前不久的给一所大学开发的Web应用中也需要实现相关的处理.就抽空写了一个相关的处理类(实现了大部分的算术运算操作,需要其他运算可以在现有基础上扩展),现将部分代码贴出共大家参考,希望能够在交流中进步、互助中学习、探讨中深入:
//EnumExpress
using System;
namespace ExpressionTest
{
/// <summary>
/// EnumExpress 的摘要说明。
/// </summary>
public enum EnumExpress
{
Add,//加号
Dec,//减号
Mul,//乘号
Div,//除号
Sin,//正玄
Cos,//余玄
Tan,//正切
ATan,//余切
Sqrt,//平方根
Pow,//求幂
None,//无
}
}
//ExpressDeal
using System;
namespace ExpressionTest
{
/// <summary>
/// ExpressDeal 的摘要说明。
/// </summary>
public class ExpressDeal
{
static ExpressDeal()
{
}
private double CalculateExpress(string strExpression)
{
string strTemp="";
string strTempB="";
string strOne="";
string strTwo="";
double ReplaceValue=0;
while (strExpression.IndexOf("+")!=-1 || strExpression.IndexOf("-")!=-1
|| strExpression.IndexOf("*")!=-1 || strExpression.IndexOf("/")!=-1)
{
if (strExpression.IndexOf("*")!=-1)
{
strTemp=strExpression.Substring(strExpression.IndexOf("*")+1,strExpression.Length-strExpression.IndexOf("*")-1);
strTempB=strExpression.Substring(0,strExpression.IndexOf("*"));
strOne=strTempB.Substring(GetPrivorPos(strTempB)+1,strTempB.Length-GetPrivorPos(strTempB)-1);
strTwo=strTemp.Substring(0,GetNextPos(strTemp));
ReplaceValue=Convert.ToDouble(GetExpType(strOne))*Convert.ToDouble(GetExpType(strTwo));
strExpression=strExpression.Replace(strOne+"*"+strTwo,ReplaceValue.ToString());
}
else if (strExpression.IndexOf("/")!=-1)
{
strTemp=strExpression.Substring(strExpression.IndexOf("/")+1,strExpression.Length-strExpression.IndexOf("/")-1);
strTempB=strExpression.Substring(0,strExpression.IndexOf("/"));
strOne=strTempB.Substring(GetPrivorPos(strTempB)+1,strTempB.Length-GetPrivorPos(strTempB)-1);
strTwo=strTemp.Substring(0,GetNextPos(strTemp));
ReplaceValue=Convert.ToDouble(GetExpType(strOne))/Convert.ToDouble(GetExpType(strTwo));
strExpression=strExpression.Replace(strOne+"/"+strTwo,ReplaceValue.ToString());
}
else if (strExpression.IndexOf("+")!=-1)
{
strTemp=strExpression.Substring(strExpression.IndexOf("+")+1,strExpression.Length-strExpression.IndexOf("+")-1);
strTempB=strExpression.Substring(0,strExpression.IndexOf("+"));
strOne=strTempB.Substring(GetPrivorPos(strTempB)+1,strTempB.Length-GetPrivorPos(strTempB)-1);
strTwo=strTemp.Substring(0,GetNextPos(strTemp));
ReplaceValue=Convert.ToDouble(GetExpType(strOne))+Convert.ToDouble(GetExpType(strTwo));
strExpression=strExpression.Replace(strOne+"+"+strTwo,ReplaceValue.ToString());
}
else if (strExpression.IndexOf("-")!=-1)
{
strTemp=strExpression.Substring(strExpression.IndexOf("-")+1,strExpression.Length-strExpression.IndexOf("-")-1);
strTempB=strExpression.Substring(0,strExpression.IndexOf("-"));
strOne=strTempB.Substring(GetPrivorPos(strTempB)+1,strTempB.Length-GetPrivorPos(strTempB)-1);
strTwo=strTemp.Substring(0,GetNextPos(strTemp));
ReplaceValue=Convert.ToDouble(GetExpType(strOne))-Convert.ToDouble(GetExpType(strTwo));
strExpression=strExpression.Replace(strOne+"-"+strTwo,ReplaceValue.ToString());
}
}
return Convert.ToDouble(strExpression);
}
private double CalculateExExpress(string strExpression,EnumExpress ExpressType)
{
double retValue=0;
switch(ExpressType)
{
case EnumExpress.Sin:
retValue=Math.Sin(Convert.ToDouble(strExpression));
break;
case EnumExpress.Cos:
retValue= Math.Cos(Convert.ToDouble(strExpression));
break;
case EnumExpress.Tan:
retValue= Math.Tan(Convert.ToDouble(strExpression));
break;
case EnumExpress.ATan:
retValue= Math.Atan(Convert.ToDouble(strExpression));
break;
case EnumExpress.Sqrt:
retValue= Math.Sqrt(Convert.ToDouble(strExpression));
break;
case EnumExpress.Pow:
retValue= Math.Pow(Convert.ToDouble(strExpression),2);
break;
}
if (retValue==0) return Convert.ToDouble(strExpression);
return retValue;
}
private int GetNextPos(string strExpression)
{
int[] ExpPos=new int[4];
ExpPos[0]=strExpression.IndexOf("+");
ExpPos[1]=strExpression.IndexOf("-");
ExpPos[2]=strExpression.IndexOf("*");
ExpPos[3]=strExpression.IndexOf("/");
int tmpMin=strExpression.Length;
for (int count=1;count<=ExpPos.Length;count++)
{
if (tmpMin>ExpPos[count-1] && ExpPos[count-1]!=-1)
{
tmpMin=ExpPos[count-1];
}
}
return tmpMin;
}
private int GetPrivorPos(string strExpression)
{
int[] ExpPos=new int[4];
ExpPos[0]=strExpression.LastIndexOf("+");
ExpPos[1]=strExpression.LastIndexOf("-");
ExpPos[2]=strExpression.LastIndexOf("*");
ExpPos[3]=strExpression.LastIndexOf("/");
int tmpMax=-1;
for (int count=1;count<=ExpPos.Length;count++)
{
if (tmpMax<ExpPos[count-1] && ExpPos[count-1]!=-1)
{
tmpMax=ExpPos[count-1];
}
}
return tmpMax;
}
public string SpiltExpression(string strExpression)
{
string strTemp="";
string strExp="";
while (strExpression.IndexOf("(")!=-1)
{
strTemp=strExpression.Substring(strExpression.LastIndexOf("(")+1,strExpression.Length-strExpression.LastIndexOf("(")-1);
strExp=strTemp.Substring(0,strTemp.IndexOf(")"));
strExpression=strExpression.Replace("("+strExp+")",CalculateExpress(strExp).ToString());
}
if(strExpression.IndexOf("+")!=-1 || strExpression.IndexOf("-")!=-1
|| strExpression.IndexOf("*")!=-1 || strExpression.IndexOf("/")!=-1)
{
strExpression=CalculateExpress(strExpression).ToString();
}
return strExpression;
}
private string GetExpType(string strExpression)
{
strExpression=strExpression.ToUpper();
if (strExpression.IndexOf("SIN")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N")+1,strExpression.Length-1-strExpression.IndexOf("N")),EnumExpress.Sin).ToString();
}
if (strExpression.IndexOf("COS")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("S")+1,strExpression.Length-1-strExpression.IndexOf("S")),EnumExpress.Cos).ToString();
}
if (strExpression.IndexOf("TAN")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N")+1,strExpression.Length-1-strExpression.IndexOf("N")),EnumExpress.Tan).ToString();
}
if (strExpression.IndexOf("ATAN")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N")+1,strExpression.Length-1-strExpression.IndexOf("N")),EnumExpress.ATan).ToString();
}
if (strExpression.IndexOf("SQRT")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("T")+1,strExpression.Length-1-strExpression.IndexOf("T")),EnumExpress.Sqrt).ToString();
}
if (strExpression.IndexOf("POW")!=-1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("W")+1,strExpression.Length-1-strExpression.IndexOf("W")),EnumExpress.Pow).ToString();
}
return strExpression;
}
}
}
- .Net下的算术表达式解析器的实现思路与源码
- .Net下的算术表达式解析器的实现思路与源码
- 04 Java API:arraylist实现算术表达式的解析
- 算术表达式的Java实现
- 算术表达式的合法性判断与求值(下)
- 栈的应用:解析算术表达式
- 栈的应用-解析算术表达式
- 编译原理动手实操,用java实现编译器-算术表达式及其语法解析器的实现
- C++实现算术表达式的括号匹配
- 通过栈实现算术表达式的计算
- 利用栈实现算术表达式的求值
- C语言的变量与算术表达式
- 解析带小括号的算术表达式--------用栈来实现的java算法
- 后缀表达式与解析算术表达式
- 算术表达式的计算
- 算术表达式的计算
- 算术表达式的转换
- 算术表达式的转换
- COM组件的多线程测试-Apartment模型
- COM组件的多线程测试-Apartment模型(附录)
- 我的小木马---server端---第一次编译
- 快速配置Apache2.X + Tomcat 4.X + Linux/Windows
- WSAD5.1 数据源篇: 如何访问Informx723(ONLINE) 数据源篇
- .Net下的算术表达式解析器的实现思路与源码
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 对于HOOK函数的一点认识 iBreathe(收藏)
- DataGrid传统分页方式
- 让Real Player从你的电脑走开
- 矩阵类模板
- 《明明白白看MFC之程序框架(一)》
- 《明明白白看MFC之程序框架(二)》
- 《明明白白看MFC之程序框架(三)》