• 中文
    • English
  • 注册
  • 查看作者
    • 《算法第四版》课后练习题1.2.10答案

      习题1.2.10

      编写一个类 VisualCounter,支持加一和减一操作。它的构造函数接受两个参数 N 和 max,其中 N 指定了操作的最大次数,max 指定了计数器的最大绝对值。作为副作用,用图像显示每次计数器变化后的值。

      要点分析

      1. Counter

      《算法第四版》课后练习题1.2.9答案 中,我们曾经提到过Counter类,但是它只有加一的操作,而本题需要我们自己实现一个Counter类并支持加一和减一的操作,然后再编写一个用例。关于这个测试用例,有很多种实现方法实现,我们可以用Random类,随机生成一个0~N的数字,是偶数就加一,是奇数就减一

      2.  StdDraw

      因为本题要用图像显示每次计数器变化后的值,所以要用到StdDraw类的相关方法(课本第27页),标准绘图库的静态控制方法的API如下:

      《算法第四版》课后练习题1.2.10答案

      参考答案

      import edu.princeton.cs.algs4.StdDraw;
      
      import java.util.Random;
      
      /**
       * @description:
       * @author: ZhangJia
       * @create: 2018-08-16 15:20
       **/
      public class Ten {
          public static void main(String[] args) {
              Random r = new Random();
              int N = 100;
              int max = 10;
              VisualCounter v = new VisualCounter(N, max);
              //随机生成0 - 100 之间的数字,奇数计数器减一,偶数计数器加一
              for (int i = 0; i < N; i++) {
                  int p = r.nextInt(101) % 2;
                  if (p == 1) {
                      v.decrement(); //减一
                  } else {
                      v.increment(); //加一
                  }
              }
      
              System.out.println("计数器最后的值为: " + v.getCount()); //获取最后的计数器值
          }
      }
      
      class VisualCounter {
          private int count; //计数器的值
          private int max; //计数器最大的绝对值
          private int N; //计数器最大的操作次数
          private int n; // 当前计数器的次数
      
          //构造方法,初始化N和max
          VisualCounter(int N, int max) {
              this.N = N;
              this.max = max;
          }
      
          /**
           * @Description: 画出计数器的值
           * @Param: n 当前次数
           * @Param: count 当前计数器的值
           * @return: Nothing
           */
          public void my_StdDraw(int n, int count) {
              StdDraw.setXscale(0,N); //设置x的范围
              StdDraw.setYscale(-max, max); //设置y的范围
              StdDraw.setPenRadius(.01); //设置画笔的半径
      
              System.out.println("count =  " + count + " , 第 " + n + "次");
              StdDraw.point(n, count); //画出改点
          }
      
          /**
           * @Description: 计数器加一
           * @Param: Nothing
           * @return: Nothing
           */
          public void increment() {
              //如果当前计数器次数不超过指定的最大操作数,并且计数器的值也不超过指定的最大绝对值则加一
              if (n > N || Math.abs(count + 1)  > max) {
                  n++;
                  System.out.println("count =  " + "  error + " +  "第 " + n + "次");
              } else {
                  n++;
                  count++;
                  my_StdDraw(n,count);
              }
          }
      
          /**
           * @Description: 计数器减一
           * @Param: Nothing
           * @return: Nothing
           */
          public void decrement() {
              //如果当前计数器次数不超过指定的最大操作数,并且计数器的值也不超过指定的最大绝对值则减一
              if (n + 1 > N || Math.abs(count - 1)  > max) {
      //        if (n + 1 > N || Math.abs(count ) - 1 > max) { //非常错误的做法,复习的时候细看!
                  n++;
                  System.out.println("count =  " + count + "  error - "+  "第 " + n + "次");
              } else {
                  n++;
                  count--;
      
                  my_StdDraw(n,count);
              }
          }
      
          public int getCount() {
              return count;
          }
      }
      
      输出:
      
      count =  -1 , 第 1次
      count =  -2 , 第 2次
      count =  -3 , 第 3次
      count =  -4 , 第 4次
      count =  -3 , 第 5次
      count =  -4 , 第 6次
      count =  -3 , 第 7次
      count =  -2 , 第 8次
      count =  -1 , 第 9次
      count =  -2 , 第 10次
      count =  -1 , 第 11次
      count =  0 , 第 12次
      count =  -1 , 第 13次
      count =  0 , 第 14次
      count =  -1 , 第 15次
      count =  0 , 第 16次
      count =  -1 , 第 17次
      count =  0 , 第 18次
      count =  -1 , 第 19次
      count =  0 , 第 20次
      count =  1 , 第 21次
      count =  0 , 第 22次
      count =  -1 , 第 23次
      count =  0 , 第 24次
      count =  1 , 第 25次
      count =  2 , 第 26次
      count =  3 , 第 27次
      count =  2 , 第 28次
      count =  1 , 第 29次
      count =  2 , 第 30次
      count =  1 , 第 31次
      count =  2 , 第 32次
      count =  3 , 第 33次
      count =  2 , 第 34次
      count =  1 , 第 35次
      count =  0 , 第 36次
      count =  -1 , 第 37次
      count =  -2 , 第 38次
      count =  -1 , 第 39次
      count =  -2 , 第 40次
      count =  -1 , 第 41次
      count =  -2 , 第 42次
      count =  -1 , 第 43次
      count =  0 , 第 44次
      count =  -1 , 第 45次
      count =  -2 , 第 46次
      count =  -3 , 第 47次
      count =  -4 , 第 48次
      count =  -5 , 第 49次
      count =  -6 , 第 50次
      count =  -5 , 第 51次
      count =  -6 , 第 52次
      count =  -5 , 第 53次
      count =  -6 , 第 54次
      count =  -5 , 第 55次
      count =  -4 , 第 56次
      count =  -5 , 第 57次
      count =  -6 , 第 58次
      count =  -5 , 第 59次
      count =  -6 , 第 60次
      count =  -7 , 第 61次
      count =  -6 , 第 62次
      count =  -5 , 第 63次
      count =  -4 , 第 64次
      count =  -5 , 第 65次
      count =  -6 , 第 66次
      count =  -5 , 第 67次
      count =  -6 , 第 68次
      count =  -5 , 第 69次
      count =  -6 , 第 70次
      count =  -5 , 第 71次
      count =  -6 , 第 72次
      count =  -7 , 第 73次
      count =  -8 , 第 74次
      count =  -7 , 第 75次
      count =  -8 , 第 76次
      count =  -7 , 第 77次
      count =  -8 , 第 78次
      count =  -9 , 第 79次
      count =  -10 , 第 80次
      count =  -10  error - 第 81次
      count =  -9 , 第 82次
      count =  -10 , 第 83次
      count =  -9 , 第 84次
      count =  -8 , 第 85次
      count =  -7 , 第 86次
      count =  -6 , 第 87次
      count =  -5 , 第 88次
      count =  -4 , 第 89次
      count =  -5 , 第 90次
      count =  -4 , 第 91次
      count =  -3 , 第 92次
      count =  -2 , 第 93次
      count =  -1 , 第 94次
      count =  -2 , 第 95次
      count =  -3 , 第 96次
      count =  -2 , 第 97次
      count =  -3 , 第 98次
      count =  -2 , 第 99次
      count =  -3 , 第 100次
      计数器最后的值为: -3

      《算法第四版》课后练习题1.2.10答案

    • 0
    • 0
    • 0
    • 2.3k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: