从方法返回值

Returning Values From Methods

如何打印出点 a-f 的值,而不是让它重复每次输入的内容?我的程序 returns 方程每次也无解,我做错了什么?

public class LinearEquations {
Scanner input = new Scanner(System.in);

private double a, b, c, d, e, f = 0;
double x, y;

public double getA() {
    System.out.println("Enter the value of a: ");
    double a = input.nextDouble();
    return a;
}

public double getB() {
    System.out.println("Enter the value of b: ");
    double b = input.nextDouble();
    return b;
}

public double getC() {
    System.out.println("Enter the value of c: ");
    double c = input.nextDouble();
    return c;
}

public double getD() {
    System.out.println("Enter the value of d: ");
    double d = input.nextDouble();
    return d;
}

public double getE() {
    System.out.println("Enter the value of e: ");
    double e = input.nextDouble();
    return e;
}

public double getF() {
    System.out.println("Enter the value of f: ");
    double f = input.nextDouble();
    return f;
}

public boolean isSolvable() { 
    if ((a * d) - (b * c) == 0){
        return false;
    }
    return true;
}

public double getX() {
    double x = (((e * d) - (b * f)) / ((a * d) - (b * c)));
    return x;
}

public double getY() {
    double y = (((a * f) - (e * c)) / ((a * d) - (b * c)));
    return y;
}

这是主要的class

public static void main(String[] args) {
    LinearEquations pointA = new LinearEquations();
    LinearEquations pointB = new LinearEquations();
    LinearEquations pointC = new LinearEquations();
    LinearEquations pointD = new LinearEquations();
    LinearEquations pointE = new LinearEquations();
    LinearEquations pointF = new LinearEquations();

    System.out.println(pointA.getA());
    System.out.println(pointB.getB());
    System.out.println(pointC.getC());
    System.out.println(pointD.getD());
    System.out.println(pointE.getE());
    System.out.println(pointF.getF());

    LinearEquations pointX = new LinearEquations();
    LinearEquations pointY = new LinearEquations();

    if (pointX.isSolvable() && pointY.isSolvable()) {
        System.out.println("x is " + pointX.getX() +
                " and y is " + pointY.getY());
    } else {
        System.out.println("The equation has no solution");
    }

您的逻辑有一些问题,您在创建 8 LinearEquation 对象时实际上只需要 1。

public static void main(String[] args) {
    LinearEquations theOne = new LinearEquations();

    System.out.println(theOne.getA());
    System.out.println(theOne.getB());
    System.out.println(theOne.getC());
    System.out.println(theOne.getD());
    System.out.println(theOne.getE());
    System.out.println(theOne.getF());


    if (theOne.isSolvable()) {
        System.out.println("x is " + theOne.getX() +
                " and y is " + theOne.getY());
    } else {
        System.out.println("The equation has no solution");
    }
}

在您的方法中,您没有将数据写入 class 成员。您只需在函数内部重新定义一个局部变量并将值写入它即可。 在你的代码中

public double getF() {
    System.out.println("Enter the value of f: ");
    double f = input.nextDouble();
    return f;
}

应该是

public double getF() {
    System.out.println("Enter the value of f: ");
    this.f = input.nextDouble();
    return f;
}

这就在你身边,你有许多对象,每个对象都有一个输入值。您应该只使用具有所有值的一个,这样方程式才有效。

好吧,让我试着整理一下这里提到的所有内容。

您的第一个主要问题是您希望您的变量以某种方式运行,但您没有正确处理它们。那是因为你没有正确使用它们的作用域。

简单地说,变量的作用域就是可用的位置和可用的时间"live"。比如你的变量a, b, c, d, e, f的作用域就是整个classLinearEquaions。这意味着所有这些变量都应该对 class 的所有成员函数可用,并且只要包含它们的对象存在就会一直存在。该对象之外的任何东西都不应该 直接 访问这些变量。一旦一个对象死亡,它就会杀死它的所有私有变量。

每次在花括号 {} 中编写代码时,您都会定义一个 新范围 。它也被称为'code blocks'。在处理范围和大括号时要记住的一个重要规则是每个嵌套范围(在大多数情况下)都可以访问在其包含对象中定义的变量和函数。这就是为什么 class 的所有函数,基本上是在 class' {} 中编写的代码,都可以访问其包含的 class 的私有变量。此外,定义每个函数的代码是,猜猜是什么?在函数的 {} 内,因此每个函数都有自己的作用域。

这仍然不能直接解释为什么您的代码不起作用。让我们来看看你的一个功能。为了演示范围,我包含了 class 和变量声明:

public class LinearEquations {
    Scanner input = new Scanner(System.in);

    private double a, b, c, d, e, f = 0;
    double x, y;

    public double getA() {
        System.out.println("Enter the value of a: ");
        double a = input.nextDouble();
        return a;
    }
.
.
.
}//end of class LinearEquations, and its scope

看看 class 的范围,注意它是如何包含其中编写的所有代码的。现在,注意定义函数 getA() 的代码块。在函数之外,您可以按如下方式定义变量:

private double a, b, c, d, e, f = 0;

在这里,你说:我希望所有这些在我的 class 中的任何地方都可用,但只对 this class 的成员可用,它们都是双精度类型,并且等于 0.

接下来,

public double getA() {
        System.out.println("Enter the value of a: ");
        double a = input.nextDouble();
        return a;
}

double a = input.nextDouble();行定义了一个new变量,叫做a,在函数范围内,与变量[=22没有任何关系=] 你的 class。发生这种情况是因为您可以在不同范围内拥有相似名称的变量。这是您的代码的第一期。你丢失了值,因为你没有做工作并将它保存在你的 class 变量中,而是将它保存在一个临时变量中,该变量将在函数完成执行后立即消失,并且 return 它(它确实显然不等于保存它。

要解决这个问题,正如 mohmicro 所建议的,您应该使用 this 关键字来指定您希望编译器更新哪个变量。换句话说,当使用 this.a = input.nextDouble(); 而不是 double a = input.nextDouble(); 时,您是在说:将我刚刚所做的工作保存到 class' a 变量,而不是函数的 a变量。同样的过程应该应用于你所有的 getB/C...F 函数,并确保你从用户那里得到的值存储在 class 中,这反过来又允许 isSolvable()getX()getY() 以访问具有实际信息的变量(因为在您当前的实现中,a, b, c, d, e, f 保持为 0)。


回答你的第二个问题,你的每个函数都完成了不止一项任务。一般来说,这被认为是不好的做法,会导致函数不内聚。虽然它 可能 看起来更有效率或使用更少的代码行,但它会在尝试阅读代码以进行维护或调试时增加混乱。为什么?因为当它有多个功能时,或者当它不是一个功能一个目的的问题时,你可能会忽略一些功能的目的。

这也是你问题的根源。每次你想要获取任何一个变量的值 a,...,f,你都与用户进行对话,并让他更改变量的值。这是因为你的函数做了两件事,它设置了一个值并 returns 它。非常不受欢迎。为了解决这个问题,你想要分而治之。您的每个 get 函数都应分为两个不同的函数。一个用用户的值设置变量,另一个在需要时获取该值。这是一个例子:

public void setA() {
    System.out.println("Enter the value of a: ");
    this.a = input.nextDouble();  //get the value from the user and insert it to the object's variable a
}

public double getA() {
    return a;
}

这样,每当您需要用户为变量 a 提供新值时,您调用 setA(),而每当您需要获取 a 中的内容时,您调用getA()。一功能一用途。