选择结构和分支结构

一、if结构

1.1 基本if结构

语法:

if(条件){

// 代码块

}

当条件为真时,会执行代码块。

  1. // 基本if
  2. public class Demo4 {
  3. public static void main(String[] args) {
  4. int hp = 550;
  5. int count = 5;
  6. // 如果我方人数大于3,并且敌方血量低于200,抢人头
  7. if(count > 3 && hp < 200) {
  8. System.out.println("抢人头");
  9. }
  10. }
  11. }

1.2 if-else结构

语法:

if(条件){

// 代码块1

}else{

// 代码块2

}

// 流程:先判断条件是否成立,如果成立,则执行代码块1,否则执行代码块2

// if-else结构
public class Demo5 {
    public static void main(String[] args) {
        int num = 20;
        if(num % 2 == 0) {
            System.out.println("是偶数");
        }else {
            System.out.println("是奇数");
        }

        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个年份:");
        int year = input.nextInt();
        if(year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
            System.out.println("是闰年");
        }else {
            System.out.println("不是闰年");
        }
    }
}

1.3 多重if结构

语法:

if(条件1){

// 代码块1

}else if(条件2){

// 代码块2

}else if(条件3){

// 代码块3

}else{

// 代码块4

}

// else if可以有任意个。

// 流程:如果条件1成立,则执行代码块1,结束;否则判断条件2是否成立,如果成立则执行代码块2,否则判断条件3是否成立,如果成立则执行代码块3,否则执行代码块4

注意:当有多个条件都成立时,会执行最上面一个成立的条件分支。

// 多重if结构
public class Demo6 {
    public static void main(String[] args) {
        int count = 3;
        if(count > 2) {
            System.out.println("越塔强杀");
        }else if(count == 3) {
            System.out.println("拿小龙");
        }else if(count == 4) {
            System.out.println("上高地");
        }else if(count == 5) {
            System.out.println("拿大龙");
        }else {
            System.out.println("安心补刀");
        }


        int score = 75;
        if(score >= 80) {
            System.out.println("成绩优秀");
        }else if(score >= 60) {
            System.out.println("成绩及格");
        }else {
            System.out.println("成绩不及格");
        }
    }
}

1.4 嵌套if结构

语法:

if(条件1){

// 代码块1

if(条件2){

 // 代码块2

}

}

// 流程:按照前面的普通的if流程一步步往下执行

// 嵌套if结构
public class Demo7 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请选择阵营:1、联盟  2、部落");
        int n1 = input.nextInt();
        if(n1 == 1) {
            // 选择了联盟
            System.out.println("选择了联盟");
            System.out.println("请选择种族:1、人族  2、精灵");
            int n2 = input.nextInt();
            if(n2 == 1) {
                System.out.println("选择了人族");
                System.out.println("请选择职业:1、战士  2、法师");
                int n3 = input.nextInt();
                if(n3 == 1) {
                    System.out.println("选择了战士");
                }else {
                    System.out.println("选择了法师");
                }
            }else {
                System.out.println("选择了精灵");
            }
        }else if(n1 == 2) {
            // 选择了部落
            System.out.println("选择了部落");
        }else {
            System.out.println("没有此选项");
        }
    }
}

二、switch结构

2.1 基本用法

语法结构:相当于if的多重if结构,但是只能匹配等值,不能使用大于、小于这些判断,而且只能判断以下类型:byte、short、int、char、String(JDK1.7+)

public class Demo8 {
    public static void main(String[] args) {
        int state = 2;
        if(state == 1) {
            System.out.println("冰冻状态");
        }else if(state == 2) {
            System.out.println("中毒状态");
        }else if(state == 3) {
            System.out.println("流血状态");
        }else if(state == 4) {
            System.out.println("眩晕状态");
        }else {
            System.out.println("其他状态");
        }
    }
}

将上面的结构使用switch来编写:

// switch结构
public class Demo8 {
    public static void main(String[] args) {
        int state = 2;
        // fall-down
        switch(state) {
            case 1: // 判断state == 1
                System.out.println("冰冻状态");
                // 可以写多行,不需要大括号
//                System.out.println("1111");
//                System.out.println("222");
                break;
            case 2:
                System.out.println("中毒状态");
                break;
            case 3:
                System.out.println("流血状态");
                break;
            case 4:
                System.out.println("眩晕状态");
                break;
            default: // 相当于else
                System.out.println("其他状态");
                break;
        }
    }
}

注意:当case中没有写break时,会继续向下执行,而且不会考虑case匹配,叫做fall-down

case 时不能有相同的值。

// switch结构合并case
// 输入一个月份,判断该月有几天
public class Demo9 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个月份:");
        int month = input.nextInt();
        int day = 0;
        switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 2:
            day = 28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        default:
            break;
        }
        System.out.println(day);
    }
}
// 输入年、月、日,输出该日期是当年的第几天
// switch结构
public class Demo10 {
    // 输入年、月、日,输出该日期是当年的第几天
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个年份:");
        int year = input.nextInt();
        System.out.println("请输入一个月份:");
        int month = input.nextInt();
        System.out.println("请输入一个日期:");
        int day = input.nextInt();
        int days = 0; // 最终计算天数的结果
        switch (month) {
        case 12: 
            days += 30; // 加11月的天数
        case 11:  
            days += 31; // 加10月的天数...
        case 10:
            days += 30;
        case 9: 
            days += 31;
        case 8: 
            days += 31;
        case 7:
            days += 30;
        case 6: 
            days += 31;
        case 5: 
            days += 30;
        case 4:
            days += 31;
        case 3: 
            if(year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
                days += 29;
            }else {
                days += 28;
            }
        case 2: 
            days += 31;
        case 1:
            days += day; // 加上当月的天数
            break;
        default:
            break;
        }
        System.out.println(year + "年" + month + "月" + day + "日是当年的第"+days+"天");
    }
}

三、局部变量

  • 局部变量应该先赋值,后使用。
  • 局部变量的作用域范围:在该变量对应的一对大括号中,从该变量定义的行开始,后面都其适用范围
  • 局部变量在重合的作用域中,不能同名,会出现变量名冲突。
// 作用域范围
public class Demo11 {
    // 局部变量的作用域范围:在该变量对应的一对大括号中,从该变量定义的行开始,后面都其适用范围
    public static void main(String[] args) {
        int a = 5;
        int m = 5;
        if(m > 2) {
            int n = 10;
            if(m > 2) {
                System.out.println(n);
            }
        }else {
            int n = 4;
            System.out.println(a); // 使用外面的a
        }
//        System.out.println(n);// 报错
    }
}