如何在C#windowsForm文本框中实现简单的数学运算:200+200-500*100。。。

Sunnuy 2002-11-01 01:53:44
如何在C#windowsForm文本框中实现简单的数学运算:200+200-500*100。。。
...全文
230 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenbinghui 2002-11-03
  • 打赏
  • 举报
回复
如果是加减乘除的话,还是很简单的,
使用stack,
如果是数字则压栈,如果是操作符则进行:
如果这个操作符的优先级较高则也压栈,
否则把栈里面的内容弹出来计算,
程序如下:
(由于我的编译器有问题,所以没进行编译,不知道是否有错,还有,很可能.NEt里面就有表达式计算的类,还希望高手多多指点)
double singleCal(double num2,string operat,double num1)
{
switch(operat)
{
case "+":
return num1+num2;
break;
case "-":
return num1-num2;
break;
case "*":
return num1*num2;
break;
case "/":
return num1/num2;
break;
}
}
double calExp(string strExp)
{
//匹配操作符的正则表达式
Regex reOperator=new Regex("^[+-\*\/]");
//匹配数字的正则表达式
Regex reNumber=new Regex("^\d+");
Match mOperotor,mNumber;
//表示现在的运算级别,如果是加减则是0,否则是1
int grade=0;
//表示上一次的是数字还是操作符还是数字
bool lastIsNumber=true;
Stack stack=new Stack();
lastIsNumber=false;
grade=0;
//处理正负号
if(strExp[0]=='+'||strExp[0]='-')
{
strExp=strExp.SubString(1);
stack.Push(0.0);
stack.Push(strExp.SubString(0,1);
}
double num1,num2;
string operat;
while(strExp.Length!=0)
{
mOperator=reOperator.Match(strExp);
mNumber=reNumber.Match(strExp);
if(mOperator.Value!=string.Empty)
{
//操作符
if(lastIsNumber)
{
throw new Exception("错误的表达式:连续的操作符");
}
lastIsNumber=false;
if(mOperator.Value=="*"||mOperator.Value=="/")
{
if(grade==0)
{
stack.Push(mOperator.Value);
}
else
{
if(stack.Count>=3)
{
stack.Push(singleCal((double)stack.Pop(),(string)stack.Pop(),(double)stack.Pop());
}
}
stack.Push(mOperator.Value);
grade=1;
strExp=strExp.SubString(mOperator.Value.Length);
}
else
{
grade=0;
while(stack.Count>=3)
{
stack.Push(singleCal((double)stack.Pop(),(string)stack.Pop(),(double)stack.Pop());
}
stack.Push(mOperator.Value);
strExp=strExp.SubString(mNumber.Value.Length);
}
}
else
{
if(mNumber.Value==String.Empty)
{
throw new Exception("不能识别的字符");
}
stack.Push(double.Parse(mNumber.Value));
}
}
if(!lastIsNumber)
{
throw new Exception("未结束的表达式");
}
while(stack.Count>=3)
{
stack.Push(singleCal((double)stack.Pop(),(string)stack.Pop(),(double)stack.Pop());
}
Debug.Assert(stack.Count==1,"Error");
return (double)stack.Pop();
}
ilovecs 2002-11-03
  • 打赏
  • 举报
回复
栈,二叉树,有向无环图等都可以实现。
Mullen 2002-11-03
  • 打赏
  • 举报
回复
这道题的关键不是winfrom,而是算法,如何分析输入的东西。
yangjiehua 2002-11-02
  • 打赏
  • 举报
回复
这样的程序比较难做
首先你要将文本框接收过来的字符串类型进行一一分析,那些是数字,哪些是操作符,然后建立一个整形数组,用来接收刚才分析出来的数,不过你还得做一个结构用来专门描述你的这个式子,同时你还得写许多代码用来进行比如说先算乘除后算加减的问题。
总之这个问题看似简单,其实比较难。
上面分析是数字还是操作符,并把它们填入相应的结构或数组,这有点像编译原理。
而用什么结构来描述你这个算术式子有点像数据结构。
而怎样实现先乘除后加减很像算法分析。
努力吧!!!
sunny6281 2002-11-02
  • 打赏
  • 举报
回复
string s = textbox.text;
int i=0;//第一个符号的序号
int j = 0;//第二个符号的序号
int res = 0;//结果

i = s.indexofany("+-*/".tochararray());
j = s.indexofany("+-*/".tochararray(i,s.length));

while(i!=-1)
{
switch(s[i])
{
case "+":
{
res = convert.toint32(s.substring(0,i))//第一个操作数
+convert.toint32(s.substring(i+1,j==-1?
s.length-i:
i=s.indexofany("+-*/".tochararray(j+1,s.length)))))//第二个操作数
}
........

}
}
}
TheAres 2002-11-02
  • 打赏
  • 举报
回复
参考这个,复杂的也可以啊.

Runtime C# Expression Evaluator
By Shawn Wildermuth

http://www.codeproject.com/csharp/runtime_eval.asp


yarshray 2002-11-01
  • 打赏
  • 举报
回复
以上两种方法都可以
yarshray 2002-11-01
  • 打赏
  • 举报
回复
System.Convert.ToInt64(textbox.text)
int.Parse(textbox.text)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