控制执行流程

  就像有知觉的生物一样,程序必须在执行过程中控制它的世界,并作出选择。在java中,你需要使用执行控制语句来做出选择

  与任何程序设计语言一样,java使用条件语句和循环结构确定控制流程,java的控制流程结构与C和C++的控制流程结构一样,只有很少的例外情况,java没有goto语句,但break可以带标签,可以利用它实现从内层循环跳出的目的(C采用goto实现)。另外,jdk1.5还添加了一种增强的for循环。

  boolean数据类型:boolean数据类型声明一个具有值true(真)或者false(假)的变量。

  如何比较两个值呢?例如:芙蓉姐姐比志玲姐姐漂亮吗?;乌龟跑的比兔子快吗?;篮球和地球一样大吗?,如下表所示,java提供6种关系操作符用于两个值的比较

  用什么类型能表示:

    一件艺术品是真货还是假货

    地铁2号线的首发车时间是5:00吗

    这次考试成绩在90分之上吗

  具有boolean值的变量称为布尔变量,boolean数据类型有两个值:true和false。例如,下面语句将true赋给变量lightsOn:

  boolean lightsOn = true;

 示例:开发一个程序,让一年级学生练习加法。程序随机产生两个一位整数:number1和number2,然后显示" 1 + 5 = ?",当学生在输入答案后,程序给出提示,表明答案是真的还是假的。

package edu.uestc.avatar;

import java.util.Scanner;

public class AdditionQuiz {

    public static void main(String[] args) {
        int number1 = (int)(System.currentTimeMillis() % 10);
        int number2 = (int)(System.currentTimeMillis() / 7 % 10);
        
        System.out.print(number1 + " + " + number2 + " = ");
        Scanner input = new Scanner(System.in);
        int answer = input.nextInt();
        boolean result = number1 + number2 == answer;
        System.out.println(number1 + " + " + number2 + " = " + answer + " is " + result);
        input.close();
    }

}

       分支结构

  所有条件语句都利用条件表达式的真或假来决定执行路径。

  前面的程序显示像“4 + 2 = 6 is true"这样的信息。如果希望显示的消息是"4 + 2 = 6 是正确的",那么必须使用条件语句实现这个小小的改变,java有几种类型的选择语句:单分支if语句、双分支if-else语句、嵌套if语句,多分支if-else语句、switch语句和条件表达式。

if语句

根据条件是真是假,决定执行的路径。

if(布尔表达式){
   //如果布尔表达式为true将执行的语句
}

if(radius >= 0) {
    double area = PI * radius * radius;
    System.out.printf("半径为%f的圆面积为:%f",radius,area);
    System.out.println();//打印一个空行
    System.out.printf("半径为%f的圆周长为:%f",radius,2 * PI * radius);
}

示例:提示用户输入一个整数,如果该数是5的倍数,打印5的倍数;如果该数是2的倍数,打印2的倍数

package edu.uestc.avatar;

import java.util.Scanner;

/**
 * 提示用户输入一个整数,如果该数是5的倍数,打印5的倍数;如果该数是2的倍数,打印2的倍数
 * @author Adan
 *
 */
public class SimpleIfDemo {

    public static void main(String[] args) {
        System.out.print("请输入一个整数:");
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        
        if(num % 5 == 0){
            System.out.println(num + "是5的倍数");
        }
        
        if(num % 2 == 0) {
            System.out.println(num + "是2的倍数");
        }
        
        input.close();
    }

}

if...else语句

if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行

if(布尔表达式){
   //如果布尔表达式的值为true
}else{
   //如果布尔表达式的值为false
}


if(radius >= 0) {
    double area = PI * radius * radius;
    System.out.printf("半径为%f的圆面积为:%f",radius,area);
    System.out.println();//打印一个空行
    System.out.printf("半径为%f的圆周长为:%f",radius,2 * PI * radius);
} else {
    System.out.println("半径不能小于0");
}

嵌套的if语句和多分支的if-else语句

  if 或if-else语句中的语句可以是任意合法的java语句,甚至可以是其它的if-else语句。

