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 语句实例
      • 3.1.2 switch 语句
        • 1. 语法格式
        • 2. switch 语句实例
      • 3.1.3 选择结构实例
        • 1. 题目
        • 2. 代码
        • 3. 程序运行结果
    • 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.3 中断(跳转)语句
      • 3.3.1 return 语句
      • 3.3.1 break 语句
      • 3.3.2 continue 语句
      • 3.3.4 (补)标签语句(Label)
        • 1. 语法格式
        • 2. 标签语句实例

这篇笔记里没有明确标注的实例,题目均来源于所学教材上的案例或是平时的实验作业。若有不当或疑惑之处,都请你们指出,谢谢了!待更新。。。


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(循环条件);

注意:

  1. 无论是否满足while循环条件,先执行do 语句块,再判断表达式是否满足while条件。
  2. do-while循环,至少执行一次循环,当条件满足时,do-while循环与while循环的结构一样。
  3. 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("字符串中没有发现子字符串。");
		}

	}
}

程序运行结果: