Java 程序控制结构
# Java 程序控制结构
# 程序流程控制介绍
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
- 顺序控制
- 分支控制
- 循环结构
# 分支控制 if-else
# 分支控制 if-else 介绍
让程序有选择的的执行,分支控制有三种
- 单分支if
- 双分支 if-else
- 多分支 if-else if -....-else
# 单分支
- 基本语法
if(条件表达式){
执行代码块;(可以有多条语句)
}
2
3
4
5
说明:当条件表达式为ture时,就会执行{}的代码。如果为false,就不执行。特别说明,如果{}中有一条语句时,则可以不写{},但是建议写上{}
public class If01 {
public static void main(String[] args) {
//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁
//则输出 "你年龄大于 18,要对自己的行为负责,送入监狱
Scanner scanner = new Scanner(System.in);
System.out.println("输入你的年龄:");
int age = scanner.nextInt();
if(age>18){
System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱");
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 双分支
- 基本语法
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
2
3
4
5
6
说明:当条件表达式成立,即执行代码块1,否则执行代码块2。如果执行代码块只有一条语句,则{}可以省略,否则,不能省略
public class If02 {
public static void main(String[] args) {
//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁,
// 则输出 "你年龄大于 18,要对自己的行为负责, 送入监狱"。
// 否则 ,输出"你的年龄不大这次放过你了."
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
System.out.println("请输入你的年龄:");
if(age>18){
System.out.println("你年龄大于 18,要对自己的行为负责, 送入监狱");
}else {
System.out.println("你的年龄不大这次放过你了");
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 多分支
- 基本语法
if(条件表达式1){
执行代码块1;
}
else if(条件表达式2){
执行代码块2;
}
...
else{
执行代码块n;
}
2
3
4
5
6
7
8
9
10
特别说明:
- 多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有
- 如果没有else,如果所有的条件表达式都不成立,则默认执行else代码块
public class If03 {
public static void main(String[] args) {
/*
输入保国同志的芝麻信用分:
如果:
信用分为 100 分时,输出 信用极好;
信用分为(80,99]时,输出 信用优秀;
信用分为[60,80]时,输出 信用一般;
其它情况 ,输出 信用 不及格
请从键盘输入保国的芝麻信用分,并加以判断
假定信用分数为 int
*/
Scanner scanner = new Scanner(System.in);
System.out.println("输入保国同志的芝麻信用分(1-100):");
int i = scanner.nextInt();
if(i >=1 && i <= 1) {
if (i == 100) {
System.out.println("信用极好");
} else if (i > 80 && i <= 99) {
System.out.println("信用优秀");
} else if (i > 60 && i <= 80) {
System.out.println("信用一般");
} else {
System.out.println("信用不及格");
}
}else{
System.out.println("信用分在1-100之间,请重新输入");
}
}
}
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
- 思考题
public class If04 {
public static void main(String[] args) {
boolean b=true;
if(b=false){
System.out.println("a");
}else if(b){
System.out.println("b");
}else if(!b){
System.out.println("c");
}else {
System.out.println("d");
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 嵌套分支
# 基本介绍
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外 层分支。老师建议: 不要超过 3 层 (可读性不好)
# 基本语法
if()
if(){
//if-else
}else{
//if-else
}
}
2
3
4
5
6
7
- 应用案例
- 4_10旺季:
- 成人(18-60):60
- 儿童(<18):半价
- 老人(>60):1/3
- 淡季:
- 成人40
- 其他20
使用嵌套分支处理
public class If04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入季节:(1-12)");
int i = scanner.nextInt();
System.out.println("请输入年龄:");
int age =scanner.nextInt();
if(i>=4&&i<=10){
if(age>=18&&age<=60){
System.out.println("旺季成人票为60");
}else if(age<18){
System.out.println("旺季儿童票为30");
}else {
System.out.println("旺季老人票为20");
}
}else {
if(age>=18&&age<=60){
System.out.println("淡季成人票为40");
}else {
System.out.println("淡季其他票为20");
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# switch 分支结构
# 基本语法
# 流程图
# 快速入门
请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
a 表示星期一,b 表示星期二...
根据用户的输入显示相应的信息.要求使用 switch 语句完成代码
public class Switch01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符(a-g):");
char c = scanner.next().charAt(0);
switch (c){
case 'a':
System.out.println("今天星期一");
break;
case 'b':
System.out.println("今天星期二");
break;
case 'c':
System.out.println("今天星期三");
break;
case 'd':
System.out.println("今天星期四");
break;
case 'e':
System.out.println("今天星期五");
break;
case 'f':
System.out.println("今天星期六");
break;
case 'g':
System.out.println("今天星期日");
break;
default:
System.out.println("输入错误,请重新输入");
}
}
}
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
# switch 注意事项和细节讨论
# switch 和 if 的比较
- 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。
- 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广
# for循环控制
基本介绍:听其名而知其意,就是让你的代码可以循环的执行.
# 基本语法
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(可以多条语句);
}
2
3
- 基本说明
- for 关键字,表示循环控制
- for有四要素:(1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
- 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码
- 如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略
# for循环执行流程分析
# 注意事项和细节说明
- 循环条件是返回一个布尔值的表达式
- for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
- 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。
- 习题案例
- 打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和
public class ForExercise {
public static void main(String[] args) {
// 打印 1~100 之间所有是 9 的倍数的整数统计个数 及 总和
int startNum=1;
int endNum=100;
int num=9;
int sum=0;
int count=0;
for (int i=startNum;i<endNum;i++){
if(i%num==0){
sum+=i;
count++;
}
}
System.out.println("1-100之间所有是9的倍数的整数个数为:"+count+"和为:"+sum);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# while循环控制
# 基本语法
循环变量初始化;
while(循环条件){
循环体(语句);
循环变量迭代;
}
2
3
4
5
- while循环也有四要素
- 只是四要素放的位置和for不一样
# while循环执行流程分析
- 使用while打印十次Hello,World!
public class While01 {
public static void main(String[] args) {
int i=0;
while (i<10){
System.out.println("Hello,World!");
i++;
}
System.out.println("i="+i);//10
}
}
2
3
4
5
6
7
8
9
10
11
12
# do...while循环控制
# 基本语法
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
2
3
4
5
- do while 是关键字
- 也有循环四要素, 只是位置不一样
- 先执行,再判断,也就是说,一定会至少执行一次
- 最后 有一个 分号
# do...while 循环执行流程分析
# 注意事项和细节说明
- 循环条件是返回一个布尔值的表达式
- do..while 循环是先执行,再判断, 因此它至少执一次
- 习题案例
如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为止
[System.out.println("老韩问:还钱吗?y/n")] do...while
public class DoWhile01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char answer='\u0000';
//如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为止
do{
System.out.println("老韩使出五连鞭~");
System.out.println("问还钱吗?(y):");
answer = scanner.next().charAt(0);
System.out.println("它的回答是:"+answer);
}while (answer!='y');
System.out.println("李三还钱了");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 多重循环控制
# 介绍
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环[听不懂,走案例]。
设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次
# 习题案例
- 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
- 统计三个班及格人数,每个班有 5 名同学。
public class MulForExercise01 {
public static void main(String[] args) {
//创建 Scanner 对象
Scanner myScanner = new Scanner(System.in);
double totalScore = 0; //累积所有学生的成绩
int passNum = 0;//累积 及格人数
int classNum = 3; //班级个数
int stuNum = 5;//学生
for (int i=0;i<classNum;i++) {
for (int j = 0; j < stuNum; j++){
System.out.println("请输入一个学生的成绩:");
int i1 = myScanner.nextInt();
//当有一个学生成绩>=60, passNum++
if(i1 >= 60) {
passNum++;
}
totalScore += i1;
}
System.out.println("第"+i+"班的平均分为:"+totalScore/stuNum);
}
System.out.println("所有班级的平均分为:"+totalScore/stuNum/classNum);
System.out.println("及格人数为:"+passNum);
}
}
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
- 打印九九乘法表
public class MulForExercise02 {
public static void main(String[] args) {
//打印九九乘法表
for (int i=1;i<=9;i++){
for (int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+" ");
}
System.out.println();
}
}
}
2
3
4
5
6
7
8
9
10
11
# 跳转控制语句-break
# 看下面一个需求
随机生成 1-100 的一个数,直到生成了 97 这个数,看看你一共用了几次?
提示使用 (int)(Math.random() * 100) + 1
思路分析:
循环,但是循环的次数不知道. -> break ,当某个条件满足时,终止循环
通过该需求可以说明其它流程控制的必要性,比如 break
# 基本介绍
break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]
# 基本语法
{
...
break;
...
}
2
3
4
5
# 以 while 使用 break 为例,画出示意图
# 快速入门
public class Break01 {
public static void main(String[] args) {
for (int i=0;i<10;i++){
if(i==3){
break;
}
System.out.println("i="+i);
}
}
}
2
3
4
5
6
7
8
9
10
# 注意事项和细节说明
# 跳转控制语句-continue
# 基本介绍
- continue 语句用于结束本次循环,继续执行下一次循环。
- continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的使用的规则一样。
# 基本语法
{
...
continue;
...
}
2
3
4
5
# 以 while 使用 continue 为例,画出示意图
# 跳转控制语句-return
return 使用在方法,表示跳出所在的方法,在讲解方法的时候,会详细的介绍,这里我们简单的提一下。注意:如果 return 写在 main 方法,退出程序。