0

// OPP 中用于演示代码的计数器类,它应该与提供的代码一起使用,但输出都是错误的,setLimit 不会限制任何东西

public class CounterExtended {
    private int value;
    /**
     * Gets the current value of this counter.
     * 
     * @return the current value
     */
    public int getValue() {
        return value;
    }

    /**
     * Advances the value of this counter by 1.
     */
    public void count() {
        value = value + 1;
    }

    /**
     * Resets the value of this counter to 0.
     */
    public void reset() {
        value = 0;
    }

    public void setLimit(int maximum) {
        if (value >= maximum)
            System.out.printf("Limit of",maximum, "exceeded");
    }


    public void undo() {
        if (value>=0){
         value--;
        }

    }
}

和演示代码

public class Demo {

        public static void main(String[] args) {
                CounterExtended tally = new CounterExtended();
                for (int i = 1; i <= 10; ++i) {
                        if (i > 7) {
                                tally.setLimit(6);
                        }
                        tally.count();
                        System.out.printf("After count %d, tally is %d\n", i,
                                        tally.getValue());
                }
                tally.undo();
                tally.undo();
                tally.count();
                System.out.printf("After 2 undo's and one count, tally is %d\n",
                                tally.getValue());

        }

}

运行上面的代码后,输出应该看起来像

After count 1, tally is 1
After count 2, tally is 2
After count 3, tally is 3
After count 4, tally is 4
After count 5, tally is 5 
Limit of 5 exceeded
After count 6, tally is 5 
Limit of 5 exceeded
After count 7, tally is 5 
After count 8, tally is 6 
Limit of 6 exceeded
After count 9, tally is 6
Limit of 6 exceeded
After count 10, tally is 6
After 2 undo's and one count, tally is 5
4

4 回答 4

2

这显然是“学习练习”,因此仅提示:

您设置的问题是弄清楚如何使您的计数器类在提供的测试工具使用时按照示例输出运行。显然(其他读者注意!)测试工具的更改是不允许的。

  • 输出意味着在发生溢出count() 时应该做什么。(提示:它不应该停止循环......)

  • 输出意味着什么getValue() 应该在溢出后返回?

  • 您需要在CounterExtended实例中记录哪些额外状态才能实现这一目标?

  • 实例的当前实例字段是CounterExtended实现这一目标的最佳方式吗?(提示:不......但你需要弄清楚为什么它不是。)

于 2013-04-28T00:47:43.697 回答
0

代码中有几件事:

  • 你的setLimit()方法没有做它宣传的事情。它没有设置任何东西。它也只是打印出来,“嘿,我们超出了这里的限制!” 这不会停止循环。

  • 你的循环结构中没有break。这是你可以停止循环的唯一方法。

您设置限制的标准似乎是任意的,但我们可以使用它。让我们将setLimit()方法更改为实际的 setter。(我还鼓励您将字段名称从 更改valuelimit以避免混淆。)

public void setLimit(int someLimit) {
    limit = someLimit;
}

接下来,我们必须在循环中指定当我们达到该限制时停止迭代。

for(int i = 0; i <=10; i++) {
    if(i == tally.getLimit()) {
        System.out.printf("Limit of %d exceeded\n", i);
        break;
    }
    tally.count();
    System.out.printf("After count %d, tally is %d\n", i,
                       tally.getValue());
}
于 2013-04-28T00:47:36.143 回答
0

1)看这段代码。此代码在循环 7 次后设置值。检查条件i > 7。所以,你永远不会得到这条线After count 5, tally is 5 Limit of 5 exceeded

for (int i = 1; i <= 10; ++i) {

   if (i > 7) 
   {
   tally.setLimit(6);
   }

2)你没有setValueCounterExtended课堂上定义,这是设置value变量所必需的。

public void setValue(int value)
{ 
this.value = value
}
于 2013-04-28T00:58:34.470 回答
0

终于想通了,书上的指示不是很清楚。不过谢谢!

public class CounterExtended {
    private int value;
    private int tallyLimit = 5;

    /**
     * Gets the current value of this counter.
     * 
     * @return the current value
     */
    public int getValue() {
        return value;
    }

    /**
     * Advances the value of this counter by 1.
     */
    public void count() {
        if (value < tallyLimit) {
            value = value + 1;
        } else {
            System.out.printf("Limit of %d exceeded\n", tallyLimit);
        }
    }

    /**
     * Resets the value of this counter to 0.
     */
    public void reset() {
        value = 0;
    }
    /**
     * Sets limit on the tally 
     * 
     */
    public void setLimit(int maximum) {
        tallyLimit = maximum;
        ;
    }
    /**
     * Undos a button click or decrements the tally.
     */
    public void undo() {
        if (value != 0) {
            value--;
        }

    }
}
于 2013-05-01T01:24:44.110 回答