一、三种执行顺序
执行顺序 | 说明 |
---|---|
顺序结构 | 自上而下的执行代码 |
分支结构 | 根据条件,选择对应代码执行 |
循环结构 | 控制某段代码重复执行 |
二、分支结构
1、if 分支
- 根据条件(真或假)来决定执行某段代码
- if 分支有三种形式
//第一种形式
if(条件表达式){
代码;
}
//第二种形式
if(条件表达式){
代码1;
} else {
代码2;
}
//第三种形式
if(条件表达式1){
代码1;
} else if(条件表达式2) {
代码2;
} else if(条件表达式3) {
代码3;
} else if(条件表达式4) {
...
} else {
代码 n;
}
if 第一种形式
- 格式:
//第一种形式
if(条件表达式){
语句体;
}
- 执行流程:首先判断条件表达式的结果,如果为 true 执行语句体,为 false 就不执行语句体,如下图所示
- 注意事项:if 语句中,如果大括号控制的只有一行代码,则大括号可以省略不写,但是不建议省略,有大括号利于增加代码的可读性。
if 第二种形式
- 格式:
//第二种形式
if(条件表达式){
语句体 1;
} else {
语句体 2;
}
- 执行流程:首先判断条件表达式的结果,如果为 true 执行语句体1,为 false 就执行语句体2,如下图所示
if 第三种形式
- 格式:
//第三种形式
if(条件表达式1){
语句体 1;
} else if(条件表达式2) {
语句体 2;
} else if(条件表达式3) {
语句体 3;
} else if(条件表达式4) {
...
} else {
语句体 n+1;
}
- 执行流程:①先判断条件1的值,如果为 true 则执行语句体1,分支结束;如果为 false 则判断条件2的值。②如果值为 true 就执行语句体2,分支结束;如果为 false 则判断条件3的值。③…④如果没有任何条件为 true ,就执行 else 分支的语句体 n+1。
常见问题:
- if(条件){},()后不能跟“;”否则{}中的代码将不受 if 的控制了
- 如果 if 语句的{}中只有一行代码的情况,{}可以省略不写(但是不推荐省略)
案例:考试奖励
- 需求:键盘录入考试成绩,根据成绩所在的区间,程序打印出不同的奖励机制
- 分析:
①键盘录入考试成绩
②由于奖励种类较多,属于多种判断,采用 if…else…if 格式实现
③为每种判断设置对应的条件
④为每种判断设置对应的奖励
注意事项:正确数据、边界数据、错误数据
- 解决:
- 代码如下:
public class Case {
//考试奖励
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入考试成绩:");
int score = sc.nextInt();
if (score >= 90 && score <= 100) {
System.out.println("山地自行车一辆");
} else if (score >= 80) {
System.out.println("游乐场畅玩门票一张");
} else if (score >= 70) {
System.out.println("乐高玩具一件");
} else if (score >= 60) {
System.out.println("电影票一张");
} else if (score < 60 && score >= 0) {
System.out.println("家法伺候");
} else {
System.out.println("你输入的成绩有错误");
}
}
}
案例:密码校验
- 需求:键盘录入用户密码,如果密码为111111,程序输出密码正确,否则输出密码有误
- 分析:
①使用 Scanner 录入用户输入的密码,并使用变量接受
②使用 if…else 组织程序逻辑
注意事项:咱们常用的密码正常应该使用字符串 String 类,但是字符串的比较有些特殊,目前咱们先不使用这个字符串,先用整型去做这个案例
- 解决:
- 代码如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入密码:");
int password = sc.nextInt();
if (password == 111111) {
System.out.println("密码正确");
} else {
System.out.println("密码错误");
}
}
2、switch 分支
- 通过比较值来决定执行哪条分支
switch 分支的执行流程
①先执行表达式的值,再拿着这个值与 case 后的值进行匹配
②与哪个 case 后的值匹配为 true 就执行哪个 case 块的代码,遇到 break 就跳出 switch 分支
③如果全部 case 后的值与之匹配都是 false ,则执行 default 块的代码
使用 switch 分支的注意事项
- 表达式只能是 byte、short、int、char,JDK 5 开始支持枚举,JDK 7 开始支持 String、不支持 double、float、long
- case 给出的值不允许重复,且只能是字面量,不能是变量。
- 正常使用 switch 的时候,不要忘记写 break ,否则会出现穿透现象。
- 当存在多个 case 分支的代码相同时,可以把相同的代码放到一个 case 块中,其他的 case 块都通过穿透性透到该 case 块执行代码即可,可以简化代码。下面给穿透性代码举个例子:
//穿透性代码举例
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入‘周几’:");
String date = scanner.nextLine();
switch (date) {
case "周一":
case "周二":
case "周三":
case "周四":
System.out.println("当社畜!");
break;
case "周五":
System.out.println("今天是周五,当最后一天社畜!");
break;
case "周六":
System.out.println("今天是周六,放肆玩一天!");
break;
case "周日":
System.out.println("今天是周日,好好休息一天!");
break;
default:
System.out.println("输入错误,请输入正确的日期!");
break;
}
}
案例:电子备忘录
- 需求:输入周几就输出当天需要干什么
- 分析:
①需要键盘输入,用 Scanner ;
②有具体的值,采用 switch 语句格式实现
③在 switch 语句中设置相应的值
④在每个 switch 分支中设置对应的输出内容
- 解决:
- 代码如下
//电子备忘录
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入‘周几’:");
String date = scanner.nextLine();
switch (date) {
case "周一":
System.out.println("今天是周一,学 Java 吧!");
break;
case "周二":
System.out.println("今天是周二,当社畜!");
break;
case "周三":
System.out.println("今天是周三,学学考研知识!");
break;
case "周四":
System.out.println("今天是周四,做法期待周五到来!");
break;
case "周五":
System.out.println("今天是周五,当最后一天社畜!");
break;
case "周六":
System.out.println("今天是周六,放肆玩一天!");
break;
case "周日":
System.out.println("今天是周日,好好休息一天!");
break;
default:
System.out.println("输入错误,请输入正确的日期!");
break;
}
}
3、if 和 switch 的比较以及适用场景
- if 在功能上远远大于 switch
- 当前条件是区间的时候,应该使用 if 分支结构
- 当条件是与一个一个的值比较的时候,switch分支更合适:格式良好,性能较好,代码可读性更强
三、循环结构
1、for 循环
- 控制一段代码反复执行很多次
- for 循环格式:
for (初始化语句;循环条件;迭代语句) {
循环体语句(重复执行的代码);
}
for (int i = 0; i < 3; i++) {
//输出3次HelloWorld
System.out.println("Hello, world!");
}
for 循环案例详细流程讲解:
for (int i = 0; i < 3; i++) {
//输出3次HelloWorld
System.out.println("Hello, world!");
}
- 执行的流程:
①循环一开始,执行 int i = 0 一次。
②此时 i = 0,紧接着计算机执行循环条件语句:0 < 3 返回 true,计算机就进到循环体中执行,输出:Hello, world!,然后执行迭代语句 i++。
③此时 i = 1,紧接着计算机执行循环条件语句:1 < 3 返回 true,计算机就进到循环体中执行,输出:Hello, world!,然后执行迭代语句 i++。
④此时 i = 2,紧接着计算机执行循环条件语句:2 < 3 返回 true,计算机就进到循环体中执行,输出:Hello, world!,然后执行迭代语句 i++。
⑤此时 i = 3,然后判断循环条件:3 < 3 返回 false,循环立即结束!!!!
for 循环的常见应用场景
- 在开发中减少代码的重复编写、灵活的控制程序的执行
- 在其他常见应用场景中批量生产数据
案例:求和
- 需求:求1-5之间的数据和,并把求和结果在控制台输出。
- 分析:
①使用for循环一次产生:1、2、5
②在循环体外定义一个 int 类型的变量 sum 用于求和,循环每产生一个数,就加到 sum 中去
③循环结束后,输出求和变量即是结果
- 解决:
- 代码如下:
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
System.out.println("求和结果是:" + sum);
}
案例:奇数求和
- 需求:求1-10之间的奇数和,并把求和结果在控制台输出
- 分析方式1:
①定义 for 循环,使其能够依次产生:1、2、3、4、5… 10
②在循环外定义一个 int 类型的变量 sum 用于求和
③循环每产生一个数据,都通过 if 判断其是否是奇数,是奇数,则进到 if 中将其加到 sum 中去
- 解决方式1:
- 代码如下:
//求奇数和
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 1) {
sum += i;
}
}
System.out.println(sum);
}
- 分析方式2:
①定义 for 循环,使其能够依次产生:1、3、5、7、9
②在循环外定义一个整数变量 sum,循环每产生一个数据就加到 sum 中去
③循环结束后,输出 sum 变量即可
- 解决方式2:
//求奇数和
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i+=2) {
sum += i;
}
System.out.println(sum);
}
案例:水仙花数
- 需求:在控制台输出所有的“水仙花数”,并求在区间内的水仙花数的个数,水仙花数必须满足如下两个要求:
①水仙花数是一个三位数
②水仙花数的个位、十位、百位的数字立方和等于原数
- 分析:
①定义一个 for 循环从“100一直到999”
②每次访问到数据后,提取该数据的:个位、十位、百位数字
③使用 if 判断:个位、十位、百位的数字立方和是否等于原数,等于则输出该数据
④在循环外定义一个count=0,每输出一个水仙花数,就在循环内使count++。
- 解决:
- 代码如下:
//水仙花数
public static void main(String[] args) {
int count = 0;
for (int i = 100; i <= 999; i++){
int a = i / 100;//提取百位数
int b = i / 10 % 10;//提取十位数
int c = i % 10;//提取个位数
if (a * a * a + b * b * b + c * c * c == i){
System.out.println(i);
count++;
}
}
System.out.println("区间内的水仙花数共有:" + count + "个");
}
2、while 循环
- 格式如下:
初始化语句;
while (循环条件) {
循环体语句(被重复执行的代码);
迭代语句;
}
- 示例:
int i = 0;
while (i < 3) {
System.out.println("Hello World");
i++;
}
执行流程
①循环一开始,执行 int i = 0 一次。
②此时 i = 0,接着计算机执行循环条件语句:0 < 3 返回 true,计算机就进到循环体中执行,输出:HelloWorld,然后执行迭代语句 i++;
③此时 i = 1,接着计算机执行循环条件语句:1 < 3 返回 true,计算机就进到循环体中执行,输出:HelloWorld,然后执行迭代语句 i++;
④此时 i = 2,接着计算机执行循环条件语句:2 < 3 返回 true,计算机就进到循环体中执行,输出:HelloWorld,然后执行迭代语句 i++;
⑤此时 i = 3,然后判断循环条件:3 < 3 返回 false,循环立即结束!!
while和for有什么区别?
- 功能上是完全一样的,for 能解决的 while 也能解决,反之亦然。
- 使用规范:知道循环几次:使用 for;不知道循环几次建议使用:while。
案例:纸张折叠成珠穆朗玛峰的高度
- 需求:世界最高山峰珠穆朗玛峰高度是:8848.86米 = 8848860毫米,假如我有一张足够大的纸,它的厚度是0.1毫米。请问:该纸张折叠多少次,可以这折叠成珠穆朗玛峰的高度?
- 分析:
①一开始不知道要循环多少次则使用while
②使用 while 循环来控制纸张折叠,循环条件是(纸张厚度 < 山峰高度),循环每执行一次,就表示纸张折叠一次,并把纸张厚度变为原来两倍。
③循环外定义计数变量 count,循环每折叠一次纸张,让 count 变量+1。
- 解决:
- 代码如下:
//纸张折叠成珠穆朗玛峰的高度
public static void main(String[] args) {
double peakHeight = 8848860;//山峰高度
double paperHeight = 0.1;//纸张高度
int count = 0;//折叠次数
while (paperHeight < peakHeight) {
paperHeight = paperHeight * 2;
count++;
}
System.out.println("纸张折叠的次数是:" + count);
}
3、do-while 循环
- 格式如下:
初始化语句;
do {
循环体语句;
迭代语句;
} while (循环条件);
- 示例:
int i = 0;
do {
System.out.println("Hello World!");
i++;
} while(i < 3);
执行流程
- 先执行后判断
4、三种循环的区别小结
- for 循环和 while 循环(先判断后执行);do…while (先执行后判断)
- for 循环和 while 循环的执行流程是一模一样的,功能上无区别,for 能做的 while 也能做,反之亦然
- 使用规范:如果已知循环次数建议使用 for 循环,如果不清楚要循环多少此建议使用 while 循环。
- 其他区别:for 循环中,控制循环的变量只在循环中使用。while 循环中,控制循环的变量在循环后还可以继续使用
4、死循环
- 可以一直执行下去的一种循环,如果没有干预不会停下来,经常用在服务器程序中
死循环的三种写法
//第一种
for ( ; ; ) {
System.out.println("Hello World");
}
//第二种 经典写法
while (true) {
System.out.println("Hello World");
}
//第三种
do {
System.out.println("Hello World");
} while (true);
5、循环嵌套
- 循环中又包含循环
- 示例:
for (int i = 0; i < 3; i++) {
for(int j = 0; j < 5; j++){
System.out.println("这里是双层循环要输出的地方");
}
}
循环嵌套的特点
- 外部循环每循环一次,内部循环会全部执行完一轮
案例:循环嵌套
- 需求:在控制台使用 * 打印出4行5列的矩形
- 分析:
①循环打印出4行
②在每行打印出来的文字中再循环打印出5列
- 解决:
- 代码如下:
//循环嵌套:
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.print("\n");
}
}
四、跳转关键字
- break:跳出并结束当前所在循环的执行
- continue:用于跳出当前循环的当次执行,直接进入循环的下一次执行
- 注意事项:
break:只能用于结束所在循环,或者结束所在 switch 分支的执行
continue:只能在循环中进行使用
案例:密码验证
- 需求:系统密码是520,请用户不断的输入密码验证没验证不对输出:密码错误,验证成功输出:欢迎进入系统,并停止程序
- 分析:
①定义一个变量记录正确的密码(密码自己想嗷)
②使用 while 死循环,让用户不断输入数据,与正确密码对比:验证不成功输出:密码错误、验证成功输出:欢迎进入系统,并使用 break 结束当前循环的执行。
- 解决:
- 代码如下:
//案例:密码验证
public static void main(String[] args) {
String password = "yue520";
while (true) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入密码:");
String inputPassword = scanner.nextLine();
if (inputPassword.equals(password)) {
System.out.println("密码正确,欢迎进入系统!");
break;
} else {
System.out.println("密码错误,请重新输入!");
}
}
}
五、案例:随机数 Random 类
1、技术:Random的使用
- Random 作用:生成随机数
- 得到 0-9 的随机数的实现步骤:
①导包:告诉程序去 JDK 的哪个包中找 Random
②写一行代码拿到随机数对象
③调用随机数的功能获取 0-9 之间的随机数
- 注意: nextInt(n) 功能只能生成:0 至 n - 1 之间的随机数,不包含 n。
2、Random 生成指定区间随机数
- 例如:要生成 1-10 之间的随机数,程序怎么实现
- 技巧:先减后加(先用区间的最大数减去区间最小数再加1,然后再在后面加上最小数)
- 举例:生成65-91之间的随机数(int number = r.nextInt(27) + 65)
3、案例:猜数字游戏
- 需求:随机生成一个 1-100 之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏。
- 分析:
①先随机生成一个 1-100 之间的数据
②定义一个死循环让用户可以一直猜测
③在死循环里,每次都提示用户输入一个猜测的数字,猜大提示过大,猜小提示过小,猜中则结束游戏
- 解决:
- 代码如下:
//案例:猜数字游戏
public static void main(String[] args) {
Random rand = new Random();
int number = rand.nextInt(100) + 1;
while (true){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字:");
int guess = scanner.nextInt();
if (guess == number) {
System.out.println("恭喜你,猜对了!");
break;
} else if (guess < number) {
System.out.println("猜的数字小了,请再试一次!");
} else if (guess > number) {
System.out.println("猜的数字大了,请再试一次!");
}
}
}