昨天在园子里看到有园友,写了相同标题的一篇文章。重点讲的是中缀表达式转换为后缀表达式的算法,但是实现的四则运算 有bug。其实我没看之前也不懂什么是 中缀和后缀表达式,之前有用过js eval 内置函数,后边一想貌似C#中是没有这样的一个函数,加上自己也没事,就试着自己写了下 这个所谓的四则运算。
    我没有研究计算机是怎么来进行四则运算的,我只是按自己的想法来实现 对 6-2*(5-3)+6/2*(6-3+3)/2 这样一个随意组合的四则运算表达式。
    我的思路是样的:
   <1> 先递归把表达式中的括号中的表达式给算出来,然后将值将之替换

         #region 计算括号中的表达式
/// <summary>
/// 获取括号中的计算表达式
/// (递归)
/// </summary>
/// <param name="express"></param>
public void GetBraceExpress(ref string express)
{
int leftBraceMaxIndex = -;
IList<int> rightBraceMinIndexs = new List<int>();
for (int i = ; i < express.Length; i++)
{
if (express[i].ToString() == "(")
{
leftBraceMaxIndex = i;
}
if (express[i].ToString() == ")")
{
rightBraceMinIndexs.Add(i);
}
}
if (leftBraceMaxIndex != - && rightBraceMinIndexs.Count > )
{
int rightBraceIndex = ;
foreach (var item in rightBraceMinIndexs)
{
if (item > leftBraceMaxIndex)
{
rightBraceIndex = item;
break;
}
} string braceExpress = express.Substring(leftBraceMaxIndex, rightBraceIndex - leftBraceMaxIndex + );
double result = CalcExpress(braceExpress.TrimStart('(').TrimEnd(')')); //计算()中的表达式
express = express.Replace(braceExpress, result.ToString()); //结果替换 ()表达式
if (express.IndexOf("(") != - && express.IndexOf(")") != -)
{
GetBraceExpress(ref express);
return;
}
}
}
#endregion #region 计算表达式
/// <summary>
/// 计算表达式
/// </summary>
/// <param name="express">表达式</param>
/// <returns>表达式结果</returns>
public double CalcExpress(string express)
{
List<double> numbers = new List<double>(); //表达式中的数字
List<char> operaters = new List<char>(); //表达式中的操作符
int tempIndex = ;
for (int i = ; i < express.Length; i++)
{
if (!char.IsNumber(express[i]) && char.IsNumber(express[i - ]) && i > )
{
if (tempIndex != )
tempIndex = tempIndex + ;
numbers.Add(double.Parse(express.Substring(tempIndex, i - tempIndex)));
operaters.Add(express[i]);
tempIndex = i;
}
}
numbers.Add(double.Parse(express.Substring(tempIndex + , express.Length - tempIndex - )));
//开始计算
double result = ;
if (operaters.Count == )
{
return double.Parse(express);
}
else
{
CalcMultiplyDivide(numbers, operaters); //计算乘除
result = CalcAddSubduction(numbers, operaters); //计算加减
}
return result;
}
#endregion

 <2> 递归将 没有括号的表达式中的乘除计算,将结果替换 乘除表达式

         #region 计算乘除
/// <summary>
/// 递归计算表达式中的乘/除运算
/// </summary>
/// <param name="numbers">表达式中的数字集合</param>
/// <param name="operaters">操作符集合</param>
public void CalcMultiplyDivide(List<double> numbers, List<char> operaters)
{
for (int i = ; i < operaters.Count; i++)
{
bool temp = false;
double n = ;
if (operaters[i] == '*')
{
n = numbers[i] * numbers[i + ];
temp = true;
}
else if (operaters[i] == '/')
{
n = numbers[i] / numbers[i + ];
temp = true;
}
if (temp)
{
operaters.RemoveAt(i);
numbers.RemoveRange(i, );
numbers.Insert(i, n);
CalcMultiplyDivide(numbers, operaters);
break;
}
}
}
#endregion

   <3> 递归算加减,直到表达式中没有操作符,然后返回结果。

         #region 计算加减