if(布尔表达式 1){
   //如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
   //如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
   //如果布尔表达式 3的值为true执行代码
}else {
   //如果以上布尔表达式都不为true执行代码
}

  嵌套的if语句可以实现多重选择。如下程序所示,根据score给出对应的成绩等级。

package edu.uestc.avatar;

import java.util.Scanner;

public class NestingIFDemo {
    public static void main(String[] args) {
        System.out.println("请输入本次测试成绩:");
        Scanner input = new Scanner(System.in);
        float score = input.nextFloat();
        input.close();
        
        if(score >= 90) {
            System.out.println("A");
        } else {
            if(score >= 80) {
                System.out.println("B");
            } else {
                if(score >= 70) {
                    System.out.println("C");
                } else {
                    if(score >= 60) {
                        System.out.println("D");
                    }else {
                        System.out.println("E");
                    }
                }
            }
        }
    }
}

可以使用(推荐使用)多重选择的if语句书写风格(多分支if-else语句),可以避免深度缩进,并使程序易于阅读。

public static void main(String[] args) {
    System.out.println("请输入本次测试成绩:");
    Scanner input = new Scanner(System.in);
    float score = input.nextFloat();
    input.close();
        
    if(score >= 90) 
        System.out.println("A");
    else if(score >= 80) 
        System.out.println("B");
    else if(score >= 70) 
        System.out.println("C");
    else if(score >= 60) 
        System.out.println("D");
    else 
        System.out.println("E");    
}

使用 if,else if,else 语句的时候,需要注意下面几点:

  • if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
  • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
  • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。

常见错误

常见错误1:忘记必要的括号

if(radius >= 0)

  area = radius* radius * PI;

  System.out.println(area);

如果块中只有一条语句,就可以忽略花括号,但是,多条语句括在一起时,{}是不能省的

常见错误2:在if行出现错误的;号

 示例:

package edu.uestc.avatar;

import java.util.Scanner;

/**
 * 程序生成两个10以内的随机整数,完成减法运算,确保被减数大于减数
 * 可以使用Math.random()来产生一个0.0---1.0之间的随机double数(不包括1)  [0,1)
 * @author Adan
 *
 */
public class SubtractionQuiz {
    public static void main(String[] args) {
        //产生两个10以内的随机整数
        int number1 = (int)(System.currentTimeMillis() % 10);
        int number2 = (int)(Math.random() * 10);
        
        //如果减数>被减数,两者进行交换
        if(number2 > number1) {
            int temp = number1;
            number1 = number2;
            number2 = temp;
        }
        
        System.out.print(number1 + " - " + number2 + " = ");
        Scanner input = new Scanner(System.in);
        int answer = input.nextInt();
        input.close();
        
        if(number1 - number2 == answer) {
            System.out.println("回答正确");
        } else {
            System.out.println("回答错误," + number1 + " - " + number2 + " = " + (number1 - number2));
        }
    }
}

逻辑操作符

package edu.uestc.avatar;

public class LogicOperatorDemo {
    public static void main(String[] args) {
        //逻辑非 !
        int age = 24;
        int weight = 98;
        System.out.println(!(age >= 18));
        System.out.println(!(weight == 100));
        
        /**
         * &&和&
         *     相同点:两者都可以进行逻辑与运算(多个条件同时满足结果为true)
         *  不同点:
         *      && 具有短路运算,而&不具备短路运算,作逻辑与运算时,建议使用&&
         *      &可以进行位运算
         */
        boolean ret =  age > 18 && weight < 120;
        boolean ret1 =  age > 18 & weight < 120;
        
        System.out.println(ret + "====" + ret1);
        System.out.println(age > 25 && 10 / 0 == 0);
        //System.out.println(age > 25 & 10 / 0 == 0);
        System.out.println(Integer.toBinaryString(10));
        System.out.println(Integer.toBinaryString(20));
        System.out.println(10 & 20);
        
        /**
         * ||和|
         *     相同点:两者都可以进行逻辑或运算(1个条件为true结果为true)
         *     不同点:
         *         ||具有短路运算,而|不具备短路运算,作逻辑或运算时,建议使用||(前面只有有一个条件为true,整个结果即为true,后续表达式不再进行运算)
         *         |可以进行位运算 
         */
        System.out.println(age < 25 || weight > 100);//true
        System.out.println(age < 25 | weight > 100);//true
        
        System.out.println(10 | 20);
        
        /**
         * 了解
         * 异或运算: ^
         *         true ^ true ====> false
         *         false ^ false ====> false
         *         true ^ false ====> true
         * 也可以进行位运算
         */
        
        System.out.println(age < 25 ^ weight > 100);//true
        System.out.println(age < 25 ^ weight < 100);//false
        System.out.println(10 ^ 20); //30
    }
}

示例:判定闰年

package edu.uestc.avatar;

import java.util.Scanner;

/**
 * 如果某年能够被4整除但是不能被100整除,或者可以被400整除,那么这一年即为闰年
 * boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
 * @author Adan
 *
 */
public class LeapYear {
    public static void main(String[] args) {
        System.out.print("请输入一个年份:");
        Scanner input = new Scanner(System.in);
        int year = input.nextInt();
        input.close();
        
        boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
//        if(isLeapYear) {
//            System.out.println(year + "是闰年");
//        }else {
//            System.out.println(year + "不是闰年");
//        }
        
        //三目运算符     条件表达式 ? 为true时执行 : 为else时执行
        System.out.println(year + (isLeapYear ? "是" : "不是") + "闰年");
    }
}

示例:彩票

package edu.uestc.avatar;

import java.util.Scanner;

/**
 * 程序随机生成一个两位数,提示用户输入一个两位数:按照下面的规则判定用户是否中奖
 *   1 用户输入匹配彩票的实际顺序,奖金为10000
 *   2 用户输入匹配彩票的每一个数字,奖金为3000
 *   3 用户输入匹配彩票的一个数字,奖金为1000
 * @author Adan
 *
 */
public class Lottery {
    public static void main(String[] args) {
        int lottery = (int)(Math.random() * 100);
        System.out.print("请输入两位数:");
        Scanner input = new Scanner(System.in);
        int guess = input.nextInt();
        
        //拆分拆票的每一位
        int lotteryDigit1 = lottery / 10;
        int lotteryDigit2 = lottery % 10;
        
        //拆分拆票的每一位
        int guessDigit1 = guess / 10;
        int guessDigit2 = guess % 10;
        
        System.out.println("本期中奖号码:" + lottery);
        if(lottery == guess)
            System.out.println("奖金为10000");
        else if(lotteryDigit1 == guessDigit2 && lotteryDigit2 == guessDigit1)
            System.out.println("奖金为3000");
        else if(lotteryDigit1 == guessDigit1
                || lotteryDigit1 == guessDigit2
                || lotteryDigit2 == guessDigit1
                || lotteryDigit2 == guessDigit2)
            System.out.println("奖金为1000");
        else
            System.out.println("很遗憾,再接再厉");
        
        input.close();
    }
}

介绍switch语句的语法格式

switch case 语句有如下规则:

  • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。

  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。

  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。

  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。

public class SwitchDemo {

    public static void main(String[] args) {
        //int day = (int)(Math.random() * 7);
        int day = 1;
        switch(day) {
        case 0:
            System.out.println("星期日");
            break;
        case 1:
            System.out.println("星期一");
        case 2:
            System.out.println("星期二");
        case 3:
            System.out.println("星期三");
        case 4:
            System.out.println("星期四");
        case 5:
            System.out.println("星期五");
            break;
        case 6:
            System.out.println("星期六");
            break;
        default:
            System.out.println("非法值");
        }
    }

}

jdk14后的switch更新、switch表达式

package edu.uestc.avatar;

import java.util.Scanner;

/**
 * 从jdk14开始,对switch进行了更新
 * switch(switch表达式){
 *   case 值1 -> 语句组1;
 *   case 值2 -> 语句组2;
 *   ....
 *   default -> 默认语句组;//默认语句可省略
 * }
 * 其中匹配到某个case后,执行对应的case语句组,然后进行break退出
 * 
 * switch表达式
 * 数据类型 变量名 = switch(switch表达式){
 *    case 值1 -> 语句组1;
 *    case 值2 -> 语句组1;
 *    ....
 *    default -> 默认语句组;//default不能省略
 * };
 * 语句组中的最后一条语句的值作为返回值
 */
