如何打印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");
}
发布于 2015-02-19 10:00:30
好吧,让我试着把这里提到的一切都整理好。
您的第一个主要问题是您期望您的变量以某种方式运行,但是您没有正确地处理它们。这是因为您没有正确地使用它们的作用域。
简单地说,变量的作用域是它的可用位置和它的“生存期”。例如,变量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
的新变量,它与类的变量a
无关。之所以会出现这种情况,是因为您可以在不同的范围内拥有类似名称的变量。这是您的代码的第一个问题。您会丢失值,因为您不需要在类变量中进行工作和保存它,而是将其保存在一个临时变量中,该变量一旦函数执行完毕就会死掉,并返回它(显然,这不等于保存它)。
要解决这个问题,正如mohmicro所建议的那样,您应该使用this
关键字来指定希望编译器更新的变量。换句话说,当使用this.a = input.nextDouble();
而不是double a = input.nextDouble();
时,您是在说:保存我刚才对类的a
变量所做的工作,而不是函数的a
变量。同样的过程应该应用于所有getB/C.F函数,并将确保您从用户那里获得的值存储在类中,从而允许isSolvable()
、getX()
和getY()
使用实际信息访问变量(因为在当前实现中,a, b, c, d, e, f
保持为0)。
为了回答你的第二个问题,你的每个功能都完成了一个以上的任务。一般说来,这被认为是不好的做法,并导致功能不连贯。虽然它看起来更有效率,或者使用较少的代码行,但它在试图为维护或调试目的读取代码时增加了混乱。为什么?因为当这个函数有一个以上的时候,或者它不是一个功能的时候,你可能会忽略它的一些目的。
这也是你问题的根源。每次您想获得任何变量a,...,f
的值时,都会与用户进行对话,并让用户更改变量的值。这是因为您的函数做了两件事,它设置一个值并返回它。非常不受欢迎。要解决这个问题,你要分而治之。每个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()
。一个功能-一个目的。
发布于 2015-02-18 19:58:39
您的逻辑有一些问题,您正在创建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");
}
}
发布于 2015-02-18 20:36:36
在您的方法中,您不向类成员写入数据。您只需在函数中重新定义一个局部变量并将值写入它。在你的代码中
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;
}
这是你旁边的许多对象,每个对象有一个输入值。您应该只使用一个具有所有值的值,以便使方程claclulation工作。
https://stackoverflow.com/questions/28598347
复制