我是用中文作的变量名,看起来有点别扭。不习惯,如果你愿意的话可以把他改成英文的!
有两个了类,一个做语法检查,一个做运算!
今天想到了一个更好的方法,这样可以提高运算精度。
等两天贴上来
献丑了!
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;
}
}
}

