JAVA写的四则混合运算
2008-02-23 09:25:44来源:互联网 阅读 ()
这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.)
这个版本我已经定为了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事务处理
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash