c#多功能计算器怎么制作 保护加减乘除,三角函数,log,开平方,平方,退格,记忆加减清除,多重括号,主要制作思路是什么 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可用OOP思路界面,功能,方法做出来不难 微软已经把“计算器”开源,c++代码,有兴趣自己看ps:基本上为命令模式,命令字+命令参数底层:后缀表达式,有限状态机。因为是单步执行,所以这个就够了。如果是批次执行,需要知识 “词法分析”+“表达式树”+“访问者模式”+“命令模式”基本演示 1+2栈:操作数栈 1,2操作符栈 +操作符出栈:+-------------+操作,操作需要2操作数(左操作数+右操作数)-----操作数出2个操作数------------命令模式发给add操作方法 若只是作业,不是职业开发的话,可以参考:log,三角函数,开方等都已经封装到了Math这个类里面,调用即可退格不就是删除么记忆,应该就是保存运算值有括号就难了点,参考楼上几位 public class Calculator { public Calculator() { _OptStack = new Stack<char>(); _SuffixStack = new Stack<float>(); } private Stack<char> _OptStack; private Stack<float> _SuffixStack; public float Calculate(string expression) { string lastNum = string.Empty; for (int i = 0; i < expression.Length; i++) { if (char.IsNumber(expression[i]) || expression[i].Equals('.')) { lastNum += expression[i]; } else { if (lastNum != string.Empty) { Merger(float.Parse(lastNum)); lastNum = string.Empty; } AddOpt(expression[i]); } } if (lastNum != string.Empty) { Merger(float.Parse(lastNum)); } while (_OptStack.Count > 0) { Merger(_OptStack.Pop()); } return _SuffixStack.Pop(); } private void AddOpt(char opt) { if (_OptStack.Count == 0) { _OptStack.Push(opt); return; } if (opt.Equals(')')) { while (!_OptStack.Peek().Equals('(')) { Merger(_OptStack.Pop()); } _OptStack.Pop(); return; } char tempOpt = _OptStack.Peek(); if ((opt.Equals('-') || opt.Equals('+')) && (tempOpt.Equals('*') || tempOpt.Equals('/'))) { while (_OptStack.Count > 0) { Merger(_OptStack.Pop()); } } _OptStack.Push(opt); } private void Merger(float exp) { _SuffixStack.Push(exp); } private void Merger(char exp) { float num1 = _SuffixStack.Pop(); float num2 = _SuffixStack.Pop(); float result = 0; switch (exp) { case '+': result = num2 + num1; break; case '-': result = num2 - num1; break; case '*': result = num2 * num1; break; case '/': result = num2 / num1; break; case。可以加上log、sin。。什么的 break; } _SuffixStack.Push(result); } }调用,做个输入界面,取最后的string就行了string calc = "89+(126/2)*3-6/3+(96+3-8/2)";// 随便写四则运算Calculator calculator = new Calculator(); MessageBox.Show(calculator.Calculate(calc).ToString()); // 结果 isnumber函数是在哪个空间里,还是说自己建立的 关于PDA数据采集 DataGridView控件中怎么实现日期单元格列出现日期选择 ping 问题 谁有jpg图标的ico传给我一个,谢谢啊 DataGirdView列判断。。 如何在C#中读取二进制文件? 调试出问题是怎么回事? 判断数据库指定字段是否存在重复内容应该怎么写sql语句? socket 问题解决可最佳到200分 求大神帮忙 求求 关于数据库运行速度的小问题--急 Winform 用ClickOnce发布的几个小问题 在线考试系统
界面,功能,方法
做出来不难
操作数栈 1,2
操作符栈 +操作符出栈:+-------------+操作,操作需要2操作数(左操作数+右操作数)-----操作数出2个操作数------------命令模式发给add操作方法
log,三角函数,开方等都已经封装到了Math这个类里面,调用即可
退格不就是删除么
记忆,应该就是保存运算值有括号就难了点,参考楼上几位
public class Calculator
{
public Calculator()
{
_OptStack = new Stack<char>();
_SuffixStack = new Stack<float>();
}
private Stack<char> _OptStack;
private Stack<float> _SuffixStack;
public float Calculate(string expression)
{
string lastNum = string.Empty;
for (int i = 0; i < expression.Length; i++)
{
if (char.IsNumber(expression[i]) || expression[i].Equals('.'))
{
lastNum += expression[i];
}
else
{
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
lastNum = string.Empty;
}
AddOpt(expression[i]);
}
}
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
}
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
return _SuffixStack.Pop();
}
private void AddOpt(char opt)
{
if (_OptStack.Count == 0)
{
_OptStack.Push(opt);
return;
}
if (opt.Equals(')'))
{
while (!_OptStack.Peek().Equals('('))
{
Merger(_OptStack.Pop());
}
_OptStack.Pop();
return;
}
char tempOpt = _OptStack.Peek();
if ((opt.Equals('-') || opt.Equals('+')) &&
(tempOpt.Equals('*') || tempOpt.Equals('/')))
{
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
}
_OptStack.Push(opt);
}
private void Merger(float exp)
{
_SuffixStack.Push(exp);
}
private void Merger(char exp)
{
float num1 = _SuffixStack.Pop();
float num2 = _SuffixStack.Pop();
float result = 0;
switch (exp)
{
case '+':
result = num2 + num1;
break;
case '-':
result = num2 - num1;
break;
case '*':
result = num2 * num1;
break;
case '/':
result = num2 / num1;
break;
case。可以加上log、sin。。什么的
break;
}
_SuffixStack.Push(result);
}
}
调用,做个输入界面,取最后的string就行了string calc = "89+(126/2)*3-6/3+(96+3-8/2)";// 随便写四则运算
Calculator calculator = new Calculator();
MessageBox.Show(calculator.Calculate(calc).ToString()); // 结果