public class SwitchUpdate {
    public static void main(String[] args) {
        System.out.print("请输入一个年份:");
        Scanner input = new Scanner(System.in);
        int year = input.nextInt();
        input.close();
        
        switch (year % 12) {
            case 0 -> System.out.println("monkey");
            case 1 -> System.out.println("rooster");
            case 2 -> System.out.println("dog");
            case 3 -> System.out.println("pig");
            case 4 -> System.out.println("mouse");
            case 5 -> System.out.println("ox");
            case 6 -> System.out.println("tiger");
            case 7 -> System.out.println("rabbit");
            case 8 -> System.out.println("dragon");
            case 9 -> System.out.println("snake");
            case 10 -> System.out.println("horse");
            case 11 -> System.out.println("sheep");
            
            //default ->System.out.println();
        }
        System.out.println("===========================");
        
        String zodic = switch(year % 12) {
            case 0 -> "monkey";
            case 1 -> "rooster";
            case 2 -> "dog";
            case 3 -> "pig";
            case 4 -> "mouse";
            case 5 -> "ox";
            case 6 -> "tiger";
            case 7 -> "rabbit";
            case 8 -> "dragon";
            case 9 -> "snake";
            case 10 -> "horse";
            case 11 -> "sheep";
            default -> "非法生肖"; //所有的case语句匹配不上,必须有一个默认值作为值进行返回
        };
        System.out.println(year + " => " + zodic);
    }
}

if-else语句和switch语句的区别及开发中的取舍

 

编程练习题:

1、利用公式计算一元二次方程的两个根,编写程序,提示用户输入a,b,c的值,并且显示结果(两个根;一个根;无解)

 

2、随机产生 1和12之间整数的程序,并且根据数字1,2,3…12,显示相应的英文月份:January,February,…December。

 

3、提示用户输入代表今天日期的数字(周日为0,周一为1,……周六为6)。同时,提示用户输入一个今天之后的天数作为代表将来某天的数字,显示这天是星期几

 

4、提示用户输入一个年份和月份,然后显示这个月的天数。

 

5、完成石头剪刀布小游戏或者自己做一个类似的小游戏,把相关知识点运用上(石头可以用0表示,剪刀可以用1表示,布可以用2表示)

 

6、程序随机产生一个整数0(硬币的正面)和1(硬币的反面),提示用户猜测硬币的正反面

7、编程实现已知某人的工资(要求输入),求他应该缴纳的个人所得税以及最后得到的工资。

个人所得税计算方法计算方法 :

全月应纳税所得额 =工资薪金所得-3500

应纳税额 = 应纳税所得额 *税率-速算扣除数

级数    全月应纳税所得额           税率(%)  速算扣除数

1       不超过500元的                 5           0

2       超过500元至2000元的部分     10          25

3       超过2000元至5000元的部分     15          125

4       超过5000元至20000元的部分    20          375

5       超过20000元至40000元的部分   25          1375

6       超过40000元至60000元的部分   30          3375

7       超过60000元至80000元的部分   35          6375

8       超过80000元至100000元的部分  40          10375

9       超过100000元的部分            45         15375

 

8.编写程序,给定一个学生成绩,给出相应等级:

90~100 优秀

80~89 良好

70~79 中等

60~69 及格

0~59 不及格

使用两种作法

 

9.从键盘接收一个名次(int)  使用switch-case作如下分支

  名次为1   奖IPHONE8

  名次为2   奖IPHONE7

  名次为3   奖IPHONE6

  名次为 4   奖IPHONE5

  其它名次   努力吧,少年

10. 编写程序,判断给定的某个年份是否是闰年。

闰年的判断规则如下:

   (1)若某个年份能被4整除但不能被100整除,则是闰年。

      (2)若某个年份能被400整除,则也是闰年。

11、提示用户输入一个三位整数,判断该数是否为一个回文数(从左到右及从右到左都是一样的为回文数)

12、模拟从一副52张的牌中选择一张牌,程序显示牌的大小(Ace、2、3、4、5、6、7、8、9、10、Jack、Queen、King)及花色(♠,,♣,

posted @ 2021-10-27 14:14  Tiger-Adan  阅读(1062)  评论(0编辑  收藏  举报