002-流程控制语句

2.1 顺序结构

顺序结构就是程序从上到下逐行地执行。表达式语句都是顺序执行的。并且上一行对某个变量的修改对下一行会产生影响。

2.2 分支语句

2.2.1 if 条件判断结构

2.2.1.1 单分支条件判断
  1. 格式

    if (条件表达式) {
        // 代码;
    }
    
  2. 执行流程

2.2.1.2 双分支条件判断
  1. 格式

    if (条件表达式) {
        // 代码1;
    } else {
        // 代码2;
    }
    
  2. 执行流程

2.2.1.3 多分支条件判断
  1. 格式

    if (条件表达式1) {
        // 代码1;
    } else if (条件表达式2) {
        // 代码2;
    }
    ...
    } else if (条件表达式n) {
    	// 代码n;
    } else {
        // 代码n+1;
    }
    
  2. 执行流程

2.2.2 switch 选择结构

  1. 格式

    switch (表达式) {
        case 常量值1;
            // 语句1;
            [break;]
        case 常量值2;
            //语句2;
            [break;]
        	...
        [
        default:
            //语句n;
            break;
        ]
    }
    
  2. 执行流程

  3. 注意事项

    1. 表达式类型只能是 byte 、short、int、char、Stirng、枚举。
    2. case 给出的值不允许重复,且只能是字面量,不能是变量。
    3. 一个 case 对应一个 break,如果没有写 break,会造成 case 击穿,但 case 击穿在一些特定的场合也能运用到,例如:多个 case 的内容一样,我们就可以使用 case 击穿简化代码。
2.2.2.1 case 击穿

在 switch 语句中,如果 case 的后面不写 break,将出现穿透现象,也就是一旦 匹配成功,不会在判断下一个 case 的值,直接向后运行,直到遇到 break 或者整个 switch 语句结束,执行终止。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个[0,10]的整数:");
    int num = sc.nextInt();
    switch (num) {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
            System.out.println("差评~");
            break;
        case 8:
        case 9:
            System.out.println("良好");
            break;
        case 10:
            System.out.println("优秀");
            break;
        default:
            System.out.println("您输入的整数有误,请重新输入区间为[0,10]的整数~");
            break;
    }
}
public static void main(String[] args) {
    int a = 7;
    switch (a++) { // 第一步:a = 7
        case 8:
            a *= 2;
        default: // 第二步:a = 8
            a += 2.5; // 第三步:a = 10
        case 9:
            ++a; // 第四步:a = 11
        case 10:
            a--; // 第五步:a = 10
            break;
        case 11:
            a %= 2;
    }
    System.out.println(a);
}

2.2.3 switch 和 if 的比较

  • 凡是使用 switch-case 的结构都可以转换为 if-else 结构。反之,不成立。
  • 当前条件是区间的时候,应该使用 if 分支结构;当条件是与一个一个的值比较的时候,switch 分支更合适。

2.3 循环语句

2.3.1 for 循环

  1. 格式

    for (①初始化部分; ②循环条件部分; ④迭代部分) {
    	③循环语句
    }
    
  2. 执行流程

    ① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> … -> ② 判断为 false,则循环结束。

// 水仙花数例子
public static void main(String[] args) {
    int count = 0;
    for (int i = 100; i < 1000; i++) {
        int ge = i % 10;
        int shi = i / 10 % 10;
        int bai = i / 100 % 10;
        if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i){
            count ++;
            System.out.println(i);
        }
    }
    System.out.println("水仙花数个数为:" + count);
}

2.3.2 while 循环

  1. 格式

    ①初始化部分;
    while (②循环条件) {
        ③循环语句;
        ④迭代部分;
    }
    
  2. 执行流程

    ① -> ② -> ③ -> ④ -> ② -> ③ -> ④ - >② -> ③ -> ④ -> … -> ② 判断为 false,则循环结束。

public static void main(String[] args) {
    int sum = 0, i = 1;
    while (i <= 50) {
        if (i % 2 == 0) {
            sum += i;
        }
        i++;
    }
    System.out.println("1~50的偶数和为:" + sum);
}

2.3.3 do-while 循环

  1. 格式

    ①初始化部分;
    do{
        ③循环体部分
        ④迭代部分
    }while(②循环条件部分);
    
  2. 执行流程

    ① -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> … -> ②

