• 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 }

    运行测试:

    出题界面:

    答题界面:

    提示结束:

    保存:

  • 相关阅读:
    ABBYY FineReader 12如何识别包含非常规符号的文本
    如何使用ABBYY FineReader 12将JPEG文件转换成可编辑文本
    如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
    ABBYY OCR技术教电脑阅读缅甸语(下)
    ABBYY OCR技术教电脑阅读缅甸语(上)
    ABBYY FineReader 12使用教程
    ABBYY FineReader Pro for Mac有哪些特性(下)
    ABBYY FineReader Pro for Mac有哪些特性(上)
    MyBatis foreach
    callback 回调函数
  • 原文地址:https://www.cnblogs.com/yumaster/p/5008406.html
Copyright © 2020-2023  润新知