<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yyq

    問君...

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      98 隨筆 :: 1 文章 :: 42 評論 :: 0 Trackbacks

    Calc是一個用Java編寫的算術表達式計算工具。它能夠直接解析一個字符串形式的算術表達式并計算出結果。

    Calc使用下面的語法:

    E ->  I | E + I | E - I
    I -> U | I * U | I / U
    U -> + U | - U | <浮點數> | ( E ) | <函數> | PI | E

    其中,<浮點數>是一個符合java規范格式的10進制浮點數,PI是圓周率,E是自然對數的底。

    <函數>實現了一些常用函數,函數的一般形式是:

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

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

    Calc內部使用雙精度浮點型(double)進行運算,一個正確的表達式經Calc計算所得的結果應該等于相應java表達式的結果。

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



    下載:
    http://m.tkk7.com/Files/20070716/calc.zip


    部分source下載:
    http://m.tkk7.com/Files/20070716/calc_src.zip

     

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

    評論

    # re: 做了個Java表達式計算器 2008-03-12 04:25 李敏
    能不能夠發個低版本的,我的機器上是JRE1.5的,如果沒有用到新特性,可以盡量向下兼容否?  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2008-03-12 09:00 xxx
    能提供代碼嗎 想研究下 hcqenjoy@gmail.com  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2008-03-12 09:38 h
    其實用Groovy來直接做這個事會更好。  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-03-12 12:28 yyq
    @李敏
    更新了一下,應該可以兼容1.5了。  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-03-12 12:28 lvq810
    import java.util.regex.*;
    import java.util.*;
    /**
    *利用正則式計算表達式的值
    *@author: Eastsun
    *@version: 0.5 07.2.26
    */
    public class Calculate{
    public static final String NUM_PATTERN = //數字的匹配模式
    "(?:(?<=[\\+\\-\\*\\(/]|^)[+-]|)" //前綴判斷,判斷前面的+-是否為符號
    +"(?:" //數字及小數點部分, 0. 以及 .0 都是合法的數字
    +"(?:\\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));
    }
    }
    }  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2008-03-14 01:26 李敏
    感謝兄弟照顧,提供了1.5版本的,不過有個不情之請,能不能發份源代碼過來,我對這個很有興趣,不過沒有達到你的那種程序,你上面寫的那個語法都看不懂- -!,所以想先看看代碼怎么實現的。

    email: onewalkingman@163.com  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-03-14 19:43 木風口子
    相當好,我會好好向你學習的,做了如此復雜的!厲害!  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-05-13 10:17 游客
    樓主你好,我想請你把你的源代碼發給我一份可以嗎?我正在學這個,覺得你寫的很好,非常非常的感謝你。。
    zhouchen12345678910@yahoo.cn  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-05-26 11:52 gjz
    你好,能不能研究一下源碼,guanjinzhu92@163.com  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-07-28 00:42 yyq
    代碼大部分是用工具生成的,而且有二進制文件,感覺光有代碼沒什么研究價值,不過整理后會提供下載的(最近一直無心弄這個了,sorry)。  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-07-29 00:06 yyq
    source(部分)可以下載了。  回復  更多評論
      

    # re: 做了個Java表達式計算器 2008-12-07 10:31 sqkobe108
    感謝,非常感謝,花了好長時間終于找到怎樣解決表達式計算器的問題了。你這個做的很好!!!  回復  更多評論
      

    # re: 做了個Java表達式計算器 2009-05-21 15:31 xiaohutu611
    可以提供完整的源代碼學習一下嗎?
    731001587@qq.com  回復  更多評論
      

    # re: 做了個Java表達式計算器 2009-05-28 00:50 黑妹
    我也很感興趣,可是沒有達到作者這個水平,想研究源代碼,可以也發給我嗎?非常感謝,我很渴望得到源代碼,呵呵
    501769230@QQ.com  回復  更多評論
      

    # re: 做了個Java表達式計算器 2009-11-12 09:53 benq
    請問ExpressionData.pd文件是做什么用的,是表達式經過與處理后的一個中間狀態嗎?  回復  更多評論
      

    # re: 做了個Java表達式計算器 2009-12-27 21:18 yyq
    @benq
    ExpressionData.pd 是我自己寫的語法分析器用到的文件。。。。。  回復  更多評論
      

    # 發現一個嚴重問題 2010-07-05 19:31 changeYi
    很明顯,這個程序雖然看起來不錯,但是一個很關鍵的問題:在表達式輸入框中無法輸入等號,這使表達式編輯框與按鈕框不能獨立出來!等于說表達式輸入框屬于額外付出!!  回復  更多評論
      

    # re: 做了個Java表達式計算器 2010-07-11 22:47 yyq
    兩個黃鸝鳴翠柳
      回復  更多評論
      

    # re: 做了個Java表達式計算器 2010-08-19 10:51 劉德
    請問 這兩個文件是怎么生成的
    ExpressionScanner.sd
    ExpressionData.pd
    你有ExpressionScanner.class的源代碼嗎?
    可以發給我嗎909030452@qq.com
    謝謝!  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2010-09-05 00:12 yyq
    @劉德
    ExpressionScanner.sd
    ExpressionData.pd 是我自己寫的分析器生成器自動生成的,光有源代碼沒意義的,因為那個源代碼根本不能手動修改,如果你想修改語法我倒是可以重新生成一個給你。。。。  回復  更多評論
      

    # re: 做了個Java表達式計算器 2011-02-12 17:15 胡迪新
    能不能提供一個完整的源代碼 謝謝了
    現在急需
    cashhu@126.com  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2011-06-23 21:35 luhang
    樓主能把源代碼給我嗎 我正在寫計算表達程序 遇到很多問題
    1021044@qq.com  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2011-06-23 21:38 luhang
    樓主能把源代碼發給我嗎 我正在寫關于表達式的作業 遇到很多問題
    1021044@qq,com  回復  更多評論
      

    # re: 做了個Java表達式計算器 2011-07-02 11:46 大起大落
    代碼好亂呀菜鳥不明白  回復  更多評論
      

    # re: 做了個Java表達式計算器 2012-09-03 15:18 zhozicho
    @yyq你好,
    ExpressionScanner.sd
    ExpressionData.pd 這倆個文件是怎么生成的,我急需原理  回復  更多評論
      

    # re: 做了個Java表達式計算器 2012-11-14 20:44 yyq
    @zhozicho
    寫的工具生成的,基本原因是正規式和有限狀態機,細節就非一兩句能說清了  回復  更多評論
      

    # re: 做了個Java表達式計算器 2013-04-03 11:18 啊啊啊啊啊
    (1+(2*2)+2+5.3)*8.5結果都會是104.55000000000001  回復  更多評論
      

    # re: 做了個Java表達式計算器[未登錄] 2013-05-10 21:31
    你好,可以給發這個項目嗎?381803426@qq.com
    謝謝了,急  回復  更多評論
      

    主站蜘蛛池模板: 午夜亚洲WWW湿好爽| 久久久精品午夜免费不卡| 国产精品亚洲四区在线观看 | 在线a免费观看最新网站| 亚洲A∨精品一区二区三区下载| 亚洲国产中文在线二区三区免| 亚洲最大黄色网站| 亚洲中字慕日产2021| 亚洲1区1区3区4区产品乱码芒果| 亚洲国产成人99精品激情在线| 国产v亚洲v天堂a无| 亚洲人片在线观看天堂无码| WWW亚洲色大成网络.COM| 亚洲无圣光一区二区| 亚洲国产夜色在线观看| 亚洲中文无码mv| 亚洲av无码专区国产不乱码| 美女视频免费看一区二区| 伊人久久五月丁香综合中文亚洲| 亚洲日韩精品无码AV海量| 国产精品亚洲综合网站| 特级aa**毛片免费观看| 大地资源在线资源免费观看| 蜜桃AV无码免费看永久| 最近中文字幕免费mv视频8| 免费在线看片网站| 日韩亚洲欧洲在线com91tv| 麻豆国产入口在线观看免费| 免费人成在线观看网站品爱网日本 | 亚洲欧美国产国产一区二区三区| 国产精品亚洲а∨天堂2021| 在线播放国产不卡免费视频| 一区二区三区观看免费中文视频在线播放| 1000部拍拍拍18勿入免费视频软件 | 免费人成视频在线播放| 最近中文字幕免费大全| 99久久久国产精品免费无卡顿| 日韩免费无码视频一区二区三区| 在线观看无码AV网站永久免费| 国产一级淫片免费播放| 亚洲AV日韩AV永久无码下载|