偶写的一个对四则运算的表达式进行处理的小程序.

//可以查错,包括很多语法错误和除零错误.可以对表达式进行追加修改.

//This program is designed for arithmetic,the operand is assumed to be double.
//
//This program can detect a lot of syntax errors,including illegal operands and illegal expression.
//Also the error of divided by zero can be detected,when a syntax error is detected,a warning message read
//"Error! illegal expression!"is displayed,and the result is set to 0.
//
//If the button1 is clicked when the textBox of expression is blank, a warning message read "Error! blank expression!"
//is displayed.
//
//It is set that some illegal characters can't be input into the expression.

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication8
{
 /// <summary>
 /// Summary description for Form1.
 /// </summary>
  
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.TextBox txtExp;
  private System.Windows.Forms.Label expLbl;
  private System.Windows.Forms.Label rstLbl;
  private System.Windows.Forms.TextBox txtRst;
  private System.Windows.Forms.Button button2;
  /// <summary>
  /// Required designer variable.
  /// </summary>
  private System.ComponentModel.Container components = null;

  public Form1()
  {
   //
   // Required for Windows Form Designer support
   //
   InitializeComponent();

   //
   // TODO: Add any constructor code after InitializeComponent call
   //
  }

  /// <summary>
  /// Clean up any resources being used.
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows Form Designer generated code
  /// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>
  private void InitializeComponent()
  {
   this.button1 = new System.Windows.Forms.Button();
   this.txtExp = new System.Windows.Forms.TextBox();
   this.expLbl = new System.Windows.Forms.Label();
   this.rstLbl = new System.Windows.Forms.Label();
   this.txtRst = new System.Windows.Forms.TextBox();
   this.button2 = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // button1
   //
   this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
   this.button1.Location = new System.Drawing.Point(112, 336);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(72, 24);
   this.button1.TabIndex = 0;
   this.button1.Text = "Calculate";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   //
   // txtExp
   //
   this.txtExp.Location = new System.Drawing.Point(168, 64);
   this.txtExp.Name = "txtExp";
   this.txtExp.Size = new System.Drawing.Size(296, 21);
   this.txtExp.TabIndex = 1;
   this.txtExp.Text = "";
   this.txtExp.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtExp_KeyPress);
   //
   // expLbl
   //
   this.expLbl.Location = new System.Drawing.Point(56, 64);
   this.expLbl.Name = "expLbl";
   this.expLbl.Size = new System.Drawing.Size(92, 23);
   this.expLbl.TabIndex = 2;
   this.expLbl.Text = "expression";
   //
   // rstLbl
   //
   this.rstLbl.Location = new System.Drawing.Point(56, 136);
   this.rstLbl.Name = "rstLbl";
   this.rstLbl.Size = new System.Drawing.Size(124, 23);
   this.rstLbl.TabIndex = 3;
   this.rstLbl.Text = "result";
   //
   // txtRst
   //
   this.txtRst.Location = new System.Drawing.Point(168, 136);
   this.txtRst.Name = "txtRst";
   this.txtRst.ReadOnly = true;
   this.txtRst.Size = new System.Drawing.Size(128, 21);
   this.txtRst.TabIndex = 4;
   this.txtRst.Text = "";
   //
   // button2
   //
   this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
   this.button2.Location = new System.Drawing.Point(360, 336);
   this.button2.Name = "button2";
   this.button2.TabIndex = 5;
   this.button2.Text = "Clear";
   this.button2.Click += new System.EventHandler(this.button2_Click);
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(592, 429);
   this.Controls.Add(this.button2);
   this.Controls.Add(this.txtRst);
   this.Controls.Add(this.rstLbl);
   this.Controls.Add(this.expLbl);
   this.Controls.Add(this.txtExp);
   this.Controls.Add(this.button1);
   this.Name = "Form1";
   this.Text = "ExpressionEvaluation_lihui";
   this.ResumeLayout(false);

  }
  #endregion

  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }

 

  class OpndStack
  {
   private ArrayList vectors;
   private int length;
   private double element;
 
   public OpndStack()
   {
    vectors = new ArrayList(20);
    length = 0;
   }

   public int getLength()
   {
    length = vectors.Count;
    return length;
   }

   public void put(double dbl)
   {
    vectors.Add(dbl);
    length = length+1;
   }

   public void pop()
   {
    vectors.RemoveAt(length-1);
    length = length-1;
   }

   public double getTop()
   {
    element = (double)vectors[length-1];
    return element;
   }

   public void traverse()
   {
    for(int i=0;i<length;i++)
    {
     //Console.WriteLine((double)vectors[i]);
    }
   }

   public void clear()
   {
    for(int i=length-1;i>=0;i--)
    {
     vectors.RemoveAt(i);
    }
    //Console.WriteLine("all elements been removed");
   }
  }


  class OptrStack
  {
   private ArrayList vectors;
   private int length;
   private char element;
 
   public OptrStack()
   {
    vectors = new ArrayList(20);
    length = 0;
   }

   public int getLength()
   {
    length = vectors.Count;
    return length;
   }

   public void put(char dbl)
   {
    vectors.Add(dbl);
    length = length+1;
   }

   public void pop()
   {
    vectors.RemoveAt(length-1);
    length = length-1;
   }

   public char getTop()
   {
    element = (char)vectors[length-1];
    return element;
   }

   public void traverse()
   {
    for(int i=0;i<length;i++)
    {
     //Console.WriteLine((char)vectors[i]);
    }
   }

   public void clear()
   {
    for(int i=length-1;i>=0;i--)
    {
     vectors.RemoveAt(i);
    }
    //Console.WriteLine("all elements been removed");
   }
  }


  class Compare
  {
   private char[] operators=new char[7];
   private int index;

   public Compare()
   {
    index=0;
    operators[0]='+';
    operators[1]='-';
    operators[2]='*';
    operators[3]='/';
    operators[4]='(';
    operators[5]=')';
    operators[6]='#';
   }

   public bool contains(char e)
   {
    bool found=false;
    int i;
    for(i=0;i<7&&found==false;i++)
     if(operators[i]==e)
      found=true;
    if(found==false)
     return false;
    else
     return true;
   }

   public int getIndex(char e)
   {
    int i;
    bool found=false;
    for(i=0;i<7&&found==false;i++)
     if(operators[i]==e)
     {
    
      index=i;
      found=true;
     }

    return index;
   }
  }

    
  class ExpProcs
  {
 
   private char[,] p = new char[7,7];
   private OptrStack optr;
   private OpndStack opnd;
   private Compare com;
 
 
 
   public ExpProcs()
   {
    //char[,] p = new char[7,7];
    p[0,0]='>';p[0,1]='>';p[0,2]='<';p[0,3]='<';p[0,4]='<';p[0,5]='>';p[0,6]='>';
    p[1,0]='<';p[1,1]='<';p[1,2]='<';p[1,3]='<';p[1,4]='<';p[1,5]='>';p[1,6]='>';
    p[2,0]='>';p[2,1]='>';p[2,2]='>';p[2,3]='>';p[2,4]='<';p[2,5]='>';p[2,6]='>';
    p[3,0]='>';p[3,1]='>';p[3,2]='>';p[3,3]='>';p[3,4]='<';p[3,5]='>';p[3,6]='>';
    p[4,0]='<';p[4,1]='<';p[4,2]='<';p[4,3]='<';p[4,4]='<';p[4,5]='=';p[4,6]='0';
    p[5,0]='>';p[5,1]='>';p[5,2]='>';p[5,3]='>';p[5,4]='0';p[5,5]='>';p[5,6]='>';
    p[6,0]='<';p[6,1]='<';p[6,2]='<';p[6,3]='<';p[6,4]='<';p[6,5]='0';p[6,6]='=';
  
    optr=new OptrStack();
    opnd=new OpndStack();
    com=new Compare();
   }

   public double execute(string e)
   {
  
    int i=0;
    bool errorFound=false;    
    double numAfterDot=1;
    double d=0;
    string expression;
    expression=e;
    //expression=Form1.txtExp.Text;
    expression+='#';
 
    optr.clear();
    opnd.clear();
    
    optr.put('#');
    while(expression[i]!='#'||optr.getTop()!='#')
    {
   
     if(Char.IsNumber(expression[i])||expression[i]=='.')    
     {    
      while(Char.IsNumber(expression[i])||expression[i]=='.')
      {
       if(expression[i]!='.')
       {
        d=d*10+(int)expression[i]-48;
        i++;
       }
       else    
       {     
        i++;
        while(Char.IsNumber(expression[i]))
        {
         numAfterDot*=10;     
         d=d+((int)expression[i]-48)/numAfterDot;
         i++;
        }
        if(expression[i]=='.')
        {
         MessageBox.Show("Error! illegal expression!","Form1",MessageBoxButtons.OK);
         errorFound=true;
        }
       }
       if(errorFound==true)
        break;
      }
      numAfterDot=1;
      opnd.put(d);
      d=0;          
     }
     if(errorFound==true)
      break;
     if(!Char.IsNumber(expression[i])&&expression[i]!='.'&&errorFound==false)
     {
      if(i>0&&expression[i-1]!='.'&&!Char.IsNumber(expression[i-1]))
       if(expression[i]!='('&&expression[i-1]!=')')
       {
        MessageBox.Show("Error! illegal expression!","Form1",MessageBoxButtons.OK);
        errorFound=true;
       }
      if(errorFound==false)
      {
       char optr_=optr.getTop();
       int x=com.getIndex(optr_);
       int y=com.getIndex(expression[i]);
       switch(p[x,y])
       {
        case '<':
         optr.put(expression[i]);
         //Console.WriteLine("operator stack");
         optr.traverse();
         i++;
         break;
        case '=':
         optr.pop();
         //Console.WriteLine("operator stack");
         optr.traverse();
         i++;
         break;
        case '>':
         char op=optr.getTop();
         optr.pop();
         //Console.WriteLine("operator stack");
         optr.traverse();     
     
         double b=opnd.getTop();
         opnd.pop();
         double a=opnd.getTop();
         opnd.pop();

         //Console.WriteLine("operand stack");
         //opnd.traverse();     
     
        switch(com.getIndex(op))
        {
         case 0:opnd.put(a+b);break;
         case 1:opnd.put(a-b);break;
         case 2:opnd.put(a*b);break;
         case 3:
          if(b!=0)
           opnd.put(a/b);
          else
          {
           //exit if divided by zero
           //Console.WriteLine("Error! divided by zero! 2");
           MessageBox.Show("Error! divided by zero!","Form1",MessageBoxButtons.OK);
           errorFound=true;
          }
          break;     
        }
         //Console.WriteLine("operand stack");
         //opnd.traverse();
         break;
        default :
        {
         //exit if illegal expression is found
         //Console.WriteLine("Error! illegal expression!");
         MessageBox.Show("Error! illegal expression!","Form1",MessageBoxButtons.OK);
         errorFound=true;
        }
         break;
       }
      }
     }
     if(errorFound==true)
      break;     
    }
    //Console.WriteLine(opnd.getTop());
    if(errorFound==false)
    {    
     return opnd.getTop();
    }
    else return 0;
   }
  }

  private void button1_Click(object sender, System.EventArgs e)
  {
   double result;
   ExpProcs expprocs = new ExpProcs();
   string expression=txtExp.Text;
   if(expression!="")
   {
    if(expression.Equals("."))
     MessageBox.Show("Error! illegal expression!","Form1",MessageBoxButtons.OK);
    else
    {
     result=expprocs.execute(expression);
     txtRst.Text=result.ToString();    
    }
   }
   else
   {
    MessageBox.Show("Error! blank expression!","Form1",MessageBoxButtons.OK);
   }     
  }

  private void button2_Click(object sender, System.EventArgs e)
  {
   txtExp.Text="";
   txtRst.Text="";

  }

  private void txtExp_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
  {
   double result;
   ExpProcs expprocs = new ExpProcs();
   string expression=txtExp.Text;

   
   if(e.KeyChar==(char)13)
   {
    if(expression!="")
    {
     if(expression.Equals("."))
      MessageBox.Show("Error! illegal expression!","Form1",MessageBoxButtons.OK);
     else
     {
      result=expprocs.execute(expression);
      txtRst.Text=result.ToString();    
     }
    }
    else
    {
     MessageBox.Show("Error! blank expression!","Form1",MessageBoxButtons.OK);
    } 
   }
   else      
    if(!Char.IsNumber(e.KeyChar)&&e.KeyChar!=(char)8&&e.KeyChar!='+'&&e.KeyChar!='-'&&    
    e.KeyChar!='*'&&e.KeyChar!='/'&&e.KeyChar!='('&&e.KeyChar!=')'&&e.KeyChar!='#'&&e.KeyChar!='.')
    e.Handled=true;
  }

 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值