0

これは宿題の問題であり、クラス Distance で .add() メソッドを作成する方法を理解するのに苦労しています。

クラス Distance には 2 つの整数インスタンス変数があります。

private int feet;
private int inches;

Distance を 0 フィートおよび 0 インチで初期化する引数なしのコンストラクターがあります。

フィートとインチの 2 つの正の整数を受け入れる 2 つの引数のコンストラクターがあり、それらが負の場合、またはインチが 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 メソッドを設定する方法ですか? 私は自分自身に自信がありません。

私の 2 番目の問題は、別の Distance オブジェクトをそれ自体に追加するメソッド 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
public void setInches(int in){
    feet = in;
}

inの値をインチではなくフィートに割り当てているため、これはタイプミスだと思います。

public int getInches(){
    return Inches;
}

別のタイプミス。Javaでは大文字と小文字が区別されるため、「インチ」は「インチ」と同じではありません。それ以外は、ゲッター/セッターは見栄えがします。

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 に答える
1
int a = this.feet;
int b = this.inches;

少し冗長です...

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

intコンパイルされません。プリミティブ値 (この場合は ) にはメソッドがないことを思い出してください。


これが解決策です(可変引数のサポートが追加され、無限Distanceの s が可能になりました):

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 メソッドを設定する方法ですか? 私は自分自身に自信がありません。

ゲッター/セッターは正しく見えます。それらのポイントは、メンバー変数をカプセル化して、誤って「変更」されないようにすることです (アクセスを制限します)。おそらく、メンバー変数を何らかの「デフォルト」値に初期化する必要があります。この場合、以下でそれらを 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;
}

私の 2 番目の問題は、メソッド add() の作成にあります。

「追加」メソッドについては、おそらくローカル変数をより「説明的」なものに変更することをお勧めします。これは、長期的には「読みやすさ」と「保守性」に役立ちます。

「距離」クラスには既にメンバー変数「フィート」と「インチ」が含まれているため、これらの値をローカル変数に設定する意味はありません。クラスのゲッター/セッターのいずれかと一緒に、それらに直接アクセスできます。

   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 に答える
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 は Distance オブジェクトではなく int であるため、 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;

エラー: canddはオブジェクトであり、オブジェクトではintegersありませんDistancec 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 に答える