C#带小括号的运算

计算类的封装

jisuan.cs

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace ZY四则运算
  7 {
  8     public class jisuan
  9     {
 10         public Dictionary<char, int> priorities = null;  //优先级
 11 
 12         public void Calculator()    //添加了四种运算符以及四种运算符的优先级
 13         {
 14             priorities = new Dictionary<char, int>();
 15             priorities.Add('#', -1);
 16             priorities.Add('+', 0);
 17             priorities.Add('-', 0);
 18             priorities.Add('*', 1);
 19             priorities.Add('/', 1);
 20         }
 21 
 22         const string operators = "+-*/";      //运算符
 23 
 24         public double Compute(double leftNum, double rightNum, char op)  //这是一种方法,用来计算左右两个数的静态方法!
 25         {
 26             switch (op)
 27             {
 28                 case '+': return leftNum + rightNum;
 29                 case '-': return leftNum - rightNum;
 30                 case '*': return leftNum * rightNum;
 31                 case '/': return leftNum / rightNum;
 32                 default: return 0;
 33             }
 34         }
 35 
 36         public bool IsOperator(char op)  //每次判断这个字符是否是运算符?
 37         {
 38             return operators.IndexOf(op) >= 0;
 39         }
 40 
 41         public bool IsAssoc(char op)    //返回一个关联符号
 42         {
 43             return op == '+' || op == '-' || op == '*' || op == '/';
 44         }
 45 
 46         public  Queue<object> QueueSort(string expression)   // 队列排序   
 47         {
 48             Queue<object> result = new Queue<object>();
 49             Stack<char> operatorStack = new Stack<char>();   //运算符栈
 50             operatorStack.Push('#');
 51             char top, cur, tempChar;                    //top栈顶,current最近的;
 52             string tempNum;
 53             for (int i = 0, j; i < expression.Length; )     //取出表达式
 54             {
 55                 cur = expression[i++];                 //取出表达式的每个字符赋给cur
 56                 top = operatorStack.Peek();        //栈顶元素赋给top此时为"#"
 57 
 58                 if (cur == '(')         //将左括号压栈,此时栈顶元素为"("
 59                 {
 60                     operatorStack.Push(cur);
 61                 }
 62                 else
 63                 {
 64                     if (IsOperator(cur))       //如果是运算符的话
 65                     {
 66                         while (IsOperator(top) && ((IsAssoc(cur) && priorities[cur] <= priorities[top])) || (!IsAssoc(cur) && priorities[cur] < priorities[top]))
 67                         {
 68                             result.Enqueue(operatorStack.Pop());     //如果元素为运算符并且优先级小于栈顶元素优先级,出栈
 69                             top = operatorStack.Peek();      //继续把栈顶元素赋给top
 70                         }
 71                         operatorStack.Push(cur);      //把数字压栈
 72                     }
 73                     else if (cur == ')')       //将右括号添加到结尾
 74                     {
 75                         while (operatorStack.Count > 0 && (tempChar = operatorStack.Pop()) != '(')
 76                         {
 77                             result.Enqueue(tempChar);
 78                         }
 79                     }
 80                     else
 81                     {
 82                         tempNum = "" + cur;
 83                         j = i;
 84                         while (j < expression.Length && (expression[j] == '.' || (expression[j] >= '0' && expression[j] <= '9')))
 85                         {
 86                             tempNum += expression[j++];
 87                         }
 88                         i = j;
 89                         result.Enqueue(tempNum);
 90                     }
 91                 }
 92             }
 93             while (operatorStack.Count > 0)
 94             {
 95                 cur = operatorStack.Pop();
 96                 if (cur == '#') continue;
 97                 if (operatorStack.Count > 0)
 98                 {
 99                     top = operatorStack.Peek();
100                 }
101 
102                 result.Enqueue(cur);
103             }
104 
105             return result;
106         }
107 
108         public  double Calucate(string expression)
109         {
110             try
111             {
112                 var rpn = QueueSort(expression); 
113                 Stack<double> operandStack = new Stack<double>();
114                 double left, right;
115                 object cur;
116                 while (rpn.Count > 0)
117                 {
118                     cur = rpn.Dequeue();        //出列
119                     if (cur is char)            //如果cur为字符的话
120                     {
121                         right = operandStack.Pop();   //右边的数字出栈
122                         left = operandStack.Pop();    //左边的数字出栈
123                         operandStack.Push(Compute(left, right, (char)cur));    //此时调用compute方法
124                     }
125                     else
126                     {
127                         operandStack.Push(double.Parse(cur.ToString()));      //是数字就压栈
128                     }
129                 }
130                 return operandStack.Pop();
131             }
132             catch
133             {
134                 throw new Exception("表达式不正确!");
135             }
136         }
137     }
138 }

