[读书笔记]Java编程思想第4章之控制执行流程

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[读书笔记]Java编程思想第4章之控制执行流程相关的知识,希望对你有一定的参考价值。

  1. 注意区分逗号操作符和逗号分隔符:用作分隔符时用来分隔函数的不同参数;Java里唯一用到逗号操作符的地方就是for循环的控制表达式,可以在for语句内定义多个变量,但是它们必须具有相同的类型。
  2. Java编译器生成它自己的“汇编代码”,但是这个代码是运行在Java虚拟机上的,而不是直接运行在CPU硬件上。
  3. 一般的continue会退回最内层循环的开头(顶部),并继续执行;带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环;一般的break会中断并跳出当前循环;带标签的break会中断并跳出标签所指的循环;在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue。

练习1: 写一个程序,打印从1到100的值。

package thinkinjava.charpenter4;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 9:41
 */
public class Test1 {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            System.out.print(i+" ");
            if(i%10==0){
                System.out.println("\\n");
            }
        }
    }
}

练习2: 写一个程序,产生25个int类型的随机数。对于每一个随机数,使用if-else语句来将其分类为大于、小于,或等于紧随它而随机生成的数。

package thinkinjava.charpenter4;

import java.util.Random;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 9:45
 */
public class Test2 {
    public static void main(String[] args) {
        int firstNum, secondNum;
        Random random = new Random();

        /**
         * Generate the first random number
         */
        firstNum = random.nextInt(100);

        /**
         * Generate the remaining 24 random numbers, then compare them.
         */
        for (int i = 1; i < 25; i++) {
            secondNum = random.nextInt(100);

            if (firstNum == secondNum) {
                System.out.println(firstNum + " = " + secondNum);
            } else if (firstNum > secondNum) {
                System.out.println(firstNum + " > " + secondNum);
            }else{
                System.out.println(firstNum + " < " + secondNum);
            }

            firstNum = secondNum;
        }
    }
}

练习3: 修改练习2,把代码用一个while无限循环包括起来。然后运行它直至用键盘终端其运行(通常是通过按Ctrl-C)。

package thinkinjava.charpenter4;

import java.util.Random;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 10:07
 */
public class Test3 {
    public static void main(String[] args) {
        int firstNum, secondNum;
        Random random = new Random();

        /**
         * Generate the first random number
         */
        firstNum = random.nextInt(100);

        /**
         * Attention: You should compile and run the source file in the terminal by using javac and java command.
         * When you want to stop it, just press the key Ctrl and C on the keyboard  at the same time.
         */
        while(true) {
            secondNum = random.nextInt(100);

            if (firstNum == secondNum) {
                System.out.println(firstNum + " = " + secondNum);
            } else if (firstNum > secondNum) {
                System.out.println(firstNum + " > " + secondNum);
            }else{
                System.out.println(firstNum + " < " + secondNum);
            }

            firstNum = secondNum;
        }
    }
}

练习4: 写一个程序,使用两个嵌套的for循环和取余操作符(%)来探测和打印素数(只能被其自身和1整除,而不能被其它数字整除的整数)。

package thinkinjava.charpenter4;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 10:18
 */
public class Test4 {
    public static void main(String[] args) {
        for (int i = 2; i <= 100; i++) {
            boolean isPrime = true;

            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    isPrime = false;
                }
            }

            if (isPrime) {
                System.out.print(i + " ");
            }
        }
    }
}

练习5: 重复第3章中的练习10,不要用Integer.toBinaryString()方法,而是用三元操作符和按位操作符来显示二进制的1和0。

第3章 练习10:编写一个具有两个常量值的程序,一个具有交替的二进制位1和0,其中最低有效位为0,另一个也具有交替的二进制位1和0,但是其最低有效位为1(提示:使用十六进制常量来表示时最简单的方法)。取这两个值,用按位操作符以所有可能的方式结合运算它们,然后用Integer.toBinaryString()显示。

package thinkinjava.charpenter4;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 15:54
 */
public class Test5 {
    public static void main(String[] args) {
        int num1 = 1 + 4 + 16 + 64;
        int num2 = 2 + 8 + 32 + 128;

        System.out.println("num1 = " + Integer.toBinaryString(num1));
        System.out.println("num2 = " + Integer.toBinaryString(num2));

        System.out.print("num1 & num2 = ");
        printBinaryString(num1 & num2);

        System.out.print("num1 | num2 = ");
        printBinaryString(num1 | num2);

        System.out.print("num1 ^ num2 = ");
        printBinaryString(num1 ^ num2);

        System.out.print("~num1 = ");
        printBinaryString(~num1);

        System.out.print("~num2 = ");
        printBinaryString(~num2);
    }

    public static void printBinaryString(int num) {
        if (num == 0) {
            System.out.print("0");
        } else {
            /* 统计num二进制补码高位出现的第一个1之前的更高位0的个数 */
            int zerosNums = Integer.numberOfLeadingZeros(num);

            /* 将num左移zerosNums位,现在所有num所有的二进制有效位位于高位,低位全为0 */
            zerosNums <<= num;

            /* 逐个从高位输出num的每一个二进制位的值 */
            for (int i = 0; i < 32 - zerosNums; i++) {
                int bit = (Integer.numberOfLeadingZeros(num) == 0) ? 1 : 0;
                System.out.print(bit);
                num <<= 1;
            }
        }
        System.out.print("\\n");
    }
}