/// <summary>
/// 递归计算加减
/// </summary>
/// <param name="numbers">表达式中的数字集合</param>
/// <param name="operaters">操作符集合</param>
/// <returns>计算的结果</returns>
public double CalcAddSubduction(List<double> numbers, List<char> operaters)
{ for (int i = ; i < operaters.Count; i++)
{
bool temp = false;
double n = ;
if (operaters[i] == '+')
{
n = numbers[i] + numbers[i + ];
temp = true;
}
else if (operaters[i] == '-')
{
n = numbers[i] - numbers[i + ];
temp = true;
}
if (temp)
{
operaters.RemoveAt(i);
numbers.RemoveRange(i, );
numbers.Insert(i, n);
CalcAddSubduction(numbers, operaters);
break;
}
}
double result = ;
if (operaters.Count == )
result = numbers[];
return result;
}
#endregion

这就可以实现像js eval 方法一样对一个四则运算表达式 计算了。这只是按我自己的思路来实现的,没有考虑性能啊什么的,如大家有什么好的法子,一起讨论下。
附上demo:http://files.cnblogs.com/joey0210/Calc.rar

C#实现eval 进行四则运算的更多相关文章

  1. C#实现eval 进行四则运算(有码)

    在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版本的eval函数,具体的设计参考了<大 ...

  2. C#实现eval

    C#实现eval 进行四则运算(有码)   在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版 ...

  3. 软件工程(FZU2015)增补作业

    说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/01/03 前11次正式作业和练习的迭代评分见:http://www.cnbl ...

  4. 软件工程(FZU2015) 增补作业

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/ ...

  5. C#版的eval,C#Light开源嵌入式脚本,unity热更新不再愁

    目前最新版本AlphaV0.06 完全的c#语法,可用于一切能运行C#的场合,wp windows xamarin mono asp.net unity3d 内嵌了int uint bool stri ...

  6. [置顶] js综合应用:表格的四则运算

    在做调查问卷的过程中,遇到一个表格的统计问题,算是需要些js方面的综合知识,所以记录下来. 在上次完成了基本的求和的基础上,添加了基本的加减乘除四则运算. 基本需求简化后如下: 对应的htm了为: & ...

  7. 结对编程1---基于Flask的四则运算题目生成器

    项目代码地址 / WEB应用地址 / 合作伙伴iFurySt博文链接 需求分析 本次程序是基于原有的控制台四则运算器的基础上,改成WEB的形式,同时还增加了一些新的功能.同时因为交互方式的改变,代码也 ...

  8. Python实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

  9. 小学生噩梦——四则运算题库(python 全功能实现)

    Github: https://github.com/holidaysss 小组:龙天尧(代码实现),林毓植(浮点转分数函数,代码审查) PSP2.1 Personal Software Proces ...

随机推荐

  1. WEB 安全之 SQL注入<一> 盲注

    SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...

  2. C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

    既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞 ...

  3. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

  4. VBA的一些使用心得

    VBA的知识比较零散,因此开一贴记录一下使用VBA时的一些方法和心得.主要针对Excel,参考在这里 1. Collection Class 大部分情况下,Collection Class是比数组(A ...

  5. 动态执行SQL语句

    在实际制作过程中,需要动态的拼接SQL语句然后执行.具体代码如下: declare @columnName varchar(20),@tempName varchar(20) select @temp ...

  6. [Android] 【视频】黑马安卓62、66期等教程+源码

     下载地址:http://fu83.cn/thread-58-1-1.html

  7. myeclipse 2014新建maven web 项目步骤

    首先在myeclipse中配置maven的安装路径: 在pom.xml中加上: 1 2 3 4 5 6 7 8 9 10  <plugins>           <plugin&g ...

  8. [CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点

    2.3 Implement an algorithm to delete a node in the middle of a singly linked list, given only access ...

  9. [CareerCup] 8.3 Musical Jukebox 点唱机

    8.3 Design a musical jukebox using object-oriented principles. CareerCup这书实在是太不负责任了,就写了个半调子的程序,说是完整版 ...

  10. ROM存储1/4周期正弦信号构造DDS

    上周的时候,老师让编写一个简单的dds程序,本文说明了整个过程中我遇到问题以及一些个人的思考.初次接触FPGA,如有问题请多多指教~ 1.几个疑问,解决和没有解决的. 为何采用ROM而不是直接采用DD ...