从方法中返回值

时间:2015-02-19 03:55:10

标签: java class methods system.out

如何打印出a-f点的值而不重复每次输入的内容?而且我的错误是我的程序返回时,方程式每次都没有解决方案?

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;
}

这是主要的课程

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");
    }

3 个答案:

答案 0 :(得分:3)

您的逻辑存在一些问题,当您实际只想要1时,您正在创建 8 LinearEquation对象。

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");
    }
}

答案 1 :(得分:3)

在您的方法中,您不是要向类成员写入数据。您只需重新定义函数内的局部变量并将值写入其中。 在你的代码中

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;
}

除此之外,您可以使用多个对象,每个对象都有一个输入值。你应该只使用一个具有所有值的方法,以便方程式克拉有效。

答案 2 :(得分:1)

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

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

简单地说,变量的范围,它可用的位置以及它将会活动多久#34;。例如,变量a, b, c, d, e, f的范围是整个类LinearEquaions。这意味着所有这些变量应该可用于类的所有成员函数,并且只要包含它们的对象存在就会存在。该对象之外的任何内容都不应该直接访问这些变量。一旦对象死亡,它就会杀死所有私有变量。

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

这仍然无法直接解释为什么您的代码无效。我们来看看你的一个功能。为了演示范围,我包括了类和变量声明:

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

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

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

在这里,你说:我希望所有这些都可以在我班级的任何地方使用,但只有this类的成员,它们都是double类型,等于0。

接下来,

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

double a = input.nextDouble();定义了一个名为a new 变量,该变量位于函数范围内,与类的变量a无关。发生这种情况是因为您可以在不同的范围内使用相似名称的变量。这是您的代码的第一个问题。你失去了价值,因为你不是在工作中将它保存在你的类变量中,而是将它保存在一个临时变量中,一旦函数完成执行就会死掉,并返回它(显然不等于保存它)

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


要回答第二个问题,您的每个功能都可以完成多项任务。一般来说,这被认为是不好的做法,并导致不连贯的功能。虽然可能似乎更高效或使用更少的代码行,但在尝试读取代码以进行维护或调试时会增加混淆。为什么?因为当它有多个功能时,你可能会忽略某些功能的用途,或者它不是单功能一用的问题。

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

a,...,f

这样,只要您需要来自用户的变量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()中的内容,就可以调用{{ 1}}。单功能酮目的。