我有这个代码来解决二度方程。用户使用名称与[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;,否则抛出异常。
答案 0 :(得分:0)
在通过quadParse(s);
将行解析为公式之前,请检查它的内容。创建一个长度为26的布尔数组,其中每个索引代表您在等式中看到的变量。一次迭代输入一个字母,如果看到特定变量,则更新数组。如果您在该流程结束时看到多个变量,则可以在调用quadParse
之前抛出异常。