JAVA写的四则混合运算

2008-02-23 09:25:44来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

近来用Java写了一个小程序,不敢独享.

这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.)

这个版本我已经定为了2.21版本.呵呵.

从最先的1.0到2.0的改动很大.除了运算思想没动处,其它的都在2.0做了重新设计.

这种程序其实网上一大把(算法也好得多)。此仅为无聊找点事情做而已。

/**
*四则混合运算程序
*作者:黄剑武
*时间:2005年4月29日
*版本:2.21
*修改日志:2.0
* 1.更改表达式用户输入方式.
* 2.对用户输入的表达式进行有效性字符过滤.
* 3.使用Double代替原int数值,并且使用严格浮点运算提高运算精度.
* 4.解除对运算数字只能是一位的限制.
* 5.优化了部分代码.
*修改日志:2.1
* 1.加入表达式括号匹配功能.
*修改日志:2.2
* 1.加入表达式处理功能.
*修改日志:2.21
* 1.修改部分语法以支持JDK1.5中的泛型用法.
*/


import java.lang.reflect.Array;
import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;

//测试用例:1-3*(4-(2 5*3) 5)-6/(1 2)=23
//测试用例:11.2 3.1*(423-(2 5.7*3.4) 5.6)-6.4/(15.5 24)=1273.4199746835445
class Calculator
{

public static void main(String[] args) throws IOException
{
String str_input;
double f_output;

while (true)
{
System.out.print("输入表达式: ");
System.out.flush();

str_input = getString();
if (str_input.equals(""))
{
break;
}

Calculator calculator = new Calculator();

//以下对输入字符串做规则处理
str_input = calculator.checkExpression(str_input);
if (str_input.equals(""))
{
System.out.println(" 表达式出错 ");
}

//以下对输入字符串做表达式转换
Vector<String> v_compute = calculator.getExpression(str_input);

/*
for (int i=0;i<v_compute.size();i )
{
System.out.println(" " v_compute.get(i));
}
*/

//以下进行后缀表达式转换
Vector<String> v_tmp_prefix = calculator.transformPrefix(v_compute);

/*
for (int i=0;i<v_tmp_prefix.size();i )
{
System.out.println(v_tmp_prefix.get(i));
}
*/

//以下进行后缀表达式运算
f_output = calculator.evaluatePrefix(v_tmp_prefix);

System.out.println("结果 = " f_output);

}
}

/**
*静态方法,用来从控制台读入表达式
*/
public static String getString() throws IOException
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}


/**
*输入字符串转换.把从控制台读入的字符串转成表达式存在一个队列中.
*例:123 321 存为"123"" ""321"
*/
public Vector<String> getExpression(String str)
{
Vector<String> v_temp = new Vector<String>();
char[] temp = new char[str.length()];
str.getChars(0,str.length(),temp,0);
String fi = "";
int x=0,i=0;
String regex_fig = "[\\.\\d]"; //匹配数字和小数点
String regex_operator = "[\\ \\-\\*/\\(\\)]"; //匹配运算符( ,-,*,/)和括号("(",")")
Pattern p_fig = Pattern.compile(regex_fig);
Pattern p_operator = Pattern.compile(regex_operator);
Matcher m = null;
boolean b;
while (i<str.length())
{
Character c = new Character(temp[i]);
String s = c.toString();
//System.out.println("char c = " s);
m = p_operator.matcher(s);
b = m.matches();

if (b)
{
//System.out.println("matches operator");
v_temp.add(fi);
fi="";
v_temp.add(s);
}
m = p_fig.matcher(s);
b = m.matches();
if (b)
{
//System.out.println("matches fig");
fi=fi s;
}
i ;
}
v_temp.add(fi);

return v_temp;
}

/**
*转换中序表示式为前序表示式
*/
public Vector<String> transformPrefix(Vector<String> v_expression)
{
Vector<String> v_prefix = new Vector<String>();
Stack<String> s_tmp = new Stack<String>();
String regex_float = "\\d (\\.\\d )?"; //匹配正浮点数
Pattern p_float = Pattern.compile(regex_float);
Matcher m = null;
boolean b;
String str_elem = "";

for (int i=0;i<v_expression.size();i )
{
str_elem = v_expression.get(i).toString();
m = p_float.matcher(str_elem);
b = m.matches();

if (b)
{
v_prefix.add(str_elem);
}

if (str_elem.equals(" ")||str_elem.equals("-"))
{
if (s_tmp.isEmpty())
{
s_tmp.push(str_elem);
}
else
{
while(!s_tmp.isEmpty())
{
String str_tmp = s_tmp.peek();

if ( str_tmp.equals("("))
{
break;
}
else
{
v_prefix.add(s_tmp.pop());

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java数据报编程之概说

下一篇:AOP和Spring事务处理