public static void main(String[] args) {
    int count = 0, i = 1;
    do {
        if (i % 2 == 0 && i % 3 == 0) {
            count++;
        }
        i++;
    } while (i <= 100);
    System.out.println("1~100之间能同时被2和3整除的个数为:" + count);
}

2.3.4 对比三种循环结构

  1. 三种循环的异同点

    • 相同点:

      都可以执行某一段代码。

    • 不同点:

      for、while 都是先判断后执行;

      do-while 先执行一次,后判断。

  2. 使用场景:

    • for:明确循环次数的;
    • while:循环次数不明确;
    • do-while:一般不是使用。

2.3.5 “死” 循环

 // 最简单"无限"循环格式
 // 格式一
 while (true) {}
 
 // 格式二
 for (;;) {}
 
 // 格式三
 do {
 } while (true);
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (true) {
        System.out.println("请输入用户账号:");
        int user = sc.nextInt();
        System.out.println("请输入用户密码:");
        int password = sc.nextInt();
        if (user == 123 && password == 456) {
            System.out.println("登录成功~");
            break;
        }
        System.out.println("登录失败~");
    }
}

2.3.6 嵌套循环

for 循环、while 循环、doWhile 循环都可以相互嵌套,并无特殊要求。

// 九九乘法表例子
public static void main(String[] args) {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            System.out.print(i + "*" + j + "=" + i * j + "\t");
        }
        System.out.println();
    }
}

2.4 跳转空值 break、continue

  • break:跳出并结束当前循环的执行,如果有两个循环嵌套,结束离 break 最近的那个循环。

  • continue:跳出当前循环的当次执行,直接进入循环的下一次执行。

public static void main(String[] args) {
    for (int i = 1; i <= 5; i++) {
        if (i % 2 == 0) {
            break;
        }
        System.out.print(i + "\t"); // 1
    }
    System.out.println();
    for (int j = 1; j <= 5; j++) {
        if (j % 2 == 0) {
            continue;
        }
        System.out.print(j + "\t"); // 1 3 5
    }
}

2.4.1 标签使用

// break 语句用于终止某个语句块的执行
{
	…… 
	break; 
	…… 
}
// break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块 
label1:{……  
	label2:{…… 
			continue labe1;
		label3:{…… 
				break label2; 
		} 
	} 
}
public static void main(String[] args) {
    // 找到高三二班
    label:
    for (int i = 1; i <= 3; i++) {
        System.out.println("高" + i);
        for (int j = 1; j <= 3; j++) {
            if (i == 3 && j == 2) {
                break label;
            }
            System.out.println("\t高" + i + "-" + j + "班");
        }
    }
}

2.5 获取随机数 Random / random()

2.5.1 通过 Random 类的方法

// 公式1:
r.nextInt(max - min + 1) + min; // [min, max]

// 公式2【JDK17】:
r.nextInt(min, max + 1); // [min, max]
public static void main(String[] args) {
    Random r = new Random();
    // 生成一个[-2^23, (2^23)-1)之间的整数
    System.out.println(r.nextInt());
    // 生成一个[0, 10)之间的整数
    System.out.println(r.nextInt(10));
    // 生成一个[1, 10]之间的整数
    System.out.println(r.nextInt(10) + 1);

    // 生成一个[1024,9024]之间的整数
    // 方式一:r.nextInt(max - min + 1) + min
    System.out.println(r.nextInt(8001) + 1024);
    // 方式二:r.nextInt(min, max + 1)
    System.out.println(r.nextInt(1024, 9025));
}

2.5.2 通过 Math 类的 random() 方法

  1. Math 类的 random()的调用,会返回一个[0,1)范围的一个 double 型值。

  2. 如何获取[min, max]范围内的随机整数呢?

    (int)(Math.random() * (max - min + 1)) + min
    
    Math.random() * 100 // 获取 [0,100) 范围内的随机整数 
    (int)(Math.random() * 100) // 获取 [0,100) 范围内的随机整数 
    (int)(Math.random() * 100) + 5 // 获取 [5,105) 范围内的随机整数
    (int) (Math.random() * 17) + 42; // 生成[42,58]的随机数
    

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值