习题1.2.10
编写一个类 VisualCounter,支持加一和减一操作。它的构造函数接受两个参数 N 和 max,其中 N 指定了操作的最大次数,max 指定了计数器的最大绝对值。作为副作用,用图像显示每次计数器变化后的值。
要点分析
1. Counter
在《算法第四版》课后练习题1.2.9答案 中,我们曾经提到过Counter类,但是它只有加一的操作,而本题需要我们自己实现一个Counter类并支持加一和减一的操作,然后再编写一个用例。关于这个测试用例,有很多种实现方法实现,我们可以用Random类,随机生成一个0~N的数字,是偶数就加一,是奇数就减一
2. StdDraw
因为本题要用图像显示每次计数器变化后的值,所以要用到StdDraw类的相关方法(课本第27页),标准绘图库的静态控制方法的API如下:
参考答案
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
请登录之后再进行评论