练习6: 修改前两个程序中的两个test()方法,让它们接受两个额外的参数begin和end,这样在测试testval时将判读它是否在begin和end之间(包括begin和end)的范围内。

package thinkinjava.charpenter4;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 16:02
 */
public class Test6 {
    public static void test(int testVal, int begin, int end) {
        if (testVal < begin) {
            System.out.println(testVal + " is before " + begin);
        } else if (testVal >= begin && testVal <= end) {
            System.out.println(testVal + " is between " + begin + " and " + end);
        } else {
            System.out.println(testVal + " is after " + end);
        }
    }

    public static void main(String[] args) {
        test(10, 100, 200);
        test(150, 100, 200);
        test(250, 100, 200);
    }
}

练习7: 修改本章练习7,通过使用break关键词,使得程序在打印到99时退出。然后尝试使用return来达到相同的目的。

package thinkinjava.charpenter4;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 16:33
 */
public class Test7 {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
        
            if (i == 99) {
                break;
            }
             
            System.out.print(i + " ");
            
            if (i % 10 == 0) {
                System.out.print("\\n");
            }
        }
    }
}

练习8: 写一个switch开关语句,为每个case打印一个消息。然后把这个switch放进for循环来测试每个case。先让每个case后面都有break,测试一下会怎样。然后把break删了,看看会怎样。

package thinkinjava.charpenter4;

import java.util.Random;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 17:52
 */
public class Test8 {
    public static void main(String[] args) {
        Random random = new Random();
        int times = random.nextInt(100);

        for (int i = 0; i < times; i++) {
            int number = random.nextInt(10);

            switch (number) {
                case 0:
                    System.out.println("Print zero!");
                    break;
                case 1:
                    System.out.println("Print one!");
                    break;
                case 2:
                    System.out.println("Print two!");
                    break;
                case 3:
                    System.out.println("Print three!");
                    break;
                case 4:
                    System.out.println("Print four!");
                    break;
                case 5:
                    System.out.println("Print five!");
                    break;
                case 6:
                    System.out.println("Print six!");
                    break;
                case 7:
                    System.out.println("Print seven!");
                    break;
                case 8:
                    System.out.println("Print eight!");
                    break;
                case 9:
                    System.out.println("Print nine!");
                    break;
            }
        }
    }
}

练习9: 一个斐波那契数列是由数字1、1、2、3、5、8、13、21、34等等组成的,其中每一个数字(从第三个数字起)都是前两个数字的和。创建一个方法,接受一个整数参数,并显示从第一个元素开始总共由该参数指定的个数所构成的所有斐波那契数字。例如,如果运行java Fibonacci 5 (其中Fibonacci是类名),那么输出应该是1、1、2、3、5。

package thinkinjava.charpenter4;

import java.util.Scanner;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 18:46
 */
public class Test9 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Test9 test9 = new Test9();
        int number = scanner.nextInt();

        test9.fibonacci(number);
    }

    public void fibonacci(int num) {
        int fstNum = 1;
        int secNum = 1;

        System.out.print(fstNum + " " + secNum + " ");

        for (int i = 1; i <= num - 2; i++) {
            int twoSum = fstNum + secNum;
            System.out.print(twoSum + " ");
            fstNum = secNum;
            secNum = twoSum;
        }
    }
}

练习10: 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如下列数字都是“吸血鬼”数字:1260 = 12 * 60; 1827 = 21 * 87; 2187 = 27 * 81; 写一个程序,找出4位数的所有吸血鬼数字。

package thinkinjava.charpenter4;

import java.util.Arrays;

/**
 * @author Spring-_-Bear
 * @version 2021/9/19 20:19
 */
public class Test10 {
    /**
     * Charge an vampire number
     * @param number An four digits number
     * @return true or false
     */
    boolean isVampireNumber(int number) {
        int[] array = {number % 10, number / 10 % 10, number / 100 % 10, number / 1000 % 10};
        int[] temp = new int[4];

        for (int i = 10; i <= 99; i++) {
            int j = number % i;
            if (j == 0) {
                j = number / i;
                temp[0] = i % 10;
                temp[1] = i / 10;
                temp[2] = j % 10;
                temp[3] = j / 10;
                
                Arrays.sort(array);
                Arrays.sort(temp);

                if (Arrays.equals(array, temp)) {
                    return true;
                }
            }
        }

        return false;
    }

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis(); 
        Test10 test10 = new Test10();

        for (int i = 1000; i < 9999; i++) {
            if (test10.isVampireNumber(i)) {
                System.out.print(i + " ");
            }
        }

        long endTime = System.currentTimeMillis(); 
        System.out.println("\\nTime Running:" + (endTime - startTime) + "ms");
    }
}

以上是关于[读书笔记]Java编程思想第4章之控制执行流程的主要内容,如果未能解决你的问题,请参考以下文章

[读书笔记]Java编程思想第5章之初始化与清理

[读书笔记]Java编程思想第3章之操作符

[读书笔记]Java编程思想第8章之多态

[读书笔记]Java编程思想第9章之接口

[读书笔记]Java编程思想第7章之复用类

[读书笔记]Java编程思想第2章之一切都是对象