0

这是一个家庭作业问题,我无法理解如何在距离类中创建 .add() 方法。

类距离有两个整数实例变量:

private int feet;
private int inches;

它有一个无参数构造函数,用零英尺和零英寸初始化距离。

它有一个两个参数的构造函数,它接受英尺和英寸的两个正整数,如果它们是负数或英寸大于 11,则抛出异常。

它还具有实例变量的 get/set 方法。我的获取/设置方法:

public void setFeet(int f){
    feet = f;
}

public void setInches(int in){
    inches = in;
}

public int getFeet(){
    return feet;
}

public int getInches(){
    return inches;
}

我对任何愿意回答的人的第一个问题:这是我应该如何设置这些 get/set 方法吗?我不确定自己。

我的第二个问题在于创建一个方法 add() 将另一个距离对象添加到自身。那是,

w1 = new Distance(4,9);
w2 = new Distance(3,6);
w1.add(w2); //w1 becomes 8 feet, 3 inches.

到目前为止,我有这个:

    public int add(Distance d) {
    int df = d.getFeet();
    int di = d.getInches();
    int a = this.feet;
    int b = this.inches;
    int c = a.getFeet();
    int d = b.getInches();
    int sumInches, sumFeet, temp;
    sumInches =di + d;
    sumFeet = df + c;
    if (sumInches>11) {
        temp = sumInches-11;
        sumFeet = sumFeet+1;
        sumInches = temp;
    }
    this.feet = sumFeet;
    this.inches = sumInches;
}

但我不确定这是否会编译(我现在无法访问可以安装编译器的计算机)。有人可以检查一下并向我解释为什么这可能是错误的吗?

4

7 回答 7

1
int a = this.feet;
int b = this.inches;

是不是有点啰嗦...

int c = a.getFeet();
int d = b.getInches();

不会编译,回想一下原始值(int在我们的例子中)没有方法。


这是一个解决方案,(增加了对可变参数的支持,允许无限Distances):

public void add(Distance... distance) {
    for(Distance d : distance) {
        feet += d.getFeet();
        if(inches + d.getInches >= 12)
            feet++;
        inches += d.getInches() % 12;
    }
}

有了这个,你可以很容易地添加这样的:

d1.add(d2, d3, d4, d5);
于 2013-03-13T03:08:39.617 回答
1

我对任何愿意回答的人的第一个问题:这是我应该如何设置这些 get/set 方法吗?我不确定自己。

你的 getter/setter 看起来是正确的;它们的重点是封装成员变量,以便它们不会被意外“修改”(限制访问)。您可能希望将成员变量初始化为某个“默认”值——在这种情况下,我将它们初始化为下面的 0。 注意:默认情况下,编译器会将它们初始化为 0。

private int feet = 0;
private int inches = 0;

public void setFeet(int f){
    feet = f;
}

public void setInches(int in){
    feet = in;
}

public int getFeet(){
    return feet;
}

public int getInches(){
    return inches;
}

我的第二个问题在于创建方法 add()。

关于您的“添加”方法,您可能希望将局部变量更改为更具“描述性”,从长远来看,这将有助于“可读性”和“可维护性”。

由于您的“距离”类已经包含成员变量“英尺”和“英寸”,因此没有必要将这些值设置为局部变量。您可以直接访问它们——以及任何类的 getter/setter。

   public int add(Distance newDistance) {

    int newDistanceFeet = newDistance.getFeet();
    int newDistanceInches = newDistance.getInches();

    int sumInches = newDistanceInches + this.getInches();
    int sumFeet = newDistanceFeet + this.getFeet();

    // Now we can check to see if any conversion are needed.. Note: 12 inches = 1 foot
    //   
    sumInches += (sumInches % 12);
    sumFeet += (sumInches / 12);

   // Now set the newly added inches/feet to the class's member variables
   //
   this.setFeet(sumFeet);
   this.setInches(sumInches);
}
于 2013-03-13T03:18:12.147 回答
1
public void setInches(int in){
    feet = in;
}

