[BL1160]=([BL2010]+[BL7111]*4+[BL7211]*16+[BL7310]*64+[BL4010]*63+[BL2510]*252+[BL6010]*1008)/([BL2000]+[BL7110]*4+[BL7210]*16+[BL7300]*64+[BL4000]*63+[BL2500]*252+[BL6000]*1008)*100[BL1160] 是一个指标,根据其他的指标经过运算(目前主要是=-×/和小括号)得来的。
怎么定义这个算法?求算法和主要java api 函数。

解决方案 »

  1.   

    我觉得这个算法和目标有关系,而不是跟楼主给的这个表达式有关系;或者就是没有理解了楼主的意思,楼主是求算法还是求如何用java表示这个表达式并求解?
      

  2.   

    匿名内部类访问局部变量时,需要将局部变量声明为final
      

  3.   

    ChDw(米) 兄乃高人也。请帮助!
      

  4.   

    其实你还可以使用JavaCC来完成,去 https://javacc.dev.java.net/下载一个版本
    set JAVACC_HOME=...
    set JAVA_HOME=..
    ----------MyCC.jj------
    options {
    STATIC = false;
    }PARSER_BEGIN(Grammar) /*解析代码的入口*/import java.util.HashMap;public class Grammar {
    public static final int PlusOP = 1;
    public static final int MinusOP = 2;
    public static final int TimersOP= 3;
    public static final int OverOP = 4; private HashMap map = new HashMap();

    public static void main(String args[]) throws ParseException {
    Grammar parser = new Grammar(System.in);
    parser.map.put("[a]", new Double(1.23));
    parser.map.put("[b]", new Double(2.31));
    parser.map.put("[c]", new Double(3.12));
    parser.Expression();
    System.out.println(parser.map.get("[F]"));
    }
    }
    PARSER_END(Grammar)SKIP : /* 不处理的字符*/
    {
    " " | "\t"
    }TOKEN : /*生成token的字符定义*/
    {
    < ID: "[" ( ["a"-"z","A"-"Z","_","0"-"9"] )* "]" >
    | < NUM: ( ["0"-"9"] )+ >
    | < PLUS: "+" >
    | < MINUS: "-" >
    | < TIMERS: "*" >
    | < OVER: "/" >
    | < LBRACKET: "(" >
    | < RBRACKET: ")" >
    | <NEWLINE: ("\r\n"|"\n"|"\r")>
    }void Expression() :
    /*完成 Expression ::=( ( <NEWLINE> )* Simple_Expression <NEWLINE> )* <EOF> 的配陪*/
    {
    double value = 0; /* 这个{}中是Expression()的定义的局部变量*/
    Token t = null;
    }
    {
    t = <ID>
    <EQ: "=">
    value = Simple_Expression() <NEWLINE> /*在换行之前Simple_Expression()解析表达式 ,输入换行后,一个预算解析完成*/
    {
    map.put(t.image, new Double(value));
    }
    }double Simple_Expression() :
    /*完成Simple_Expression ::=bnf Term ( addop Term )*配陪 */
    {
    /* 这个{}中是Simple_Expression()的定义的局部变量*/
    double value;
    double tValue;
    int op;
    }
    {
    value = Term (){} /*配陪Term 相*/
    (
    op = addop() 
    tValue = Term()
    {
    switch(op)
    {
    case PlusOP:
    value = value + tValue;
    break;
    case MinusOP:
    value = value - tValue;
    break;
    }
    }
    )* /*匹配 ( addop Term )* */
    { return value; }
    }int addop() : {}
    {
    <PLUS> { return PlusOP; }
    | <MINUS> { return MinusOP; }
    }double Term() :
    {
    double value;
    double tValue;
    int op;
    }
    {
    value = Factor(){}
    (
    op = mulop()
    tValue = Factor()
    {
    switch(op)
    {
    case TimersOP:
    value = value * tValue;
    break;
    case OverOP:
    value = value / tValue;
    break;
    }
    }
    )*
    {
    return value;
    }
    }int mulop() :{}
    {
    <TIMERS> { return TimersOP; }
    | <OVER> { return OverOP; }
    }double Factor() :
    {
    double value = 0;
    Token t;
    }
    {
    t = <ID> /*获得<ID>的解析的值*/
    {
    Double tValue = (Double)map.get(t.image);
    value = tValue == null ? Double.NaN : tValue.doubleValue();
    return value;
    }
    | t = <NUM> {
    value = Double.parseDouble(t.image);
    return value;
    }
    | t = <MINUS> {
    value = 0 - Factor();
    return value;
    }
    | t = <PLUS> {
    value = Factor();
    return value;
    }
    | <LBRACKET> value = Simple_Expression() <RBRACKET> {
    return value;
    }

    ----------End MyCC.jj------然后运行 javacc MyCC.jj,它会生成一些Java文件的
    上面已经完成了你需要的功能(为测试代码)
    输入[F]=1+[a]*3   等等这样就可以了。至于真正的代码你需要将/*获得<ID>的解析的值*/这里改动一下,put进去的地方也需要改
      

  5.   

    JavaCC是一个功能强大的语法分析的工具,它只在你生成Java时用,真正运行是不需要的
      

  6.   

    ChDw(米)  javacc  的不懂。请各位再指点。
      

  7.   

    唉,我都说得够明白了吧!你去下载一个JavaCC:https://javacc.dev.java.net/设置好环境变量
    set JAVACC_HOME=...
    set JAVA_HOME=..然后将我上面------------中间的东西保存在MyExpr.jj文件
    然后运行 JAVACC_HOME\bin\javacc MyExpr.jj,它会生成N个Java文件,这样就是已经可以完成了。你编译并运行它就可以输入并得到结果