程序流程控制

  1. 顺序结构
  2. 分支结构
  3. 循环结构

输入 Scanner

  1. 具体步骤

    1. 导包:import java.util.Scanner;
    2. Scanner 的实例化:Scanner scan = new Scanner(System.in);
    3. 调用 Scanner 类的相关方法(next() / nextXxx()),来获取指定类型的变量
  2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1.导包:import java.util.Scanner;
import java.util.Scanner;

public class ScannerTest {
public static void main(String[] args) {
//2.Scanner的实例化
Scanner scan = new Scanner(System.in);

//3.调用Scanner类的相关方法
System.out.println("请输入姓名:");
String name = scan.next();
System.out.println(name);

System.out.println("请输入你的芳龄:");
int age = scan.nextInt();
System.out.println(age);

System.out.println("请输入");
double weight = scan.nextDouble();
System.out.println(weight);

System.out.println("你是否相中我了呢?(true/false)");
boolean isLove = scan.nextBoolean();
System.out.println(isLove);

//对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串
System.out.println("请输入你的性别:(男/女)");
String gender = scan.next();
char genderChar = gender.charAt(0);//获取索引为0位置上的字符
System.out.println(genderChar);
}
}

3. Tip:

需要根据相应的方法,来输入指定类型的值。
如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchException,导致程序终止。

1. 分支结构(if——else)

1. 三种结构

第一种:

1
2
3
if(条件表达式){
执行表达式
}

第二种:二选一

1
2
3
4
5
if(条件表达式){
执行表达式1
}else{
执行表达式2
}

第三种:n 选一

1
2
3
4
5
6
7
8
9
10
11
if(条件表达式){
执行表达式1
}else if(条件表达式){
执行表达式2
}else if(条件表达式){
执行表达式3
}
...
else{
执行表达式n
}

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class IfTest {
public static void main(String[] args) {
int heartBeats = 67;
if(heartBeats < 60 || heartBeats > 100){
System.out.println("需要进一步检查");
}
System.out.println("检查结束");

int age = 23;
if(age < 18){
System.out.println("可以看动画片了");
}else {
System.out.println("可以看大动画片了");
}

if(age < 0){
System.out.println("输入的数据非法");
}else if(age < 18){
System.out.println("青少年模式");
}else if(age < 35){
System.out.println("青壮年模式");
}else if(age < 60){
System.out.println("中年模式");
}else if(age < 120){
System.out.println("老年模式");
}else if(age > 120){
System.out.println("成仙模式");
}
}
}

3. Tip

  1. else 结构是可选的。
  2. 针对于条件表达式:
    1. 如果条件表达式之间没有交集的关系,判断和执行语句声明与在上面还是下面无关。
    2. 如果条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
    3. 如果条件表达式之间有包含的关系,需要将范围小的声明在范围大的上面。否则,范围小的就不会执行了。
  3. if-else 结构是可以相互嵌套的。
  4. if-else 结构中的执行语句只有一行时,对应的{}可以省略的。但是,不建议大家省略。

2. 分支结构(switch-case)

1. 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch(表达式){
case 常量1:
执行语句1;
//break;

case 常量2:
执行语句2;
//break;

...

default:
执行语句n;
//break;

}

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SwitchCaseTest {
public static void main(String[] args) {
String season = "summer";
switch (season){
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
default:
System.out.println("季节输入有误");
break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//从键盘分别输入年、月、日,判断这一天是当年的第几天
import java.util.Scanner;

public class SwitchCaseExer {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入year:");
int year = scan.nextInt();
System.out.println("请输入month:");
int month = scan.nextInt();
System.out.println("请输入day:");
int day = scan.nextInt();

//定义一个变量来保存总天数
int sumDays = 0;
switch(month){
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
sumDays += 29;
}else {
sumDays += 28;
}
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year + month + "月" + day + "日是当年的第" + sumDays + "天");
}
}

3. Tip

  1. 根据 switch 中的值,依次匹配各个 case 中的常量。匹配成功后,则进入相应 case 中。当调用完执行语句以后,则仍然继续向下执行其他 case 结构中的执行语句,直到遇到 break 关键字或此 switch-case 结构末尾结束为止。
  2. break 在 switch-case 结构中,表示遇到此关键字后,就跳出 switch-case 结构
  3. switch 结构中的表达式,只能是如下的 6 种数据类型之一:
    byte 、short、char、int、枚举类型(JDK5.0 新增)、String 类型(JDK7.0 新增)
  4. case 后面只能放常量,不能放范围。(case age > 18:)
  5. break 关键字是可选的。
  6. default:相当于 if-else 结构中的 else。default 结构是可选的,而且位置是灵活的。
  7. 凡是可以使用 switch-case 的结构,都可以用 if-else。反之,不成立。
  8. 我们写分支结构时,当发现既可以使用 switch-case,(而且,switch 中表达式的取值情况不太多),
    又可以使用 if-else 时,我们优先用 switch-case。原因:switch-case 执行效率稍高。

3. 循环结构(for 循环)

1. 结构

1
2
3
4
5
6
7
8
9
10
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件

for(①;②;④){

}

执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

2.java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ForTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++){
System.out.println(i + " hello world");
}

int num = 1;
//abcbcbc
for(System.out.print('a'); num <= 3; System.out.print('c'), num++){
System.out.print('b');
}

System.out.println();

//遍历100以内的偶数,输出所有偶数的和,输出偶数的个数
int sum = 0;
int count = 0;
for (int i = 1; i <= 100; i++) {
if(i % 2 == 0){
//System.out.println(i);
sum += i;
count++;
}
}
System.out.println("总和为:" + sum);
System.out.println("个数为:" + count);
}
}

4. 循环结构(while 循环)

1. 结构

1
2
3
4
5
6
7
8
9
10
11
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件


while(②){
③;
④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class WhileTest {
public static void main(String[] args) {
int i = 2;
while (i <= 100){
if(i % 2 == 0){
System.out.println(i);

}
i++;
}
//循环外,仍然有i
System.out.println(i);//101
}
}

3.Tip

  1. 写 while 循环记得要写迭代条件。一旦丢了,就可能导致死循环,我们要避免出现死循环。
  2. for 循环和 while 循环是可以相互转换的!
    区别:for 循环和 while 循环的初始化条件部分的作用范围不同。

5. 循环结构(do while 循环)

1. 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件


do{
③;
④;

}while(②);

执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class DoWhileTest {
public static void main(String[] args) {
//遍历100以内的偶数,并计算所有偶数的和及偶数的个数
int num = 1;
int sum = 0;
int count = 0;
do {
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
num++;
}while (num <= 100);
System.out.println("总和为:" + sum);
System.out.println("个数为:" + count);

//do-while至少执行一次循环体
int number1 = 10;
while (number1 >10){
System.out.println("while");
number1--;
}

int number2 = 10;
do {
System.out.println("do_while");
number2--;
}while (number2 > 10);
}
}

3. Tip

  1. do-while 循环至少会执行一次循环体!
  2. 开发中,使用 for 和 while 更多一些。较少使用 do-while

6. 最简单“无限” 循环格式

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。

import java.util.Scanner;

public class ForWhileTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

int positiveNumber = 0; //正数的个数
int negativeNumber = 0; //负数的个数


while (true){ //for (;;)
int number = scanner.nextInt();

if(number > 0){
positiveNumber++;
}else if(number < 0){
negativeNumber++;
}else {
break;
}
}
System.out.println("正数: " + positiveNumber);
System.out.println("负数:" + negativeNumber);
}
}

结束方法

  1. 循环条件部分返回 false
  2. 在循环体中,执行 break