2021-07-21 尚硅谷_流程控制

Math.random(): [0.0, 1.0): 左闭右开
公式:[a, b]: (int)(Math.random() * (b - a + 1) + a)

1、if...else...

  • else:就近匹配原则。

针对条件表达式:

  1. 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
  2. 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
  3. 如果多个条件表达式之间有包含关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。

2、switch-case

  • switch结构中的表达式,只能是如下的6种数据类型之一:byteshortcharint枚举(JDK5.0新增)、String(JDK7.0新增)。
  • case之后只能声明常量,不能声明范围。
  • default相当于if-else结构中的elsedefault结构是可选的,而且位置是灵活的。

说明:我们写分支结构时,当发现既可以使用switch-case(同时,switch中表达式的取值情况不太多),又可以使用if-else时,我们优先选择使用switch-case
原因:switch-case执行效率稍高。

3、循环结构的4个要素

① 初始化条件
② 循环条件 ---> 是boolean类型
③ 循环体
④ 迭代条件

4、for循环

  • break:跳出循环。
for (int i = 0; i <= 5; i++) {
  System.out.prntln("Hello World!");
}
// i: 在for循环内有效,出了for循环就失效了。
System.out.prntln(i);

5、while循环

  • 说明:写while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环!
  • for循环和while循环是可以相互转换的。

示例:遍历100以内的偶数

int i = 1;
while(i <= 100){
  if (i % 2 === 0) {
    System.out.println(i);
  }
  // 迭代条件
  i++;
}

6、do-while

  • 说明:do-while循环至少会执行一次循环体!
    示例:遍历100以内的偶数
int num = 1;
do {
   if (num % 2 === 0) {
     System.out.println(num);
   }
   // 迭代条件
   i++;
} while(num <= 100);

7、无限循环

最简单的“无限”循环格式:while(true)for(;;),无限循环存在的原因是并不知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束。

题目:
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。

import java.util.Scanner;
class ForWhileTest {
  public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    int positiveNumber = 0; // 记录正数的个数
    int negativeNumber = 0; // 记录负数的个数
    while (true) {
      int number = scan.nextInt();
      if (number > 0) {
        positiveNumber++;
      } else if (number < 0) {
        negativeNumber++;
      } else {
        // 一旦执行break,跳出循环
        break;
      }
    }
  }
}

8、嵌套循环

示例:100以内的所有质数。(素数,只能被1和它本身整除的自然数。)

// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值为false。
for(int i = 2; i <= 100; i++) {
  // 优化二:j < i 改成 j <= Math.sqrt(i),对本身是质数的自然数是有效的。
  for (int j = 2; j <= Math.sqrt(i); j++) {
    if (i % j === 0) { // i被j除尽
      isFlag = false;
      break; // 优化一:只对本身非质数的自然数是有效的。
    }
  }
  if (isFlag === true) {
    System.out.println(i);
  }
  // 重置isFlag
  isFlag = true;
}

// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end= System.currentTimeMillis();
System.out.pringln("所花费的时间为:" + (end - start));

9、break和continue关键字的使用

不同点:

  • break:在循环中使用时,作用是结束当前循环。
  • continue:在循环中使用时,作用是结束当次循环。

相同点:
关键字后面不能声明执行语句。

  • break默认跳出包裹此关键字最近的一层循环。
  • 带标签的break
label: for (int i = 1; i <= 4; i++) {
  for (int j = 1; j <= 10; j++) {
    if (j % 4 === 0) {
      break label; // 结束指定标识的一层循环结构
    }
  }
}
  • 带标签的continue
label: for (int i = 1; i <= 4; i++) {
  for (int j = 1; j <= 10; j++) {
    if (j % 4 === 0) {
      continue label; // 结束指定标识的一层循环结构的当次循环
    }
  }
}

示例:100以内的所有质数。(素数,只能被1和它本身整除的自然数。)

int count = 0; // 统计质数的个数
// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
label: for(int i = 2; i <= 100; i++) {
  // 优化二:j < i 改成 j <= Math.sqrt(i),对本身是质数的自然数是有效的。
  for (int j = 2; j <= Math.sqrt(i); j++) {
    if (i % j === 0) { // i被j除尽
      continue label;
    }
  }
  // 能执行到此步骤的,都是质数
  count++;
}

// 获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end= System.currentTimeMillis();
System.out.pringln("所花费的时间为:" + (end - start));

10、return的使用

  • return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
  • breakcontinue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。

你可能感兴趣的:(2021-07-21 尚硅谷_流程控制)