应老师要求写的一个计算器程序(c#) - Windows Live

应老师要求写的一个计算器程序(c#)

??????????? //表达式不能以符号结尾
??????????? if(IsIn(cA[cA.Length-1],op))
??????????????? return false;
??????????? //两个符号不能相邻
??????????? for (int i = 0; i < cA.Length - 1; i++)
??????????? {
??????????????? if (IsIn(cA[i], op) & IsIn(cA[i + 1], op))
??????????????????? return false;
??????????? }???????????????
??????????????????????
??????????? return true;
??????? }
???????
??????? //括号规则检验
??????? static bool IsKhOk(string sIn)
??????? {
??????????? Stack kuoH = new Stack();
??????????? kuoH.Push('#');//#为栈底
??????????? char[] charS = sIn.ToCharArray();
??????????? if (charS[0]=='(')//(开头的情况
??????????????? kuoH.Push(charS[0]);
??????????? for (int i = 1; i < charS.Length-1; i++)
??????????? {
??????????????? string opkz = "+-*/(";
??????????????? string opky = "+-*/)";
??????????????? switch (charS[i])
??????????????? {
??????????????????? case '(':
??????????????????????? if (!IsIn(charS[i - 1], opkz) || IsIn(charS[i + 1], opky))
??????????????????????????? return false;
??????????????????????? else
??????????????????????? {
??????????????????????????? kuoH.Push(charS[i]);
??????????????????????? }
??????????????????????? break;
??????????????????? case ')':
??????????????????????? if (IsIn(charS[i - 1], opkz) || !IsIn(charS[i + 1], opky))
??????????????????????????? return false;
??????????????????????? else
??????????????????????????? if (Convert.ToChar ( kuoH.Pop()) != '(')
??????????????????????????????? return false;
??????????????????????? break;
??????????????? }
??????????? }
??????????? if (charS[charS.Length - 1] == ')')//)结束的情况
??????????? {
??????????????? if (Convert.ToChar(kuoH.Pop()) != '(')
??????????????????? return false;
??????????? }
??????? //运算符优先判断
??????? static char OpR(char op1, char op2)
??????? {
??????????? if (op1 == '-')
??????????????? op1 = '+';
??????????? else if (op1 == '/')
??????????????? op1 = '*';
??????????? switch (op1)
??????????? {
??????????????? case '+':
??????????????????? if (IsIn(op2, "*/("))
??????????????????????? return '<';
??????????????????? else
??????????????????????? return '>';
??????????????? case '*':
??????????????????? if (op2=='(')
??????????????????????? return '<';
??????????????????? else
??????????????????????? return '>';
??????????????? case '(':
??????????????????? if (op2 == ')')
??????????????????????? return '=';
??????????????????? else
??????????????????????? return '<';
??????????????? case? ')':
??????????????????? return '>';
??????????????? case '#':
??????????????????? if (op2 == '#')
??????????????????????? return '=';
??????????????????? else
??????????????????????? return '<';
??????????? }
??????????? return '0';
??????? //字符串分解成表达式
??????? static List<string > ToB(string textSt)
??????? {
??????????? List<string> stList=new List<string> ();
??????????? for (int i = 0; i != textSt.Length-1;i++ )
??????????? {
??????????????? if (IsIn(textSt[i], opk))
??????????????????? stList.Add(Convert.ToString(textSt[i]));
??????????????? else
??????????????? {
??????????????????? string tempS = Convert.ToString(textSt[i]);
??????????????????? while ( !IsIn(textSt[++i], opk) && i!=textSt .Length-1)
??????????????????? {???????????????????????
??????????????????????? tempS += textSt[i];
??????????????????????
??????????????????? }
??????????????????? stList.Add(tempS);
??????????????????? if (i != 0)
??????????????????????? i--;
??????????????? }
??????????? }
??????????? if (IsIn(textSt[textSt.Length - 2], opk) || textSt[textSt.Length - 1] == ')')
??????????????? stList.Add(Convert.ToString(textSt[textSt.Length - 1]));
??????????? else
??????????????? stList[stList.Count - 1] += Convert.ToString(textSt[textSt.Length - 1]);
??????????? //检测是否有输入不允许的字符
??????????? foreach (char c in cArray)
??????????? {
??????????????? if (!IsIn(c, all))
??????????????? {
??????????????????? MessageBox.Show("你输入了错误的字符:" + c + "\n请重新输入", "输入错误");
??????????????????? textBoxIn.Focus();
??????????????????? return;
??????????????? }
??????????? }
??????????? if(!IsOk(textBoxIn.Text)||!IsKhOk(textBoxIn.Text))
??????????? {
??????????????? MessageBox.Show("你输入的表达式不符合数学规则。\n请重新输入", "输入错误");
??????????????? textBoxIn.Focus();
??????????????? return;
??????????? }
??????????? List<string> ls = ToB(textBoxIn.Text);
??????????? string[] stArr = new string[ls.Count];
??????????? ls.CopyTo(stArr);
??????????? Stack<char > optr = new Stack<char >();
??????????? Stack<double > opnd = new Stack<double >();
??????????? optr.Push('#');
??????????? opnd.Push(0.001);
??????????? string xiang = stArr[0];
??????????? //foreach (string sss in stArr)
??????????? //{
??????????? //??? textBoxOut.Text += sss;
??????????? //}
??????????????? }
??????????????? else
??????????????? {
??????????????????? switch (OpR(optr.Peek(), Convert.ToChar(xiang)))
??????????????????? {
??????????????????????? case '<':
??????????????????????????? optr.Push(Convert.ToChar(xiang));
??????????????????????????? xiang = stArr[++j];
??????????????????????????? //textBoxOut.Text += "<";
??????????????????????????? break;
??????????????????????? case '=':
??????????????????????????? optr.Pop();
??????????????????????????? xiang = stArr[++j];
??????????????????????????? //textBoxOut.Text += "=";
??????????????????????????? break;
??????????????????????? case '>':
??????????????????????????? char theta = optr.Pop();
??????????????????????????? double b = opnd.Pop();
??????????????????????????? double a = opnd.Pop();
??????????????????????????? //textBoxOut.Text = Convert.ToString(theta);
??????????????????????????? if (theta == '/' && b == 0)
??????????????????????????? {
??????????????????????????????? MessageBox.Show("除数为0","错误!");
??????????????????????????????? textBoxIn.Focus();
??????????????????????????????? return ;
??????????????????????????? }
??????????????????????????? opnd.Push(operate(a, theta, b));
??????????????????????????? break;
??????????????????? }
??????????????? }
???????????????
??????????? }
??????????? textBoxOut.Text +=Convert .ToString (opnd.Peek ());
???????????????????
郑重声明:资讯 【应老师要求写的一个计算器程序(c#) - Windows Live】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——