我认为这是一个错字,因为您将 in 值分配给英尺而不是英寸。

public int getInches(){
    return Inches;
}

另一个错字。Java 区分大小写,因此“英寸”与“英寸”不同。除此之外,getter/setter 看起来还不错。

至于 add() 方法......没有理由创建那些“a”、“b”、“c”和“d”变量

int a = this.feet;
int b = this.inches;
int c = a.getFeet();
int d = b.getInches();

您可以直接使用 this.feet 和 this.inches。这本身并没有错,只是不必要并且使代码混乱。此外,我强烈建议始终创建有意义的变量名。“a”、“b”、“c”代码难以阅读。变量名应该是富有表现力的。此外,在您的算法中,您需要从总英寸中减去 12。所以 add 方法可以更简洁地写成这样:

public void add(Distance d)
{
  int newFeet = this.feet + d.feet;
  int newInches = this.inches + d.inches;
  if (newInches > 11)
  {
     newFeet++;
     newInches = newInches - 12;
  }
  this.feet = newFeet;
  this.inches = newInches;
} 

就个人而言,我会通过将所有内容转换为英寸,然后使用除法和模运算符 (%) 来确定英尺和英寸来实现该逻辑,但如果您愿意,我会将其作为练习留给您。

于 2013-03-13T03:37:14.177 回答
0

基本想法是正确的,但是您做错了一些事情,请考虑:

public int add( Distance d ){
  feet += d.feet;
  inches += d.inches;
  if( inches >= 12 ){
    inches = inches - 12;
    feet++;
  }
}

我看到的最大问题是

int a = this.feet;
int d = a.getFeet();

这里 a 是 int 而不是 Distance 对象,因此您不能调用 getFeet()

于 2013-03-13T03:10:11.253 回答
0

将您的 add() 更新为:-

public int add(Distance d) {
    int df = d.getFeet();
    int di = d.getInches();
    int a = this.feet;
    int b = this.inches;

错误c并且dintegers而不是Distance对象。你不需要c and d整数。

    int sumInches, sumFeet, temp;
    sumInches =di + b;
    sumFeet = df + a;
    if (sumInches>11) {
        temp = sumInches-11;
        sumFeet = sumFeet+1;
        sumInches = temp;
    }
    this.feet = sumFeet;
    this.inches = sumInches;
于 2013-03-13T03:10:39.740 回答
0

你的问题来了

int a = this.feet;
int b = this.inches;
int c = a.getFeet();
int d = b.getInches();

由于 a 和 b 是 int 变量。他们没有 getFeet() 和 getInches() 方法。将您的 add() 方法更改为

public int add(Distance d) {
    int df = d.getFeet();
    int di = d.getInches();
    int sumInches, sumFeet, temp;
    sumInches =di + this.inches;
    sumFeet = df + this.feet;
    if (sumInches>11) {
        temp = sumInches-11;
        sumFeet = sumFeet+1;
        sumInches = temp;
    }
    this.feet = sumFeet;
    this.inches = sumInches;
}
于 2013-03-13T03:10:56.870 回答
0

由于这是一个家庭作业问题,我没有提供完整的解决方案。由于您尝试了 add 方法,我将进一步优化它并在此处提供相同的注释

public void add(Distance distance) {

        int extraFeet=0;  /*Intializing the extra Feet*/
        extraFeet = (this.inches+distance.getInches())/11; /*Calculating the additional feet*/
        if(extraFeet >0)  
            this.inches = (this.inches+distance.getInches())%11;  /*if extra feet is greater than zero thn the remainder is the inches*/
        else
            this.inches +=distance.getInches(); /*else teh remainder is the sum of the inches*/
        this.feet += (distance.getFeet()+extraFeet);


    }
于 2013-03-13T03:20:32.240 回答