Form1.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.IO;
10 
11 namespace ZY四则运算
12 {
13     public partial class Form1 : Form
14     {
15         Form2 frm2 = new Form2();
16         public Form1()
17         {
18             InitializeComponent();
19         }
20         private void button1_Click_1(object sender, EventArgs e)
21         {
22             string Express = textBox1.Text;
23             frm2.listBox1.Items.Add(Express);
24             listBox1.Items.Add(" " + Express + "=");
25             textBox1.Clear();
26         }
27         private void button2_Click(object sender, EventArgs e)
28         {
29             frm2.ShowDialog();
30         }
31     }
32 }

Form2.cs

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.IO;
 10 
 11 namespace ZY四则运算
 12 {
 13     public partial class Form2 : Form
 14     {
 15         public Form2()
 16         {
 17             InitializeComponent();
 18         }
 19         int time = 40; //倒计时
 20         int Count = 0;
 21         int right = 0;
 22         private void Form2_Load(object sender, EventArgs e)
 23         {
 24             lblTime.Text = "剩余时间:";
 25             timer1.Enabled = false;
 26             timer1.Interval = 1000;
 27         }      
 28         private void timer1_Tick(object sender, EventArgs e)
 29         {
 30             int tm = time--;
 31             lblTime.Text = "剩余时间:" + tm.ToString() + "";
 32             if (tm == 0)
 33             {
 34                 timer1.Enabled = false;
 35                 MessageBox.Show("时间已到", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
 36             }
 37         }
 38         private void button1_Click_1(object sender, EventArgs e)
 39         {
 40             timer1.Stop();
 41             MessageBox.Show(label1.Text);
 42         }
 43         private void button2_Click_1(object sender, EventArgs e)
 44         {
 45             timer1.Start();
 46         }
 47         private void button3_Click_1(object sender, EventArgs e)
 48         {
 49             sfd.Filter = "(*.txt)|*.txt";
 50             if (sfd.ShowDialog() == DialogResult.OK)
 51             {
 52                 string sPath = sfd.FileName;
 53                 FileStream fs = new FileStream(sPath, FileMode.Create);
 54                 StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
 55                 int iCount = listBox2.Items.Count - 1;
 56                 for (int i = 0; i <= iCount; i++)
 57                 {
 58                     sw.WriteLine(listBox2.Items[i].ToString());
 59                 }
 60                 sw.Flush();
 61                 sw.Close();
 62                 fs.Close();
 63             }
 64         }
 65         private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
 66         {
 67             if (listBox1.Items.Count > 0)
 68             {
 69                 textBox1.Text = listBox1.Items[0].ToString();
 70             }
 71             else
 72             {
 73                 MessageBox.Show("答题结束");
 74             }
 75         }
 76         private void textBox2_KeyDown(object sender, KeyEventArgs e)
 77         {
 78             jisuan js = new jisuan();
 79             if (e.KeyCode == Keys.Enter)
 80             {
 81                 string result = textBox1.Text;
 82                 if (textBox2.Text.Trim() == string.Empty)            //去除空格之后,如果没答题给出提示。
 83                 {
 84                     MessageBox.Show("您尚未答题", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
 85                     return;
 86                 }
 87                 Count++;
 88                 if (textBox2.Text ==js.Calucate(result).ToString())   //直接调用Calucate这个方法计算result的值并与输入的值进行比较
 89                 {
 90                     MessageBox.Show("回答正确!");
 91                     listBox2.Items.Add(result + "=" + textBox2.Text + "  " + "");//若答对直接后面打个对勾。
 92                     listBox1.Items.Remove(listBox1.SelectedItem);
 93                     right++;
 94                 }
 95 
 96                 else
 97                 {
 98                     MessageBox.Show("答题错误!");
 99                     listBox2.Items.Add(result + "=" + textBox2.Text + "  " + "×");//若答错就在后面打个错号。
100                     listBox1.Items.Remove(listBox1.SelectedItem);
101                 }
102                 label1.Text = "正确率:" + Convert.ToString(right * 1.0 / Count * 100).PadRight(5, ' ').Substring(0, 5) + "%";
103                 textBox1.Clear();
104                 textBox2.Clear();
105             }
106         }
107     }
108 }

运行测试:

出题界面:

答题界面:

提示结束:

保存:

 

转载于:https://www.cnblogs.com/yumaster/p/5008406.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值