四则混合运算类

我是用中文作的变量名,看起来有点别扭。不习惯,如果你愿意的话可以把他改成英文的!

有两个了类,一个做语法检查,一个做运算!


今天想到了一个更好的方法,这样可以提高运算精度。
等两天贴上来

献丑了!
using System;

namespace 四则混合运算
{
 
/// <summary>
 
/// 分析表达式语法,判断是否正确
 
/// </summary>

 public class 语法
 
{
  
public 语法()
  
{
   
//
   
// TODO: 在此处添加构造函数逻辑
   
//
  }

  
/// <summary>
  
/// 对公式进行语法检测
  
/// </summary>
  
/// <param name="公式">需要检测的公式</param>
  
/// <returns></returns>

  public static  bool 语法检测(string 公式)
  
{   
   公式
=公式.TrimStart(' ');
   
int 正括号=0;
   
int 反括号=0;
   
int 正括号位置=0;
   
for(int i=0;i<公式.Length;i++)
   
{
    
//清楚空格
    switch(公式[i])
    
{
     
case '(':
     
{
      正括号
++;
      正括号位置
=i;
      
break;
     }

     
case ')':
     
{
      反括号
++;
      
if((i-1)==正括号位置)
      
{
       
return false;
      }

      
break;
     }

     
case '+':case '-':case '*'case '/':
     
{
      
if(公式[i-1]=='('  || 公式[i-1]=='+' || 公式[i-1]=='-' || 公式[i-1]=='*' || 公式[i-1]=='/')
      
{
       
return false;
      }


      
if( 公式[i+1]==')' || 公式[i+1]=='+' || 公式[i+1]=='-' || 公式[i+1]=='*' || 公式[i+1]=='/')
      
{
       
return false;
      }

      
break;
     }

     
    }

   }

   
return 正括号==反括号?true:false;
    
  }

  
 }

}



——————————————————————————————————————————————

using System;
 
namespace 四则混合运算
{
 
/// <summary>
 
/// 运算公式 的摘要说明。
 
/// </summary>

 public class 运算公式
 
{
  
public 运算公式()
  
{
   
//
   
// TODO: 在此处添加构造函数逻辑
   
//
  }

  
public static  string 运算(string 公式)
  
{
   公式.TrimStart(
' ');
   
int 正括号=0;
   
int 反括号=0;
   
while(公式.IndexOf('(')>-1)
   
{
    
for(int i=0;i<公式.Length;i++)
    
{
     
if(公式[i]=='(')
     
{
      正括号
=i;
     }

     
if(公式[i]==')')
     
{
      反括号
=i;
      
string 直接公式=公式.Substring(正括号,反括号-正括号+1);
      
string 返回值=优先级运算(直接公式.Substring(1,直接公式.Length-2));
      公式
=公式.Replace(直接公式,返回值);
     }

    }

   }

   
   
return 优先级运算(公式).ToString();
           
  }


  
private static string 优先级运算(string 公式)
  
{
   
    
int 开始=0;
    
int 结束=0;
    
//处理乘除运算
    for(int i=0;i<公式.Length;i++)
    
{
     
switch(公式[i])
     
{
      
case '+':case'-':
       开始
=i+1;
       
break;
      
case '*'case'/':
       
string 公式段=公式.Remove(开始,i+1);
          
int d;
       
for(d=0;d<公式段.Length;d++)
       
{
        
if(公式段[d]=='*' || 公式段[d]=='/' || 公式段[d]=='+' || 公式段[d]=='-')
        
{
         结束
=d;
         
break;
        }

       }

       公式段
=公式.Substring(开始,i-开始+d+1);
       公式
=公式.Replace(公式.Substring(开始,公式段.Length),直接运算(公式段).ToString());
       
break;
     }

    }

   开始
=0;
   结束
=0;
   
//处理乘除运算
   for(int i=0;i<公式.Length;i++)
   
{
    
switch(公式[i])
    
{
     
     
case '+'case'-':
      
string 公式段=公式.Remove(开始,i+1);
      
int d;
      
for(d=0;d<公式段.Length;d++)
      
{
       
if(公式段[d]=='+' || 公式段[d]=='-')
       
{
        结束
=d;
           
break;
       }

      }

      公式段
=公式.Substring(开始,i+d+1);
      公式
=公式.Replace(公式.Substring(开始,公式段.Length),直接运算(公式段).ToString());
      
break;
    }

   }

    
   
return 公式;
  }

  
/// <summary>
  
/// 直接运算公式
  
/// </summary>
  
/// <param name="公式"></param>
  
/// <returns></returns>

  private static Double 直接运算(string 公式)
  
{
   Double a;
   Double b;
   
int 长度=1;
   
for(int i=0;i<公式.Length;i++)
   
{
    
    
    
switch(公式[i])
    
{
     
case '*':
      a
=System.Convert.ToDouble(公式.Substring(0,i));
      b
=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
      
return a*b;
     
case '/':
      a
=System.Convert.ToDouble(公式.Substring(0,i));
      b
=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
      
return a/b;
     
case '+':
      a
=System.Convert.ToDouble(公式.Substring(0,i));
      b
=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
      
return a+b;
     
case '-':
      a
=System.Convert.ToDouble(公式.Substring(0,i));
      b
=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
      
return a-b;
    }

    长度
++;
   }

   
   
return 0;
    
  }

 }

}


原文地址:https://www.cnblogs.com/leiyu1980/p/158959.html