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