Cha_03 控制语句
仅作为Java学习过程中知识点的记录
目录
- Cha_03 控制语句
- 3.1 选择结构
- 3.1.1 if 语句(分支语句)
- 1. 语法结构
- (1)if 结构
- (2)if-else 结构
- (3)if-else if 结构
- (3)if-else if-else 结构
- 2. if 语句实例
- 1. 语法结构
- 3.1.2 switch 语句
- 1. 语法格式
- 2. switch 语句实例
- 3.1.3 选择结构实例
- 1. 题目
- 2. 代码
- 3. 程序运行结果
- 3.1.1 if 语句(分支语句)
- 3.2 循环语句
- 3.2.1 while 循环
- 1. 语法格式
- 3.2.2 do-while 循环
- 1. 语法格式
- 3.2.3 for 循环
- 1. 语法格式
- 2. for 循环实例
- 3.2.4 for-each 循环
- 1. 语法格式
- 2. 增强 for 循环实例
- 3.2.5 循环语句综合实例
- 1. 题目
- 2. 代码
- 3. 程序运行结果
- 3.2.1 while 循环
- 3.3 中断(跳转)语句
- 3.3.1 return 语句
- 3.3.1 break 语句
- 3.3.2 continue 语句
- 3.3.4 (补)标签语句(Label)
- 1. 语法格式
- 2. 标签语句实例
- 3.1 选择结构
这篇笔记里没有明确标注的实例,题目均来源于所学教材上的案例或是平时的实验作业。若有不当或疑惑之处,都请你们指出,谢谢了!待更新。。。
Cha_03 控制语句
选择结构和循环语句的执行逻辑可参考:java中的四个跳转语句_Java中的流程控制语句 (基础篇四)_weixin_39805387的博客-CSDN博客
3.1 选择结构
3.1.1 if 语句(分支语句)
if 语句是分支语句,也叫条件语句。一种选择判断的语句吧,其中的 if-else 结构可以转换成用三目运算符写。
1. 语法结构
(1)if 结构
if(布尔表达式){
Java语句;
Java语句;
}
if结构的执行逻辑是,如果满足if 后面括号内的表达式,即布尔表达式值为true时,执行if 结构体里的Java语句。若不满足,则跳过不执行。
(2)if-else 结构
if(布尔表达式){
Java语句1;
}else{
Java语句2;
}
if-else 结构可以转换成用三目运算符写。if-else 结构的执行逻辑是,先判断 if 后面括号内的表达式的值,若为true,执行 Java语句1;若为 false ,执行Java语句2.
(3)if-else if 结构
if(布尔表达式1){
Java语句1;//当表达式1的值为true时,执行语句1;否则判断表达式2
}else if(布尔表达式2){
Java语句2;//当表达式2的值为true时,执行语句2;否则判断表达式3
}else if(布尔表达式3){
Java语句3;//当表达式3的值为true时,执行语句3;否则不执行
}
(3)if-else if-else 结构
if(布尔表达式1){
Java语句1;//当表达式1的值为true时,执行语句1;否则判断表达式2
}else if(布尔表达式2){
Java语句2;//当表达式2的值为true时,执行语句2;否则判断表达式3
}else if(布尔表达式3)
···
else{
Java语句n;//当前面的表达式的值都为false时,执行语句n;
}
- 当每个分支中的语句只有1条时,花括号“{ }”可以省略。
- 控制语句和控制语句之间是可以嵌套的。
2. if 语句实例
Activities at Lake LazyDays
你在Lake LazyDays度假村的工作是按照天气状况给客人提供活动建议。以下是一个活动列表:
temp >= 80: swimming;
60 <= temp < 80: tennis;
40 <= temp < 60: golf;
temp < 40: skiing.1、编写一段程序,提示用户输入一个气温值,然后打印出适合该气温的活动。提示:使用if-else语句,并确保你的条件设定不必过于复杂。
2、修改程序,在temp>95或者temp < 20的情况下,打印“Visit our shops!"。提示:在条件表达式中使用布尔运算符。
import java.util.Scanner;
public class LazyDays {
public static void main ( String [ ] args ) {
// 创建一个Scanner对象scan,用以获取用户从键盘输入的数据
Scanner scan = new Scanner(System.in);
// 声明一个int型变量temp
int temp;
while (scan.hasNextInt( )) {
// 提示用户输入今日气温
System.out.println("请输入今日气温:");
// 将用户输入的气温赋值给temp
temp = scan.nextInt( );
// 用if语句判断当日气温,根据不同气温输出不同的游玩建议
if (temp > 95 || temp < 20) {
// 当气温temp高于95或低于20时,输出"Visit our shoops!"
System.out.println("Visit our shops!");
} else if (temp >= 80) {
// 当温度temp不低于80时,输出"swimming"
System.out.println("swimming");
} else if (60 <= temp && temp < 80) {
// 若temp不低于60时,输出"tennis"
System.out.println("tennis");
} else if (40 <= temp && temp < 60) {
// 若temp不低于60时,输出"golf",否则输出"skiing"
System.out.println("golf");
} else {
// 若以上条件都不满足,输出"skiing"
System.out.println("skiing");
}
}
scan.close( );
}
}
3.1.2 switch 语句
1. 语法格式
switch (表达式){
case 值1:
语句块1;
break;//中断当前的switch语句
//当表达式的值为值2或值3时,执行语句块2
case 值2:
case 值3:
语句块2;
break;
case ···:
//当以上case语句的值都与表达式的值不相等时,执行false语句
default:
语句块n;
}
注意:
(1)switch语句可以拥有多个case语句;
(2)表达式的值可以是部分整型或字符串型等(cahr、byte、int、short、boolean、String)或对应的包装类型;
(3)当表达式的值与case的值相等时,执行该case分支的语句块,并往下执行,直到遇到第一个break结束;
(4)如果没有break语句,程序一直往下执行,直到出现第一个break结束,或着执行到default分支结束。
(5)switch可以包含零个或一个default语句,一般default语句放在最后。
2. switch 语句实例
将学生的英文级别转换为中文等级分类:A为优秀,B和C为良好,D为及格,F为未通过,如果级别不再这个范围内将做超出范围提示。
import java.util.Scanner;
public class Grade {
public static void main ( String [ ] args ) {
// 创建一个Scanner对象scan,用以获取用户从键盘输入的数据
Scanner scan = new Scanner(System.in);
// 声明一个String型变量grade。
String grade;
while (scan.hasNext( )) {
// 提示用户输入层级等级
System.out.println("请输入你的成绩等级:");
// 将输入的学生成绩的英文等级赋值给grade中
grade = scan.next( );
// 用switch语句,根据不同气温输出不同的游玩建议
switch (grade) {
case "A" :
System.out.println("优秀");
break;
case "B" :
case "C" :
System.out.println("良好");
break;
case "D" :
System.out.println("及格");
break;
case "F" :
System.out.println("未通过");
break;
default :
System.out.println("不在A~F范围中!");
}
}
scan.close( );
}
}
3.1.3 选择结构实例
1. 题目
Rock, Paper, Scissors
程序Rock.java是石头剪子布游戏的一个框架。将该程序保存至本地目录,按照提示补充程序语句。该程序允许用户输入一个项目,计算机随机产生一个项目,对两个项目对比,给出胜负结果。比如,程序可能以以下方式运行:
用户可以输入R, P, S或者r, p, s来表示石头,布,剪刀三个项目。用户输入的项目保存在字符串变量中,以便于大小写的转换。
使用一个switch语句将一个随机整数转换为游戏中计算机给出的项目。
很多情况下程序需要生成一定范围内的一个随机数。Java类库中的Random类为程序员提供了这样的功能,能够同时生成一系列的随机数。以下变量声明Random类型的变量generator,并使用new操作符进行初始化:
Random generator = new Random();
generator对象能够生成整型或者浮点型的随机数字,需要使用到nextInt方法或者nextFloat方法。nextInt()返回一个任意的整型随机数字,而nextInt(n)返回一个在0至n-1之间的随机整数。nextFloat()和nextDouble()返回0至1之间的一个浮点数。
假设需要生成30至99之间的整数,可以采用以下的方法:
- 使用nextInt():Math.abs(generator.nextInt())%70 + 30;
- 使用nextInt(70): generator.nextInt(70)+30;
- 使用nexFloat: (int)(generator.nextFloat()*70) + 30
加30,表示从30开始,一直到99,着100个数里随机取值。随机数默认从0开始随机取值。完成以下程序。该程序用于生成随机数字。注意需要把java.util.Random类导入程序。
2. 代码
import java.util.Scanner;
import java.util.Random;
public class Rock {
public static void main ( String [ ] args ) {
// 声明变量
String personPlay;// 表示用户输入的值
String computerPlay = "";// 表示计算机出的值
int randomInt;// 随机数
// 创建对象
Scanner scan = new Scanner(System.in);
Random random = new Random( );
// 提示用户输入石头、剪刀或布
// 开始游戏
while (scan.hasNext( )) {
personPlay = scan.next( ).toUpperCase( );
randomInt = random.nextInt(3);
switch (randomInt) {
case 0 :
computerPlay = "R";
break;
case 1 :
computerPlay = "S";
break;
case 2 :
computerPlay = "P";
break;
}
if (personPlay.equals(computerPlay)) {
System.out.println("It's a tie.");
} else if (personPlay.equals("R")) {
if (computerPlay.equals("P")) {
System.out.println("Paper covered stone.\n"
+ "Compueter wins, you failed!");
} else {
System.out.println("Rock crushes scissors.\n"
+ "You win!");
}
} else if (personPlay.equals("S")) {
if (computerPlay.equals("R")) {
System.out.println("Rock crushes scissors.\n"
+ "Compueter wins, you failed!");
} else {
System.out.println("Sissors cut paper.\n"
+ "You win!");
}
} else if (personPlay.equals("P")) {
if (computerPlay.equals("S")) {
System.out.println("Sissors cut paper.\n"
+ "Compueter wins, you failed!");
} else {
System.out.println("Paper covered stone.\n"
+ "You win!");
}
} else if (personPlay.equals("E")) {
System.out.println("Game over! \n"
+ "Thanks for playing!");
break;
} else {
System.out.println("Error! Please enter: \"R\", \"S\" or \"P\".");
}
System.out.print("\nEnter your play: (R, P or S): ");
}
scan.close( );
}
}
3. 程序运行结果
3.2 循环语句
3.2.1 while 循环
1. 语法格式
while(布尔表达式){
语句块;
}
当满足while的循环条件时,执行while里的语句块。同样,只有一条语句时可以不加“{ }”,为方便阅读,建议加“{}”。
3.2.2 do-while 循环
1. 语法格式
do{
语句块;
}while(循环条件);
注意:
- 无论是否满足while循环条件,先执行do 语句块,再判断表达式是否满足while条件。
- do-while循环,至少执行一次循环,当条件满足时,do-while循环与while循环的结构一样。
- do-while循环中,while后面有分号
程序陷阱:
double num = 1.0;
while(num!= 0.0){
System.out.println(num);
num -= 0.1;
}
注意:num为浮点类型变量,直接进行四则运算时会出现精度丢失的现象。所以以上程序会进入死循环。要解决这个问题可以给定一个偏差值。
3.2.3 for 循环
1. 语法格式
for(初始值;条件表达式;增值){
语句块;
}
注意:
(1)在for循环中,初始值只赋值一次;
(2)当满足条件表达式时,执行语句块,并进行增值,然后重新判断是否满足for循环条件,直至不满足条件表达式时,中断for循环。
(3)增值的作用在于控制for循环的次数,使得出现条件表达式值为false,中断for循环,避免出现死循环。
2. for 循环实例
(1)程序一:
鸡兔同笼问题。
一个笼子中有若干只兔子和鸡,共有10个头,32只脚,求兔和鸡的数量。
public class ChookRabbit {
public static void main ( String [ ] args ) {
int head = 10;
int feet = 32;
int sumRabbit;
int sumChook;
for (sumChook = 0; sumChook < 16; sumChook++ ) {
// 鸡兔的总数为10
sumRabbit = head - sumChook;
// 鸡有两只脚,兔子有四只脚,共有32只脚
if (sumRabbit * 4 + sumChook * 2 == feet) {
System.out.println("There are " + sumRabbit
+ " rabbits and " + sumChook
+ " chooks in the cage.");
}
}
}
}
程序运行结果:
(2)程序二
用嵌套for循环实现九九乘法表。
public class MultiplicationTable {
public static void main ( String [ ] args ) {
System.out.println("九九乘法表");
//第一层for循环,控制循环的次数
for(int i = 1; i < 10; i++ ) {
//第二层for循环,控制值
for(int j = 1; j <= i; j++) {
System.out.print(i + " * " + j + " = " + i*j+ "\t ");
}
//换行
System.out.println();
}
}
}
程序运行结果:
3.2.4 for-each 循环
1. 语法格式
for(类型 变量: 数组或集合){
语句块
}
注意:
(1)for-each 循环也称为“增强for循环”。是为了简化集合类、枚举和数组的迭代过程二提出的。
(2)关键字for后面的括号内有两个控制元素,之间用“ : ” 分隔。冒号前为变量及其类型,这里的变量也称为迭代器,在循环体内反复赋值;冒号后为需要遍历的数组或集合。要求,变量必须与需要遍历的数组或集合内的元素类型一致。
2. 增强 for 循环实例
使用 for-each 循环实现,输出书单中所有书目的功能。
public class BookList {
public static void main ( String [ ] args ) {
//声明一个 String 类型数组 bookList ,并赋初始值
String[] bookList = {"Java程序设计","数据库原理","计算机网络","界面设计"};
int i = 0;
//声明一个 String 类型变量 books ,作为迭代器,遍历 String 类型数组 bookList
for(String books: bookList) {
i++;
//依次输出 bookList 中存储的所有元素
System.out.println(i + " " + books);
}
}
}
程序运行结果示例:
3.2.5 循环语句综合实例
1. 题目
Factorials
n的阶乘(n!)表示整数从1到n的乘积。比如,4!=123*4=24。另外,0!=1。阶乘不适用于负数。1、编写一段程序,请用户输入一个非负整数,然后打印该整数的阶乘。请使用while循环语句编写程序。请考虑用户输入0的情况。
2、修改程序,检查用户是否输入非负整数。如果输入的负数,则提示用户输入非负整数,并请用户重新输入,直到用户输入非负整数为止。
2. 代码
import java.util.Scanner;
public class Factorials {
public static void main ( String [ ] args ) {
Scanner scan = new Scanner(System.in);
int n;
int factories;
System.out.println("Please enter a number:");
while (scan.hasNext( )) {
n = scan.nextInt( );
factories = 1;
if (n < 0) {
// 负数没有阶层
System.out.println("Error!");
} else if (n == 0) {
// 0! = 1
System.out.println(n + "! = 1");
} else {
// 输出格式 n! = 1 * 2 * ··· * n = ···
System.out.print(n + "! = 1");
for (int i = 1; i <= n; i++ ) {
// 计算阶层
factories *= i;
if (i > 1)
System.out.print(" * " + i);
}
// 输出最终结果,并换行
System.out.print(" = " + factories + "\n");
}
// 提示用户输入数字
System.out.println("Please enter a number:");
}
scan.close( );
}
}
3. 程序运行结果
3.3 中断(跳转)语句
Java中的中断语句包括:return、break、continue,都用于执行循环的中断。
3.3.1 return 语句
- return语句用于跳出含有return语句的方法,返回到方法调用处。当return语句出现在主方法中,表示结束整个程序的运行。return 语句的语法格式如:
return 表达式;或return;。 - 当有确定的返回值时,表达式的类型与返回值的类型必须一致。return 语句既可以返回基本类型,也可以返回对象。
- 当方法的返回类型为 viod 类型时,方法体内不能写 return 语句,可以等价为 return 语句,表示该方法无需返回值。
- 所有方法都有返回类型,方法又由多条语句组成。一个方法中可以有多条 return 语句,但当某条return 语句被执行后,return 语句后的所有语句都不执行,即立即结束该方法的执行。
3.3.1 break 语句
- break语句用于switch语句和循环结构。break 语句的语法格式如:
break;或break label;(其中,label 是标签名)。 - 当break语句出现在switch语句中时,用于终止某个case并跳出switch结构。
- 当break语句出现在循环结构时,用于完全结束当前循环,跳出当前循环,或者在标签语句中使用,完全终止标签标记的循环。
3.3.2 continue 语句
- continue语句,用于终止本次循环,执行下一次循环。写法如:
continue;或continue label;(其中,label 是标签名)。 - continue可以用于循环结构,常与 if 语句一起使用,用于加速循环,即满足条件时,跳过本次循环剩余的语句,强行检测判定条件,以决定是否执行下一次循环。
- 可用于标签语句,表示结束当前标签标记的循环,判断标签处的判定条件是否满足,以决定下一次循环是否执行。
3.3.4 (补)标签语句(Label)
1. 语法格式
标签语句的用法如下:(代码随便写的,没啥意义,逻辑可能也有些问题。。。随便康康~~~)
int j = 10;
label1: for(int i = 0;i < 10;i++){
label2: while(j <= i){
if(j == i){
//当j和i的值相等的时候,跳出label处的for循环
break label1;
}else{
//若j≠i,j自增,并结束label2处的while循环,重新判断while的条件语句
j--;
continue label2;
}
}
}
- 标签语句一般用于多层循环中,为了方便在循环中使用break和continue语句。
- 当break或continue语句后带有标签名时,表示终止标签处的循环体。若是break语句,则跳出该循环;若是continue语句,则结束本次循环进入下次循环。
- 参考资料见:java[4]跳转语句 和
2. 标签语句实例
来源于Java 实例 – 标签(Label) | 菜鸟教程 (runoob.com)
/*
* 在"This is the string in which you have to search for a substring."中搜索“substring”这个单词
*/
public class Main {
public static void main ( String [ ] args ) {
String strSearch = "This is the string in which you have to search for a substring.";
String substring = "substring";
boolean found = false; // 声明一个变量found用来表示搜索的
int max = strSearch.length( ) - substring.length( ); // max = 54
testlbl: // 这是一个标签名,标记以下的for循环,标签名和for循环之间不能有任何Java语句
for (int i = 0; i <= max; i++ ) {
int length = substring.length( ); // 子字符串的长度为9
int j = i; // j 的初始值为0
int k = 0;
// 从字符串subtring最后一个字符开始 ,与strSearch中的字符一一比对,
// 若所有字符还没完全比对完时(即length != 0 时),执行while循环,并且length-1
while (length-- != 0) {
// 判断strSearch字符串第j个字符和substring字符串中第k个字符串是否相等
// 若不相等,执行if语句;若相等,继续判断while的条件语句
if (strSearch.charAt(j++ ) != substring.charAt(k++ )) {
// 终止当前的for循环(因为标签标记在for循环外),继续从下一个 i 值开始
// 先判断是否满足 i <= max ,是则继续执行for循环中的Java语句,否则跳出for循环。
continue testlbl;
} // 这是 if 语句的结束
} // 这是 while 循环的结束
// 跳出while循环后,即字符串substring已经全部比对完之后
// 改变found的值,并完全终止testlbl标记的for循环,跳出循环
found = true;
break testlbl;
} // 这是 for 循环的结束
// found为true意为在字符串strSearch中找到substring,输出提示;否则输出没找到的提示
if (found) {
System.out.println("发现子字符串。");
} else {
System.out.println("字符串中没有发现子字符串。");
}
}
}
程序运行结果: