3

私は初心者で、Javaは私の最初のプログラミング言語です。私が解決しようとしているこの問題があります:

砂糖ボウルの砂糖を表すクラスを定義します。これは、総容量(グラム単位)、利用可能な量、スプーンの量(スプーンに関連付けられている砂糖のグラム数)の3つで特徴付けられます。このクラスで設定:

  1. シュガーボウルを作成するコンストラクターメソッド。
  2. シュガーボウル内の砂糖の量を知ることができる方法。
  3. スプーン一杯の砂糖がどれくらいかかるかを知ることができる方法。
  4. スクープの数を指定して、対応する量の砂糖を取り除き、この値を返すメソッド。
  5. 砂糖を加える方法。提供された値が使用可能なスペースを超える場合は、シュガーボウルがいっぱいになり、残りの量が返されます。それ以外の場合は、ゼロを返す必要があります。

クラスRunSugarBowlをメインとして設定し、遊んでください。

public class SugarBowl {

    private int totalCapacity;
    private int availableSpace;
    private int spoonSize;
    private int occupiedSpace = totalCapacity-availableSpace;//is the same as amount of sugar in the bowl.

    SugarBowl (int totalCapacity){
        availableSpace=totalCapacity;
        spoonSize = totalCapacity/20;//arbitrary size
    }

    public int spoon(){
        return spoonSize;
    }

    public int occupied(){
        return occupiedSpace;
    }

    public void scoops (int numberOfScoops){
        int amountTaken = numberOfScoops * spoonSize;
        if (amountTaken<=occupiedSpace){
            occupiedSpace=occupiedSpace-amountTaken;
            System.out.println(amountTaken);}
        else{
            System.out.println("There's not that amount of sugar in the sugar bowl. Try less.");}       
    }
    public int addSugar (int addedAmount){
        if (addedAmount>availableSpace){
            int remainingAmount=addedAmount-availableSpace;
            availableSpace=0;
            occupiedSpace = totalCapacity-availableSpace;
            return remainingAmount;}
        else{
             availableSpace = availableSpace - addedAmount;
             occupiedSpace = totalCapacity-availableSpace;
                return 0;}
    }
}

私の問題、私のone.occupiedメソッドが0代わりに次の場所に戻ること200です。

public class RunSugarBowl {
    public static void main(String[] args) {
        SugarBowl one = new SugarBowl(200);
        one.addSugar(300);
        System.out.println("Occupied size is : "+ one.occupied());
    }
}
4

6 に答える 6

3

残念ながら、あなたのコードは間違っています。この関数を変更する必要があります

    public void addSugar (int addedAmount){
    if (addedAmount>availableSpace){
        int remainingAmount=addedAmount-availableSpace;
        System.out.println("Sugar bowl completely full. You got left: "+ remainingAmount);}
    else{
        System.out.println("0");}
}

public void addSugar (int addedAmount){
    if (addedAmount>availableSpace){           
        System.out.println("Sugar bowl completely full. You got left: "+ remainingAmount);}
    else{
        availableSpace = availableSpace - addedAmount; //this ensures available space changes after you add sugar
        occupiedSpace = totalCapacity-availableSpace; // you must also write this to change the ocuuppied space too
        System.out.println(availableSpace);
    }
}

200 容量のシュガー ボウルを作成し、後で 100 を追加するためです。そう

if (addedAmount>availableSpace) 

100 > 200 は false を返し、「0」を出力するだけの else ブロックに直接移動します。これはあなたが犯した論理エラーです。しかし、心配しないでください。

実際には、 占有スペースをプロパティとして 使用したため、この行occupiedSpace = totalCapacity-availableSpace; は必須 です。クラスの最初に書いた式は、コンストラクターを呼び出したときに一度だけ実行されます (そして、最初は両方の値がプリミティブ int であるため、吸引する値は両方とも 0 です)。占有スペースは、の関数呼び出しで変更しない限り0のままです。 .availableSpace = availableSpace - addedAmount;

ただし、代わりにocusedSpaceまたはavailableSpaceを必要なたびに計算する場合は、そのうちの 1 つを削除する必要があるため、もう 1 つとtotalCapacityのみが必要です。他の 1 つは、 totalCapacityから 1 を減算することで毎回計算できます。私があなたなら、私は使うだろう

public int getOccupiedSpace(){
return totalCapacity-availableSpace;
}

使用する代わりに(ちなみに、これはあなたのケースでは役に立ちます)

private int occupiedSpace = totalCapacity-availableSpace;

これはまったく同じです

private int occupiedSpace = 0;

また

private int occupiedSpace ;
于 2012-12-27T18:51:29.590 に答える
2

最初に、ヒントとして、メソッド ヘッダーを追加すると、メソッドが何をしようとしているのかがわかるようになると便利です。別名、仕様を見ると、メソッドの多くは「どれだけ知っているか...」を要求するため、メソッドはすぐに何かを出力するのではなく、数値を返す必要があります (コーディングを開始したときに同じ間違いを犯しました)。

メソッド内でこれらの数値を出力しています (これはデバッグには役立ちますが、完成品がすべきことではありません)。int を返し、その整数を RunSugarBowl に出力できます (以下を参照)。

そのために必要なことの一般的な枠組みを説明し、役立つコメントをいくつか追加しました。あなたは最初からよくやった。さらに問題がある場合は、コメントで質問してください。

public class SugarBowl {
    private int totalCapacity;
    private int availableSpace;
    private int spoonSize;
    private int occupiedSpace;//starts at 0, because there's nothing in the bowl.

    /**
     * Constructor for the sugar bowl.
     * @param totalCapacity     The total capacity of the bowl.
     */
    public SugarBowl (int totalCapacity){
        this.totalCapacity = totalCapacity; //set the totalCapacity for the bowl
        availableSpace=totalCapacity;
        spoonSize = totalCapacity/20;//arbitrary size
        occupiedSpace = 0;
    }
    /**
     * Shows how much sugar can fit in a spoon.
     * @return  The size of the spoon
     */
    public int spoon(){
        return spoonSize;
    }
    /**
     * Returns amount of sugar in the bowl.
     * @return  The amount of occupied space
     */
    public int occupied(){
        return occupiedSpace;
    }
    /**
     * Removes the amount of sugar based on the
     * number of scoops passed into it.
     * @param numberOfScoops    The number of scoops
     * @return          The amount of sugar removed
     */
    public int scoops (int numberOfScoops){

        int possibleAmountTaken = numberOfScoops * spoonSize;
        int actualAmountTaken = 0;
        //Think about sugar, even if there is less sugar than the spoon size, 
        //can a spoon still remove that amount?
        //aka the only time 0 sugar should be taken is when there is 0 sugar in the bowl
        if (possibleAmountTaken<=occupiedSpace){
            actualAmountTaken = possibleAmountTaken;
        }
        else{
            //there may still be sugar, just not enough for every scoop, you still have to remove it
            //actualAmountTaken = ???
        }
        occupiedSpace = occupiedSpace - actualAmountTaken;
        //what about availableSpace?
        //availableSpace = ???
        return actualAmountTaken;       
    }
    /**
     * Adds the specified amount of sugar to the bowl.
     * 
     * @param addedAmount   The amount of sugar added to the bowl
     * @return  The overflow amount of sugar or 0 if there was no overflow
     */
    public int addSugar (int addedAmount){
        int overflow = 0;
        if (addedAmount>availableSpace){
            overflow = addedAmount-availableSpace;
            //your bowl is going to be full, what happens to occupiedSpace and availableSpace?
            //availableSpace = ???
            //occupiedSpace = ???
        }
        else{
            //overflow is already 0 so you don't have to do anything with it
            //update availableSpace and occupiedSpace
            //availableSpace = ???
            //occupiedSpace = ???
        }
        return overflow;
    }
}

上記の主な例では:

public class RunSugarBowl {
    public static void main(String[] args) {
        SugarBowl one = new SugarBowl(200);
        System.out.println("Sugar overflow: " + Integer.toString(one.addSugar(300))); //once working correctly should print out 100 for the overflow
        System.out.println("Occupied size is : "+ one.occupied());
    }
}

アップデート

this.totalCapacity を使用する理由は、次のコード行のためです。

public class SugarBowl {
    private int totalCapacity; //totalCapacity for this object; aka this.totalCapacity refers to this variable
    //..

    public SugarBowl (int totalCapacity){ // <-- totalCapacity passed in
        this.totalCapacity = totalCapacity; //this.totalCapacity is setting the totalCapacity for this instance of the object to the value passed in
        //..

コンストラクターが "totalCapacity" という変数で渡されていることに注意してください。さらに、クラスには totalCapacity という独自の内部変数もあります。「this」キーワードを使用しない比較可能なコードは次のとおりです。

public class SugarBowl {
    private int bowlTotalCapacity; //totalCapacity for this object
   //..

    public SugarBowl (int totalCapacity){ 
        bowlTotalCapacity = totalCapacity;
        //..

以前に totalCapacity を使用していた場所を初期化した後は、bowlTotalCapacity に変更する必要があります。this.totalCapacity を使用して、このクラス内の totalCapacity を参照する方がはるかに簡単です。詳細については、http: //docs.oracle.com/javase/tutorial/java/javaOO/thiskey.htmlを参照してください。

技術的には、最初にオブジェクトを構築した後は実際に totalCapacity を再度使用することはありませんが、この部分を含めない場合に起こる奇妙なことを確認したい場合は、次のコードで何が起こるかを理解してください。

public class ThisExample {
    private int wrongExample = 0;
    private int thisExample = 0;

    public ThisExample (int wrongExample, int thisExample){
        wrongExample = wrongExample;
        this.thisExample = thisExample; 
    }

    public int getThisExample(){
        return thisExample;
    }
    public int getWrongExample(){
        return wrongExample;
    }
}

以下を実行すると、理解が深まる場合があります。

public class ThisExampleMain {
    public static void main(String[] args) {
        ThisExample ts = new ThisExample(50, 50);
        //you want this to be 50 but it ends up being 0:
        System.out.println("Wrong: " + ts.getWrongExample());
        //this returns the correct answer:
        System.out.println("Right: " + ts.getThisExample());
    }
}
于 2012-12-27T19:49:30.057 に答える
2

仕様で要求されている addSugar メソッドは、int を返す必要があります。

メインでは one.owned() メソッドを呼び出していますが、その値で何もしていません。おそらく、それを表示するために印刷したいでしょう。

以下は addSugar メソッドとメインです。

public int addSugar (int addedAmount){
    if (addedAmount>availableSpace){
        int remainingAmount=addedAmount-availableSpace;
        return remainingAmount;
        }
    else
        {
            availableSpace = availableSpace - addedAmount;
            occupiedSpace = occupiedSpace + addedAmount;
        return 0;
        }
}

public class RunSugarBowl {
public static void main(String[] args) {
    SugarBowl one = new SugarBowl(200);
    System.out.println("The occupied Space is: " + one.occupied());
    System.out.println("The addSugar() method is returning " + one.addSugar(300));
    System.out.println("The occupied Space now is: " + one.occupied());
}

}

于 2012-12-27T20:17:17.407 に答える
1

メインメソッドはメソッドを呼び出しますが、それらのメソッドから返された値を使用しません。main次のようにメソッドを変更する必要があります。

public class RunSugarBowl {
    public static void main(String[] args) {
        SugarBowl one = new SugarBowl(200);
        System.out.println("Occupied size is : "+ one.occupied());
    }
}

addSugar()メソッドを次のように変更します。

    public void addSugar (int addedAmount){
        if (addedAmount>availableSpace){
            int remainingAmount=addedAmount-availableSpace;
            availableSpace=0;
//Update occupiedSpace here.

            System.out.println("Sugar bowl completely full. You got left: "+ remainingAmount);}
        else{
             availableSpace = availableSpace - addedAmount; //this ensures available space changes after you add sugar
                System.out.println("I added "+addedAmount + "to the bowl");
// Update occupiedSpace here.


    }
    }

砂糖を追加するときにoccupedSpaceフィールドを更新しないので、常に同じままです。

于 2012-12-27T18:38:52.220 に答える
0

交換する必要があります

sugarBowl (int totalCapacity){
    availableSpace=totalCapacity;
    spoonSize = totalCapacity/20;//arbitrary size
}

public SugarBowl (int totalCapacity){
    availableSpace=totalCapacity;
    spoonSize = totalCapacity/20;//arbitrary size
}
于 2012-12-27T18:20:57.837 に答える
0

main()メソッドをsugarBowlクラスに追加できます。それを実行するために別のクラスは必要ありません。

メインを次のように変更します。

public class RunSugarBowl {
    public static void main(String[] args) {
        sugarBowl one = new sugarBowl(200);
        one.occupied();
        one.addSugar(100);
        }
}

または、クラスとそのコンストラクターの名前をSugarBowl. Sun Java コーディング標準に準拠しているため、2 番目の方法をお勧めします。

于 2012-12-27T18:23:51.213 に答える