03 流程控制
一、选择结构-if
1.1 if语句的第一种格式
1.if语句的第一种格式:
if(布尔表达式){
语句体;
}
其它语句;
2.注意:
(1)if语句的第一种格式,只适用于有一种情况的场景
(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
(3)if和后面的()之间以及()和{}之间都是没有分号的
(4)if后面的{}中的语句体要么被执行,要么被跳过
(5)if后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
(6)if后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留
练习
1.键盘录入三个整数,按照从小到大的顺序输出
2.如果用户输入的是3 2 1,程序运行后打印格式"按照从小到大排序后的顺序为:1 2 3"
//冒泡排序
import java.util.Scanner;
public class Task05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int a = sc.nextInt();
System.out.println("请输入第二个整数:");
int b = sc.nextInt();
System.out.println("请输入第三个整数:");
int c = sc.nextInt();
//a中保留了a和b两个数字中的较大中的值
if(a<b) {
int temp = a;
a = b;
b = temp;
}
//b中保留了b和c两个数字中的较大中的值,此时c中已经是最小值了
if(b<c) {
int temp = b;
b = c;
c = temp;
}
//经过上面的操作c中已经确定了最小值,只需要再确定a和b就可以了
if(a<b) {
int temp = a;
a = b;
b = temp;
}
System.out.println("a="+a+",b="+b+",c="+c);
}
}
1.2 if语句的第二种格式
1.if语句的第二种格式:
if(布尔表达式){
语句体1;
} else {
语句体2;
}
2.注意:
(1)if语句的第二种格式,只适用于有两种情况的场景,是一个二选一的情况
(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
(3)if和后面的()之间以及()和{}之间以及else和前后的{}都是没有分号的
(4)语句体1和语句体2必须只有一个会被执行,属于二选一的情况
(5)if和else后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
(6)if和else后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留
练习1
1.键盘录入三个整数,按照从小到大的顺序输出
2.如果用户输入的是3 2 1,程序运行后打印格式"按照从小到大排序后的顺序为:1 2 3"
import java.util.Scanner;
public class Task05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int a = sc.nextInt();
System.out.println("请输入第二个整数:");
int b = sc.nextInt();
System.out.println("请输入第三个整数:");
int c = sc.nextInt();
if(a>b) {//a>b
if(a>c) {//a>b&&a>c a是最大的
if(b>c) {//a>b&&a>c&&b>c
System.out.println("a="+a+",b="+b+",c="+c);
} else {//a>b&&a>c&&b<=c
System.out.println("a="+a+",c="+c+",b="+b);
}
} else {//a>b&&a<=c ->c a b
System.out.println("c="+c+",a="+a+",b="+b);
}
} else {//b>=a
if(c>b) {//b>=a&&c>b c b a
System.out.println("c="+c+",b="+b+",a="+a);
} else {//b>=a&&b>=c b
if(a>c) {//b>=a&&b>=c&&a>c b a c
System.out.println("b="+b+",a="+a+",c="+c);
} else {//b>=a&&b>=c&&a<=c b c a
System.out.println("b="+b+",c="+c+",a="+a);
}
}
}
}
}
练习2
import java.util.Scanner;
/*
某商场购物可以打折,具体办法如下:
普通顾客购满100元打9折
会员购物打8折
会员购物满200元打7.5折
请根据此优惠计划进行购物结算
分析:
1.创建键盘录入对象
2.定义String类型的变量identity(其值为y/n,y表示为会员,n表示为非会员),double类型的变量money表示购物金额
3.通过键盘录入给变量identity和变量money赋值
4.使用嵌套if选择结构实现
5.先判断顾客是否是会员
(1)非会员,直接打9折
(2)会员,接着判断顾客购物是否达到相应的打折的数量要求,根据结果做不同的处理
*/
public class Task13 {
public static void main(String[] args) {
// 1.创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 2.定义String类型的变量identity(其值为y/n,y表示为会员,n表示为非会员),double类型的变量money表示购物金额
String identity;
double money;
// 3.通过键盘录入给变量identity和变量money赋值
System.out.println("请输入是否是会员:是(y)/否(其他字符)");
identity = sc.nextLine();
System.out.println("请输入购物金额:");
money = sc.nextDouble();
// 4.使用嵌套if选择结构实现
if(identity.equals("y")) { //是会员
// 5.先判断顾客是否是会员
// (1)会员,接着判断顾客购物是否达到相应的打折的数量要求,根据结果做不同的处理
if(money >= 200) { //会员购物200元以上打7.5折
money = money * 0.75;
} else { //会员200元以内的大8折
money = money * 0.8;
}
} else {
// (2)非会员,直接打9折
if(money >= 100) { //非会员购物100元以上打9折
money = money * 0.9;
}
}
System.out.println("实际支付:"+money);
}
}
1.3 if语句的第三种格式
1.if语句的第三种格式:
if(布尔表达式1){
语句体1;
} else if(布尔表达式2){
语句体2;
}
...
else if(布尔表达式n){
语句体n;
} else {
语句体n+1;
}
其它语句;
2.注意:
(1)if语句的第三种格式,只适用于有多种(两种以上)情况的场景,是一个多选一的情况
(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
(3)if和后面的()之间以及()和{}之间以及else和前后的{}都是没有分号的
(4)语句体1到语句体n+1必须只有一个会被执行,属于多选一的情况
(5)if和else后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
(6)if和else后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留
(7)最后一个else后面是没有条件的,是用来兜底的,如果前面的所有条件都不成立,执行最后一个else中的代码
(8)不能直接在else后面写条件,只能在if后面()中写条件
有if就可以写条件,没有if就不能写条件
练习1
import java.util.Scanner;
/*
某人想买车,没什么车决定于此人在银行有多少存款(键盘录入)。
如果此人的存款超过500万,则买雪铁龙DS9;
否则,如果此人的存款超过100万,则买雪铁龙C6;
否则,如果此人的存款超过50万,则买雪铁龙C5;
否则,如果此人的存款超过10万,则买雪铁龙爱丽舍;
否则此人买捷安特。
分析:
1.创建键盘录入对象
2.定义int类型变量money,并通过nextInt()方法获取键盘录入的值赋值给变量money
3.使用if-else 对money的值进行判断,并打印相关信息
*/
public class Task11 {
public static void main(String[] args) {
// 1.创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 2.定义int类型变量money,并通过nextInt()方法获取键盘录入的值赋值给变量money
int money = sc.nextInt(); //单位是万元
// 3.使用if-else 对money的值进行判断,并打印相关信息
if(money >= 500) { //money>=500
System.out.println("太好了,我可以买辆雪铁龙DS9");
} else if(money >= 100) { //money>=100 && money<500
System.out.println("不错,我可以买辆雪铁龙C6");
} else if(money >= 50) { //money>=50 && money<100
System.out.println("我可以买辆雪铁龙C5");
} else if(money >= 10) { //money>=10 && money<50
System.out.println("至少我可以买辆雪铁龙爱丽舍");
} else { //money<10
System.out.println("看来我只能买辆捷安特了");
}
}
}
练习2
import java.util.Scanner;
/*
* 分析以下需求,并用代码实现:
1.功能描述:键盘录入月份,输出对应的季节
2.要求:
(1)键盘录入一个整数(代表月份,范围1-12)
(2)输出该月份对应的季节
3,4,5春季
6,7,8夏季
9,10,11秋季
12,1,2冬季
(3)演示格式如下:
请输入一个月份:3
控制台输出:3月份是春季
*/
public class Task06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入月份");
int month = sc.nextInt(); //将键盘录入的结果存储在month
if (month > 12 || month < 1) {
System.out.println("对不起没有对应的季节");
}else if (month >= 3 && month <= 5) {
System.out.println(month + "月是春季");
}else if (month >= 6 && month <= 8) {
System.out.println(month + "月是夏季");
}else if (month >= 9 && month <= 11) {
System.out.println(month + "月是秋季");
}else {
System.out.println(month + "月是冬季");
}
}
}
二、循环语句1--for
1.for循环格式:
for (初始化表达式1;布尔表达式2;步进表达式4) {
循环体3;
}
其它语句;
2.执行流程:
1,2(循环条件:true),3,4 --> 2(循环条件:true),3,4 --> ... --> 直到2(循环条件:false)为false时,结束for循环,执行后面的其它语句
3.注意:
(1)for和(),以及()和{}之间是没有分号的
(2)()中有3个表达式,之间用2个分号(缺一不可)隔开,第三个表达式后面没有分号
(3)第二个表达式一定是布尔类型,结果只能是true和false
(4)循环体就是一条/多条语句
练习1
import java.util.Scanner;
/*
* 分析以下需求,并用代码实现:
1.打印1到100之内的整数,但数字中包含9的要跳过
2.每行输出5个满足条件的数,之间用空格分隔
3.如:1 2 3 4 5
分析:
1.定义计数器,用于统计满足条件的数字的个数
2.遍历1到100的数字
3.求出个位数字(ge)和十位数字(shi)
4.如果个位数字不是9并且十位数字也不是9(<=>如果个位数字是9或者十位数字是9,什么都不做(continue))
计数器加1
打印该数字
判断计数器是否能被5整除
如果能被5整除,打印换行
不能被5整除,什么都不做
*/
public class Task07 {
public static void main(String[] args) {
//1.定义计数器,用于统计满足条件的数字的个数
int count = 0;
//2.遍历1到100的数字
for(int i = 1;i<100;i++) {
//3.求出个位数字(ge)和十位数字(shi)
int ge = i%10;
int shi = i/10%10;
//4.如果个位数字不是9并且十位数字也不是9
if(ge!=9&&shi!=9) {
//计数器加1
count++;
//打印该数字
System.out.print(i+" ");
//如果能被5整除,打印换行
if(count%5==0)
System.out.println();
//不能被5整除,什么都不做
}
}
}
}
练习2
import java.util.Scanner;
/*
循环录入某学生的5门课程的成绩并计算平均分。如果某分数录入为负,则停止录入并提示录入错误。
分析:
1.创建键盘录入对象
2.定义int类型的变量sum(总分)和avg(平均分),两个变量的初始值位0,String类型的变量name,表示学员姓名
3.定义boolean类型的变量flag(表示该学生的5门成绩是否正确录入,如果有一个为负值,则负值为true,表示录入错误),初始值为false
4.利用for循环,录入5个成绩
(1)判断当前的成绩如果小于0,flag赋值为true,终止for循环
(2)否则,如果当前录入的成绩>=0,累加求和
5.打印结果
(1)如果flag为true,打印录入错误
(2)否则如果flag为false,打印总分和平均分
*/
public class Task09 {
public static void main(String[] args) {
// 1.创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 2.定义int类型的变量sum(总分)和double类型的变量avg(平均分),两个变量的初始值位0,String类型的变量name,表示学员姓名
int sum = 0;
double avg = 0;
String name;
// 3.定义boolean类型的变量flag(表示该学生的5门成绩是否正确录入,如果有一个为负值,则负值为true,表示录入错误),初始值为false
boolean flag = false;
System.out.print("请输入学员姓名:");
name = sc.nextLine();//录入学员姓名
// 4.利用for循环,录入5个成绩
for(int i = 0;i < 5; i++) {
System.out.print("请输入第"+(i+1)+"门课程的成绩: ");
int score = sc.nextInt();
// (1)判断当前的成绩如果小于0,flag赋值为true,终止for循环
if(score < 0) {
flag = true;
break;
}
// (2)否则,如果当前录入的成绩>=0,累加求和
sum = sum + score;
}
// 5.打印结果
if(flag) {
// (1)如果flag为true,打印录入错误
System.out.println("抱歉,分数录入错误,请重新进行录入!");
} else {
avg = (double)sum / 5;//计算平均分
// (2)否则如果flag为false,打印总分和平均分
System.out.println(name + "的平均分是:" + avg);
}
}
}
练习3
import java.util.Scanner;
/*
循环录入学员Java课程的成绩(学员数量由键盘录入),统计分数大于等于80分的学生的比例。
分析:
1.创建键盘录入对象
2.定义int类型的变量score(学员成绩)、total(学员数量)、count(>=80分的学员数量)
3.通过键盘录入操作给total变量赋值
4.利用for循环(循环次数为total),循环录入学员成绩
(1)获取当前键盘录入的成绩
(2)判断该成绩如果<80,continue继续进行下次录入
(3)否则如果改成绩>=80,count++
5.定义double类型的rate,并计算80分以上的比例,赋值给rate
6.打印最终的 计算结果
*/
public class Task16 {
public static void main(String[] args) {
// 1.创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 2.定义int类型的变量score(学员成绩)、total(学员数量)、count(>=80分的学员数量)
int score = 0,total = 0,count = 0;
// 3.通过键盘录入操作给total变量赋值
System.out.print("请输入班级总人数:");
total = sc.nextInt();
// 4.利用for循环(循环次数为total),循环录入学员成绩
for(int i = 0; i < total;i++) {
// (1)获取当前键盘录入的成绩
System.out.print("请输入第"+(i+1)+"位学生的成绩:");
score = sc.nextInt();
if(score < 80) {
// (2)判断该成绩如果<80,continue继续进行下次录入
continue;
}
// (3)否则如果改成绩>=80,count++
count++;
}
// 5.定义double类型的rate,并计算80分以上的比例,赋值给rate
System.out.println("总共有"+count+"位同学的成绩在80分以上");
double rate = (double)count/total*100;
// 6.打印最终的 计算结果
System.out.println("80分以上的学生所占的比例为:" + rate + "%");
}
}
练习4
/* 键盘录入一个数构成一个空菱形*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要构成的空菱形的行数(奇数个):");
int a = sc.nextInt();
if (a % 2 == 0) {
a++;
}
int count = 1;
for (int i = 1; i <= a/2+1; i++) { //上半部分 a/2+1
for (int j = 1; j <=a/2+i ; j++) {
if (j == a/2+i || j == a/2-i+2) {
System.out.print("* ");
} else {
System.out.print(" ");
}
}
System.out.println();
count++;
}
for (int i = 1; i <= a / 2; i++) { //下半部分 a/2
for (int j = 1; j <= a - i; j++) {
if (j == a-i || j == i+1) {
System.out.print("* ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
三、循环语句2--while
1.while循环格式:
初始化表达式1;
while(布尔表达式2){
循环体3;
步进表达式4;
}
其它语句;
2.执行流程:
1,2(循环条件:true),3,4-->2(循环条件:true),3,4--> ... -->直到布尔表达式2(循环条件: false) 的结果为false,结束while循环,执行后面的其它语句
3.注意:
(1)while和(),以及()和{}之间是没有分号的
(2)()中的表达式必须是布尔类型
(3)循环体就是一条/多条语句
练习
需求:
世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。
请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
折纸(折叠后的厚度是原有厚度的2倍,而不是平方的关系):
原来: 0.1 paper
第一次: 0.1*2: 0.2 paper = paper * 2
第二次: 0.2*2: 0.4
第三次: 0.4*2: 0.8
第四次: 0.8*2: 1.6
...
实现步骤:
1.定义int变量count,初始值0,用来统计折叠纸张的次数
2.定义2个double变量paper和zf,分别代表珠峰的高度和纸张的厚度,根据题目需求进行初始化
3.使用while循环统计折叠纸张的次数
3.1 初始化表达式: 步骤1和2中定义的变量
3.2 循环条件: 纸张的总厚度 小于 珠峰的高度 paper<zf
3.3 循环体: 计数器的值增加1
3.4 步进表达式: 折叠一次纸张 paper = paper * 2
4.while循环结束后,打印count的值
public class Demo02ZF {
public static void main(String[] args) {
//1.定义int变量count,初始值0,用来统计折叠纸张的次数
int count = 0;
//2.定义2个double变量paper和zf,分别代表珠峰的高度和纸张的厚度,根据题目需求进行初始化
double paper = 0.1,zf = 8844430;
//3.使用while循环统计折叠纸张的次数
//3.1 初始化表达式: 步骤1和2中定义的变量
//3.2 循环条件: 纸张的总厚度 小于 珠峰的高度 paper<zf
while (paper < zf) {
//3.3 循环体: 计数器的值增加1
count++;
//3.4 步进表达式: 折叠一次纸张 paper = paper * 2
paper = paper*2;
System.out.println("折叠第"+count+"次后,纸张的厚度: "+paper);
}
//4.while循环结束后,打印count的值
//1.34217728E7: 科学计数法
//1.34217728 * 10^7 ==> 13421772.8
System.out.println("总共折叠 "+count+"次,达到珠峰的高度,最终纸张的厚度: "+paper);
}
}
四、循环语句3--do-while
1.do-while循环格式:
初始化表达式1;
do {
循环体3;
步进表达式4;
} while (布尔表达式2);
其它语句;
2.执行流程:
1,3,4 --> 2(循环条件:true),3,4 --> 2(循环条件:true),3,4 -->
直到布尔表达式2(循环条件:false)的结果为false,结束do-while循环,执行后面的其它语句
3.注意:
(1)do和{},{}和while,以及while后()之间都是没有分号的
(2)()中的表达式必须是布尔类型,而且()后面必须写一个分号,不写是语法格式错误
(3)循环体就是一条/多条语句
(4)代码从上到下依次执行,它是先执行循环体,再进行条件判断,所以对于do-while而言,循环体至少执行一次
练习
//在控制台输出5次HelloWorld
public class Demo01DoWhileHello {
public static void main(String[] args) {
//初始化表达式
int count = 1;
do {
System.out.println("HelloWorld..." + count);//循环体
count++;//步进表达式
} while (count <= 5);//11<=5:false
System.out.println("其它语句....");
}
}
五、循环语句其它知识
5.1 循环语句的区别
三种循环的区别总结
1.建议使用的顺序: for,while,do-while
2.循环次数确定的话,建议使用for,循环次数不确定建议使用while 【先了解: 后面有使用场景】
循环次数不确定需要先写成死循环的格式
3.do-while循环来讲的话,至少执行一次
4.while和do-while循环而言,循环结束后,初始化条件中定义的变量可以继续使用, 但是for循环的不能使用(在for循环内部定义初始化语句) 意思就是:{}内定义的变量,在{}外不可以使用。
以下说法正确的是: ABCEF
A: for循环是先判断条件,后执行循环体
B: while循环是先判断条件,后执行循环体
C: do-while循环是先执行循环体,后判断条件
D: for和while至少执行一次
E: for和while可以一次都不执行
F: do-while而言至少执行一次
5.2 死循环
死循环
1.概念: 用不停止的循环,又叫做永真循环
2.分类:
(1)for循环的死循环格式:
for (; ; ) {
...
}
(2)while循环的死循环格式:
while (true) {
...
}
(3)do-while循环的死循环格式:
do {
...
} while (true);
六、循环嵌套
练习1
/*九九乘法表*/
int sum;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
sum = i * j;
System.out.print(i + "*" + j + "=" + sum + "\t");
}
if (i == 9) {
break;
}
System.out.println();
练习2
/*质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。
*1-100之间的素数 */
//boolean flag = true;
for (int i =2 ; i <= 100; i++) {
boolean flag = true;
for (int j = i / 2; j > 1; j--) {
if (i % j == 0) {
flag=false;
break;
}
}
if (flag) {
System.out.print(i+" ");
} // else {
// flag =true;
// }
}
七、switch语句
1.格式:
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
case 常量值n:
语句体n;
break;
default:
语句体n+1;
break;
}
其它语句;
2.执行流程:
(1)首先计算出表达式的值
(2)其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到 break就会结束。
(3)最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程 序结束掉。
3.注意事项:
(1)switch语句()中表达式的类型: byte/short/char/int String/枚举---最重要的---
(2)case后面必须写常量,而且不能重复,常量的类型要和表达式的结果类型匹配
(3)switch和后面的(),以及()和{}之间都没有分号,case后面常量值的后面是冒号不是分号
(4)break是用来结束switch语句的,一旦遇到break,直接结束switch语句,继续执行switch后面的其它语句
(5)default是用来兜底的,如果所有的case的常量值和表达式的结果都不相同,直接执行default中的代码
(6)如果每个case和default后面都有break,那么case和default的顺序可以任意调整,不影响结果
(7)如果default放在最后的话,那么可以省略default中的break
(8)语句体: 一条/多条语句(根据题目需求确定)
case 穿透
package itheima03;
public class Demo06SwitchTest {
public static void main(String[] args) {
int i = 5, j = 10, x = 15;
switch (j - i) {//10 - 5: 5
case 4:
x += 16;
case 5:
x++;
case 6:
x += 2;
case 7:
x += 3;
default:
--x;
}
System.out.println(i);//5
System.out.println(j);//10
System.out.println(x);//20
}
}

浙公网安备 33010602011771号