应老师要求写的一个计算器程序(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 ()); ??????????????????? |