C#模仿微软做的计算器如何实现这几个功能

最后面那一直有一个小点就是.这个点第二就是一直按等号数字会一直在变第3个就是如何实现1+2再按加再按等于出来6谢谢帮帮实现下代码吧~~... 最后面那一直有一个小点就是 . 这个点 第二就是一直按等号 数字会一直在变 第3个就是如何实现 1+2 再按加再按等于 出来6 谢谢 帮帮实现下代码吧~~ 展开
 我来答
匿名用户
2013-09-24
展开全部
好久之前写的一个 4则运算算法,很多地方都可以简化,希望对你有用#region 四则运算
MatchCollection number;
Regex regex = new Regex(@"[\+\-\*\/\%\(\)]{1}|\d+");
Regex regexNum = new Regex(@"\d+"); Regex regexF = new Regex(@"[\(\)]{1}");
Regex regexS = new Regex(@"[\*\/\%]{1}");
Regex regexT = new Regex(@"[\+\-]{1}"); Stack nStack = new Stack();
Stack oStack = new Stack(); public int Math(string strExpressions)
{
number = regex.Matches("(" +strExpressions + ")");
return MathTwoStack(number);
}
private bool CheckPriority(string a, string b)
{
Regex regex1 = new Regex(@"[\+\-]");
Regex regex2 = new Regex(@"[\*\/\%]"); if (a == "(")
{
return false;
}
if (b == "(")
{
return false;
}
if (a == ")")
{
return true;
}

a = regex2.Replace(a, "2");
b = regex2.Replace(b, "2");
a = regex1.Replace(a, "1");
b = regex1.Replace(b, "1");
int ia = Convert.ToInt32(a);
int ib = Convert.ToInt32(b);
if (ia < ib)
{
return true;
}
else
{
return false;
}
} protected int MathTwoStack(MatchCollection n)
{ for (int i = 0; i < n.Count; i++)
{
if(regexNum.IsMatch(n[i].Value))
{
nStack.Push(n[i].Value);
}
else
{
if (oStack.Count == 0)
{
oStack.Push(n[i].Value);
}
else
{
digui(n[i].Value);
}
}
}
return Convert.ToInt32(nStack.Peek());
} private void digui(string willinStr)
{
decimal numTop;
decimal numSecond;
if (oStack.Count > 0)
{
string inStr = oStack.Peek().ToString();
if (willinStr == ")" && inStr == "(")
{
oStack.Pop(); }
else
{
if (CheckPriority(willinStr, inStr))
{ oStack.Pop();
if (oStack.Count > 0 && oStack.Peek().ToString() == "-" )
{
if (inStr == "+")
{
inStr = "-";
}
else if (inStr == "-")
{
inStr = "+";
}
}
if (oStack.Count > 0 && oStack.Peek().ToString() == "/")
{
if (inStr == "/")
{
inStr = "*";
}
else if (inStr == "*")
{
inStr = "/";
}
}
numTop = Convert.ToDecimal(nStack.Pop());
numSecond = Convert.ToDecimal(nStack.Pop());
nStack.Push(SetOperat(numSecond, numTop, inStr));

digui(willinStr); }
else
{
oStack.Push(willinStr);
}
}
}
else
{
if (willinStr != ")")
{
oStack.Push(willinStr);
}
}
} #region 四则运算 private decimal SetOperat(decimal a, decimal b, string op)
{
switch (op)
{
case "+":
return Add(a, b);
case "-":
return Minus(a, b);
case "*":
return Multiplication(a, b);
case "/":
return Division(a, b);
case "%":
return Remainder(a, b);
default:
return 0;
}
} private decimal Add(decimal a, decimal b)
{
return a + b;
} private decimal Minus(decimal a, decimal b)
{
return a - b;
} private decimal Multiplication(decimal a, decimal b)
{
return a * b;
} private decimal Division(decimal a, decimal b)
{
return a / b;
}
private decimal Remainder(decimal a, decimal b)
{
return Convert.ToDecimal(Convert.ToInt32(a) % Convert.ToInt32(b));
} #endregion #endregion
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
网易云信
2023-12-06 广告
UIkit是一套轻量级、模块化且易于使用的开源UI组件库,由YOOtheme团队开发。它提供了丰富的界面元素,包括按钮、表单、表格、对话框、滑块、下拉菜单、选项卡等等,适用于各种类型的网站和应用程序。UIkit还支持响应式设计,可以根据不同... 点击进入详情页
本回答由网易云信提供
匿名用户
2013-09-24
展开全部
后面有小点……自己添加就可以了啊,比如截取TextChange事件进行判断在合适的地方加点。 一直按等号数字会变:计算器的实现一般都要用到队列和堆栈,按等号结果会变这个属于堆栈的应用。操作数1压栈-》操作符压栈-》操作数2压栈-》出栈计算结果用堆栈保护用户输入的操作符和操作数,每次按等号就重新进行一次计算。 至于第三个问题,仔细看了一下微软的Calc,其实原理同问题二,你按1+2,再按加号的的时候它已经把1+2=3算出来了,然后你又按了加号(也就是没有清除结果,也没有输入新的操作数),因此它把数字3放到操作数1的位置上,然后是你按的加号。你按等号的时候只有一个操作数(也就是刚才的结果“3”),所以它自动认为你的第二个数也是3,于是3+3=6。 总的来说你要实现的就是堆栈代码吧,其实不是很难,如果不需要科学计算器“MS”“MR”这样的暂存功能的话,不用堆栈也完全OK,自己试试吧,印象会深点。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-24
展开全部
最后那个小点‘.’直接在赋值给textbox的时候再数据的最后加上就是了例如:textbox1.Text = number + ".";其中number就是你计算出的结果。第二个按等号其实就是数字自己加自己;微软的经计算中每按一次运算符号都对前面的进行了一次计算的例如我已经输入了1+2,如果我再按减号“-”就先算1+2的结果然后显示出来。其实微软计算器的计算就是栈的操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式