我是Java OOP的新手,我正在尝试制作一个解决二度方程的简单程序。
package sistemiequazioni;
public class sistemi {
private double delta(double a, double b, double c) {
return (b*b) - 4*a*c;
}
public double[] grado2(double a, double b, double c) {
double Delta = delta(a,b,c);
if (Delta > -1) {
double x1 = (-b-Math.sqrt(Delta))/(2*a);
double x2 = (-b+Math.sqrt(Delta))/(2*a);
return new double[] { x1 , x2 };
} else {
return 0;
}
}
我有一个包含2个类的包:这个类名为sistemi
,另一个名为form1
,其中包含main。在form1
我使用:
sistemi d = new sistemi();
//get the values of a,b,c from the jTextFields
double[] k = new double[2];
k = d.grado2(a, b, c);
jTextField1.setText(String.valueOf(k[1]) + " and " + k[2]);
它返回2个值(x1和x2),我需要将它们存储在名为k
的数组中。我怎么能这样做?
正如我已经说过的,我对这些新东西很新。我用google搜索了这个,我发现了如何从方法中传递多个值,而不是如何将它们存储在变量中。
答案 0 :(得分:1)
您可以执行
,而不是仅返回0,因为您的返回类型为double[]
else {
return new double[] { 0 , 0 };
}
同样在comments数组中建议从索引0开始。所以你需要使用
jTextField1.setText(String.valueOf(k[0]) + " and " + k[1]);
答案 1 :(得分:1)
您不能返回0,因为0不是数组。你可以做的是返回一个只包含一个元素的数组,但你必须仔细考虑你给返回值的含义。
如果你希望你的方法返回一个包含解决方案的数组,那么就这样吧,但它不会总是长度为2.你必须处理所有可能的情况:
return new double[] { x1, x2 };
return new double[] { x };
return new double[0];
您的代码逻辑中也存在错误。某些Delta
值未得到妥善处理:
-1 < Delta < 0
那么你没有解决方案(我假设你不在这里使用复数)Delta == 0
那么只有一个解决方案,即-b/(2*a)
(因为它是双解决方案,你可能想要返回一个包含它两次的数组,所以这种情况可能没问题)我认为你对Delta的测试应该是:
if (Delta > 0) {
// calculate 2 solutions x1 and x2
return new double[] { x1, x2 };
} else if (Delta == 0) {
// calculate 1 solution x
return new double[] { x };
} else {
return new double[0]; // no solution
}
或者,如果您想考虑单一解决方案是两次解决方案的事实:
if (Delta >= 0) {
// calculate 2 solutions x1 and x2
return new double[] { x1, x2 };
} else {
return new double[0]; // no solution
}
在您当前的版本中,您就是这样做的:
double[] k = new double[2]; // creates an array of double that contains 2 slots
k = d.grado2(a, b, c); // REPLACES it by whatever the method returned
k
只是一个指向已创建数组的变量。如果你用其他东西(例如方法的返回值)影响它,那么它就不再指向你以前的数组了。
你可以做的是将k
作为方法的参数传递,并且您的方法将写入该数组的插槽中。但是,这里不需要这样做。此外,你不能事先知道会有2个解决方案,除非你处理复杂的数字,但这是另一个故事。
因此,您应该通过以下方式替换上述两行:
double[] k = d.grado2(a, b, c);
答案 2 :(得分:1)
首先,在调用函数之前,您不需要创建数组,因为函数已经创建并返回一个数组:
double[] k = new double[2];
k = d.grado2(a, b, c);
/// into
double[] k = d.grado2(a, b, c);
其次,如果必须返回2个有意义的值,则返回具有2个成员的类的对象。或者更好的是,创建一个代表等式的类,并使用getter返回每个结果:
public class QuadraticEquation {
private Double solution1;
private Double solution2;
public QuadraticEquation(double a, double b, double c) {
// delta 0 has 1 solution, delta > 0 has 2 solution
double delta = b * b - 4 * a * c;
if (delta >= 0) {
solution1 = (-b - Math.sqrt(delta)) / (2 * a);
solution2 = (-b + Math.sqrt(delta)) / (2 * a);
}
}
public boolean hasSolutions() {
return solution1 != null || solution2 != null;
}
public Double getSolution1() {
return solution1;
}
public Double getSolution2() {
return solution2;
}
}
我使用Double类型,因为它可以有null
值,这意味着没有解决方案。 Java会自动将其加倍。因此,您可以编写此代码:
QuadraticEquation eq = new QuadraticEquation(1, 2, 1);
if (eq.hasSolutions()) {
if (eq.getSolution1() == eq.getSolution2()) {
System.out.println("Equation has solution " + eq.getSolution1();
} else {
System.out.println("Equation has solutions " + eq.getSolution1() +
" and " + eq.getSolution2());
}
} else {
System.out.println("Equation has no real solutions ");
}