• 中文
    • 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.6k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: