代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
CSharp
】
计算器类
作者:
Dezai.CN
/ 发布于
2012/5/10
/
605
<div>/****************************************************************** * 创 建 人: SamWang * 创建时间: 2011-11-29 * 描 述: * 计算器类:能直接对表达式进行计算,支持变量 * 原 理: 将表达式按字符压入堆栈中,然后按照各操作符的级别进行处理 * 版 本: V1.0 * 环 境: VS2005 ******************************************************************/ using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Collections; namespace LingDang.CRM.UI.Client { public class Calculator { private string _expression; private Stack s; private string[] values; /// <summary> /// 构造函数 /// </summary> /// <param name="expression">表达式</param> /// <param name="varValues">变量值数组</param> public Calculator(string expression, string[] varValues) { this._expression = expression.ToLower(); s = new Stack(); values = varValues; } /// <summary> /// 构造函数 /// </summary> /// <param name="expression">表达式</param> public Calculator(string expression) { this._expression = expression; s = new Stack(); } /// <summary> /// 总运行 /// </summary> /// <returns></returns> public double Run() { string expression = PostFix(); string[] aryString = expression.Split('|'); foreach (string str in aryString) { if (IsNumber(str) || IsVarible(str[0])) { double d; if (IsVarible(str[0])) { d = Convert.ToDouble(GetValue(str[0])); } else { d = Convert.ToDouble(str.ToString()); } AddOperands(d); } else { DoOperator(str); } } return (double)s.Pop(); } private bool IsNumber(string str) { if (str.Length > 1) { return true; } else { return Char.IsDigit(str[0]); } } /// <summary> /// 判断是否为变量,变量范围为a-z /// </summary> /// <param name="c"></param> /// <returns></returns> private bool IsVarible(char c) { if (c >= 'a' && c <= 'z') { return true; } else { return false; } } private void AddOperands(double val) { s.Push(val); } /// <summary> /// 得到公式左右运算数 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> private bool GetTwoOperands(out double left, out double right) { try { right = (double)s.Pop(); left = (double)s.Pop(); } catch (InvalidOperationException) { right = 0; left = 0; return false; } return true; } /// <summary> /// 计算操作 /// </summary> /// <param name="op">运算符</param> private void DoOperator(string op) { double left, right; bool result = GetTwoOperands(out left, out right); if (result) { switch (op) { case "+": s.Push(left + right); break; case "-": s.Push(left - right); break; case "*": s.Push(left * right); break; case "/": if (right == 0.0) { s.Clear(); //Divide by 0! throw new Exception("除数不能为零"); } else s.Push(left / right); break; case "^": s.Push(Math.Pow(left, right)); break; } } else { s.Clear(); } } /// <summary> /// 解析为后缀表达式 /// </summary> /// <returns></returns> public string PostFix() { string str = this._expression + "#"; char tempc; char[] chars = str.ToCharArray(); Stack ts = new Stack(); ts.Push('#'); string str1 = ""; string tmpStr = ""; bool isNum = false; foreach (char c in chars) { if (Char.IsDigit(c) || IsVarible(c) || c == '.') { tmpStr += c.ToString(); isNum = true; } else { if (isNum) { str1 += tmpStr + "|"; tmpStr = ""; } isNum = false; if (c == ')') { for (tempc = Convert.ToChar(ts.Pop()); tempc != '('; tempc = Convert.ToChar(ts.Pop())) str1 += tempc.ToString() + "|"; } else { for (tempc = Convert.ToChar(ts.Pop()); Isp(tempc) > Icp(c); tempc = Convert.ToChar(ts.Pop())) str1 += tempc.ToString() + "|"; ts.Push(tempc); ts.Push(c); } } } return str1.Substring(0, str1.Length - 1); } /// <summary> /// 根据变量名得到对应的值 /// </summary> /// <param name="c">变量名:A-Z</param> /// <returns></returns> private string GetValue(char c) { string result = "0"; //变量对应的数组位置 int index = Convert.ToInt32(c) - Convert.ToInt32('a'); if (index < values.Length) { result = values[index].ToString(); } return result; } private int Isp(char c) { int k; switch (c) { case '#': k = 0; break; case '(': k = 1; break; case '^': k = 7; break; case '*': case '/': case '%': k = 5; break; case '+': case '-': k = 3; break; case ')': k = 8; break; default: //Unknown operator! throw new Exception("无效操作符:"+c.ToString()); } return k; } private int Icp(char c) { int k; switch (c) { case '#': k = 0; break; case '(': k = 8; break; case '^': k = 6; break; case '*': case '/': case '%': k = 4; break; case '+': case '-': k = 2; break; case ')': k = 1; break; default: //Unknown operator! throw new Exception("无效操作符:" + c.ToString()); } return k; } } }
试试其它关键字
计算器类
同语言下
.
文件IO 操作类库
.
Check图片类型[JPEG(.jpg 、.jpeg),TIF,GIF,BMP,PNG,P
.
机器名和IP取得(IPV4 IPV6)
.
Tiff转换Bitmap
.
linqHelper
.
MadieHelper.cs
.
RegHelper.cs
.
如果关闭一个窗体后激活另一个窗体的事件或方法
.
创建日志通用类
.
串口辅助开发类
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
Dezai.CN
贡献的其它代码
(
4037
)
.
多线程Socket服务器模块
.
生成随机密码
.
清除浮动样式
.
弹出窗口居中
.
抓取url的函数
.
使用base HTTP验证
.
div模拟iframe嵌入效果
.
通过header转向的方法
.
Session操作类
.
执行sqlite输入插入操作后获得自动编号的ID
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3