yyq

          問(wèn)君...

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            98 隨筆 :: 1 文章 :: 42 評(píng)論 :: 0 Trackbacks

          Calc是一個(gè)用Java編寫的算術(shù)表達(dá)式計(jì)算工具。它能夠直接解析一個(gè)字符串形式的算術(shù)表達(dá)式并計(jì)算出結(jié)果。

          Calc使用下面的語(yǔ)法:

          E ->  I | E + I | E - I
          I -> U | I * U | I / U
          U -> + U | - U | <浮點(diǎn)數(shù)> | ( E ) | <函數(shù)> | PI | E

          其中,<浮點(diǎn)數(shù)>是一個(gè)符合java規(guī)范格式的10進(jìn)制浮點(diǎn)數(shù),PI是圓周率,E是自然對(duì)數(shù)的底。

          <函數(shù)>實(shí)現(xiàn)了一些常用函數(shù),函數(shù)的一般形式是:

          <函數(shù)名> ( <參數(shù)>... )

          參數(shù)也是一個(gè)表達(dá)式(即E),可用的函數(shù)列表則請(qǐng)參考圖形界面或java.lang.Math的幫助文檔。

          Calc內(nèi)部使用雙精度浮點(diǎn)型(double)進(jìn)行運(yùn)算,一個(gè)正確的表達(dá)式經(jīng)Calc計(jì)算所得的結(jié)果應(yīng)該等于相應(yīng)java表達(dá)式的結(jié)果。

          示例代碼:
          import yyq.prod.calc.Calculator;
          ...
          double result = Calculator.calc("1 + 2 + sin(1)");
          System.out.println(result);



          下載:
          http://www.aygfsteel.com/Files/20070716/calc.zip


          部分source下載:
          http://www.aygfsteel.com/Files/20070716/calc_src.zip

           

          posted on 2008-03-12 01:18 yyq 閱讀(5899) 評(píng)論(28)  編輯  收藏 所屬分類: 編程

          評(píng)論

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-03-12 04:25 李敏
          能不能夠發(fā)個(gè)低版本的,我的機(jī)器上是JRE1.5的,如果沒(méi)有用到新特性,可以盡量向下兼容否?  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2008-03-12 09:00 xxx
          能提供代碼嗎 想研究下 hcqenjoy@gmail.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2008-03-12 09:38 h
          其實(shí)用Groovy來(lái)直接做這個(gè)事會(huì)更好。  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-03-12 12:28 yyq
          @李敏
          更新了一下,應(yīng)該可以兼容1.5了。  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-03-12 12:28 lvq810
          import java.util.regex.*;
          import java.util.*;
          /**
          *利用正則式計(jì)算表達(dá)式的值
          *@author: Eastsun
          *@version: 0.5 07.2.26
          */
          public class Calculate{
          public static final String NUM_PATTERN = //數(shù)字的匹配模式
          "(?:(?<=[\\+\\-\\*\\(/]|^)[+-]|)" //前綴判斷,判斷前面的+-是否為符號(hào)
          +"(?:" //數(shù)字及小數(shù)點(diǎn)部分, 0. 以及 .0 都是合法的數(shù)字
          +"(?:\\d*\\.)?\\d+|" //.0 的情形
          +"\\d+(?:\\.\\d*)?" //0. 的情形
          +")"
          +"(?!\\d|\\.)"; //邊界條件
          public static final String BRA_PATTERN =
          "\\((NUM)\\)".replace("NUM",NUM_PATTERN);
          public static final String ADD_PATTERN =
          "(NUM)\\+(NUM)".replace("NUM",NUM_PATTERN);
          public static final String SUB_PATTERN =
          "(NUM)-(NUM)".replace("NUM",NUM_PATTERN);
          public static final String MUL_PATTERN =
          "(NUM)\\*(NUM)".replace("NUM",NUM_PATTERN);
          public static final String DIV_PATTERN =
          "(NUM)/(NUM)".replace("NUM",NUM_PATTERN);
          public static final Pattern BRA =Pattern.compile(BRA_PATTERN);
          public static final Pattern ADD_OR_SUB =Pattern.compile("(?<=[^\\+\\-\\*/]|^)(?:"+ADD_PATTERN+"|"+SUB_PATTERN+")(?=[^\\*/]|$)");
          public static final Pattern MUL_OR_DIV =Pattern.compile("(?<![\\*/])(?:"+MUL_PATTERN+"|"+DIV_PATTERN+")");

          private static double operator(Matcher m,int index){
          index =index*2;
          double a,b;
          if(m.group(1)!=null){
          a =Double.parseDouble(m.group(1));
          b =Double.parseDouble(m.group(2));
          }
          else{
          index ++;
          a =Double.parseDouble(m.group(3));
          b =Double.parseDouble(m.group(4));
          }
          double r =0.0;
          switch(index){
          case 0:
          r =a+b;
          break;
          case 1:
          r =a-b;
          break;
          case 2:
          r =a*b;
          break;
          case 3:
          r =a/b;
          break;
          }
          return r;
          }
          public static double eval(String str){
          StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));
          while(true){
          Matcher m =BRA.matcher(sb);
          if(m.find()){
          sb.replace(m.start(),m.end(),m.group(1));
          }
          else{
          int index =1;
          m =MUL_OR_DIV.matcher(sb);
          if(!m.find()){
          index --;
          m =ADD_OR_SUB.matcher(sb);
          if(!m.find()) break;
          }
          sb.replace(m.start(),m.end(),""+operator(m,index));
          }
          }
          return Double.parseDouble(sb.toString());
          }
          public static void main(String[] args){
          Scanner scan =new Scanner(System.in);
          while(true){
          System.out.print("\nEnter a expression :");
          String str =scan.next();
          if(str.equals("exit")) break;
          System.out.print(str +" = "+eval(str));
          }
          }
          }  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2008-03-14 01:26 李敏
          感謝兄弟照顧,提供了1.5版本的,不過(guò)有個(gè)不情之請(qǐng),能不能發(fā)份源代碼過(guò)來(lái),我對(duì)這個(gè)很有興趣,不過(guò)沒(méi)有達(dá)到你的那種程序,你上面寫的那個(gè)語(yǔ)法都看不懂- -!,所以想先看看代碼怎么實(shí)現(xiàn)的。

          email: onewalkingman@163.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-03-14 19:43 木風(fēng)口子
          相當(dāng)好,我會(huì)好好向你學(xué)習(xí)的,做了如此復(fù)雜的!厲害!  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-05-13 10:17 游客
          樓主你好,我想請(qǐng)你把你的源代碼發(fā)給我一份可以嗎?我正在學(xué)這個(gè),覺得你寫的很好,非常非常的感謝你。。
          zhouchen12345678910@yahoo.cn  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-05-26 11:52 gjz
          你好,能不能研究一下源碼,guanjinzhu92@163.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-07-28 00:42 yyq
          代碼大部分是用工具生成的,而且有二進(jìn)制文件,感覺光有代碼沒(méi)什么研究?jī)r(jià)值,不過(guò)整理后會(huì)提供下載的(最近一直無(wú)心弄這個(gè)了,sorry)。  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-07-29 00:06 yyq
          source(部分)可以下載了。  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2008-12-07 10:31 sqkobe108
          感謝,非常感謝,花了好長(zhǎng)時(shí)間終于找到怎樣解決表達(dá)式計(jì)算器的問(wèn)題了。你這個(gè)做的很好!!!  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2009-05-21 15:31 xiaohutu611
          可以提供完整的源代碼學(xué)習(xí)一下嗎?
          731001587@qq.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2009-05-28 00:50 黑妹
          我也很感興趣,可是沒(méi)有達(dá)到作者這個(gè)水平,想研究源代碼,可以也發(fā)給我嗎?非常感謝,我很渴望得到源代碼,呵呵
          501769230@QQ.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2009-11-12 09:53 benq
          請(qǐng)問(wèn)ExpressionData.pd文件是做什么用的,是表達(dá)式經(jīng)過(guò)與處理后的一個(gè)中間狀態(tài)嗎?  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2009-12-27 21:18 yyq
          @benq
          ExpressionData.pd 是我自己寫的語(yǔ)法分析器用到的文件。。。。。  回復(fù)  更多評(píng)論
            

          # 發(fā)現(xiàn)一個(gè)嚴(yán)重問(wèn)題 2010-07-05 19:31 changeYi
          很明顯,這個(gè)程序雖然看起來(lái)不錯(cuò),但是一個(gè)很關(guān)鍵的問(wèn)題:在表達(dá)式輸入框中無(wú)法輸入等號(hào),這使表達(dá)式編輯框與按鈕框不能獨(dú)立出來(lái)!等于說(shuō)表達(dá)式輸入框?qū)儆陬~外付出!!  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2010-07-11 22:47 yyq
          兩個(gè)黃鸝鳴翠柳
            回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2010-08-19 10:51 劉德
          請(qǐng)問(wèn) 這兩個(gè)文件是怎么生成的
          ExpressionScanner.sd
          ExpressionData.pd
          你有ExpressionScanner.class的源代碼嗎?
          可以發(fā)給我嗎909030452@qq.com
          謝謝!  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2010-09-05 00:12 yyq
          @劉德
          ExpressionScanner.sd
          ExpressionData.pd 是我自己寫的分析器生成器自動(dòng)生成的,光有源代碼沒(méi)意義的,因?yàn)槟莻€(gè)源代碼根本不能手動(dòng)修改,如果你想修改語(yǔ)法我倒是可以重新生成一個(gè)給你。。。。  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2011-02-12 17:15 胡迪新
          能不能提供一個(gè)完整的源代碼 謝謝了
          現(xiàn)在急需
          cashhu@126.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2011-06-23 21:35 luhang
          樓主能把源代碼給我嗎 我正在寫計(jì)算表達(dá)程序 遇到很多問(wèn)題
          1021044@qq.com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2011-06-23 21:38 luhang
          樓主能把源代碼發(fā)給我嗎 我正在寫關(guān)于表達(dá)式的作業(yè) 遇到很多問(wèn)題
          1021044@qq,com  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2011-07-02 11:46 大起大落
          代碼好亂呀菜鳥不明白  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2012-09-03 15:18 zhozicho
          @yyq你好,
          ExpressionScanner.sd
          ExpressionData.pd 這倆個(gè)文件是怎么生成的,我急需原理  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2012-11-14 20:44 yyq
          @zhozicho
          寫的工具生成的,基本原因是正規(guī)式和有限狀態(tài)機(jī),細(xì)節(jié)就非一兩句能說(shuō)清了  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器 2013-04-03 11:18 啊啊啊啊啊
          (1+(2*2)+2+5.3)*8.5結(jié)果都會(huì)是104.55000000000001  回復(fù)  更多評(píng)論
            

          # re: 做了個(gè)Java表達(dá)式計(jì)算器[未登錄](méi) 2013-05-10 21:31
          你好,可以給發(fā)這個(gè)項(xiàng)目嗎?381803426@qq.com
          謝謝了,急  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 孟州市| 延长县| 托克逊县| 浠水县| 大同市| 扶余县| 汨罗市| 中卫市| 朔州市| 易门县| 黔西| 依兰县| 招远市| 吉安县| 临颍县| 尖扎县| 北流市| 中山市| 永寿县| 礼泉县| 夏邑县| 延寿县| 渭源县| 新泰市| 明水县| 翁牛特旗| 福贡县| 利津县| 淳化县| 巴彦县| 鲁甸县| 汉沽区| 上虞市| 开远市| 张北县| 洞头县| 焦作市| 婺源县| 信阳市| 邵武市| 广水市|