java

时间:2015-06-16 18:21:15

标签: java parsing math

我有这个代码来解决二度方程。用户使用名称与[a-zA-Z]匹配的任何变量输入等式,但程序有一个问题:如果用户输入一个包含多个变量的等式,例如" x ^ 2 + 2Y-20 = 0" (它包含两个变量,x和y),它仍然会解决"它返回" a = 1,b = 2,c = -20"。

我想要求用户只输入一个变量,例如 " X ^ 2 + 2×20 = 0"或" y ^ 2 + 2y-20 = 0" (或任何其他字母,只要在整个等式中使用相同的字母),这将被解决为" a = 1,b = 2,c = -20"还

因为程序目前没有区分变量,所以它解决了一个带有多个变量的等式,好像它们是相同的变量(字符)而且错误。

public class ParseEquation {
public static String coeff(String str, String regex) {
    Pattern patt = Pattern.compile(regex);
    Matcher match = patt.matcher(str);
    // missing coefficient default
    String coeff = "+0";
    double value = 0;

   if(match.find()) 
        coeff = match.group(1);
    // always have sign, handle implicit 1
    value= Double.parseDouble((coeff.length() == 1) ? coeff + "1" 
        : coeff);

}
public static String[] quadParse(String arg) {
    String str = ("+" + arg).replaceAll("\\s", "");

    double a1 = Double.parseDouble(coeff(str, "([+-][0-9]*)([a-z A-Z]\\^2)"));
    double b1 = Double.parseDouble(coeff(str, "([+-][0-9]*)([a-z A-Z](?!\\^))"));
    double c1= Double.parseDouble(coeff(str, "([+-][0-9]+)(?![a-z A-Z])"));
    System.out.println("Values are a: " + a1 + " b: " + b1 + " c: " + c1);
    double dis = (Math.pow(b1, 2.0)) - (4 * a1 * c1);
    double d = Math.sqrt(dis);
    double X = 0, Y = 0; 

    if (dis > 0.0 || dis < 0.0) {
        X = (-b1 + d) / (2.0 * a1);
        Y = (-b1 - d) / (2.0 * a1);
        String root1 = Double.toString(X);
        String root2 = Double.toString(Y);
        return new String[]{root1, root2};
    } else if (dis == 0.0) {
        X = (-b1 + 0.0) / (2.0 * a1);//repeated root
        String root2 = Double.toString(X);
        return new String[]{root2};
    }
    return new String[-1];
}
public static void main(String[] args) throws IOException {
    BufferedReader r = new BufferedReader (new InputStreamReader(System.in));
    String s;
    while ((s=r.readLine()) != null) {
        String[] pieces = quadParse(s);
        System.out.println(Arrays.toString(pieces));
    }
}
}

目前,上述代码返回&#34; x ^ 2 + 2y-20 = 0&#34;

的错误结果
Values are a: 1.0 b: 2.0 c: -20.0
[3.58257569495584, -5.58257569495584]

正确的结果是允许用户在等式中只输入一个变量字符,例如&#34; x ^ 2 + 2x-20 = 0&#34;,否则抛出异常。

1 个答案:

答案 0 :(得分:0)

在通过quadParse(s);将行解析为公式之前,请检查它的内容。创建一个长度为26的布尔数组,其中每个索引代表您在等式中看到的变量。一次迭代输入一个字母,如果看到特定变量,则更新数组。如果您在该流程结束时看到多个变量,则可以在调用quadParse之前抛出异常。