lesson5 - Java控制结构


  Java控制结构包含顺序控制、分支控制、循环控制。

1. 顺序控制

知识点概述:
  顺序控制就是程序从上到下逐行执行,中间没有任何判断和跳转。
在这里插入图片描述

(顺序控制原理图)

代码验证:

class Test{
	public static void main(String[] args){
		int num1 = 12;
	    int num2 = num1 + 12;
	}
}

2. 分支控制

2.1 单分支

知识点概述:
  1. 单分支的基本语法为:

if(条件表达式){
	代码块;
}

  上述语句的作用是,当条件表达式为true时执行代码块中的内容,否则就不执行。
  2. 单分支的流程图为:
在这里插入图片描述
代码验证:

import java.util.Scanner; 
class SingleBranch{
	public static void main(String[] args){
		// 程序功能,输入人的年龄,若大于18岁则输出“同志你的年龄大于18!” 
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入你的年龄:");
		int age = myScanner.nextInt();
		if(age>18){
			System.out.println("同志你的年龄大于18!");
		}
	}
}

2.2 双分支

  功能概述:
  1. 双分支的基本语法为:

if(条件表达式){
			代码块1;
}
else{
	代码块2;
}

  上述语句的作用是,当条件表达式为true时执行代码块1中的内容,否则执行代码块2中的内容。
  2. 双分支的流程图为:
在这里插入图片描述
代码验证:

import java.util.Scanner; 
class DoubleBranch{
	public static void main(String[] args){
		// 程序功能,输入人的年龄,若大于18岁则输出“同志你的年龄大于18!” 
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入你的年龄:");
		int age = myScanner.nextInt();
		if(age>18){
			System.out.println("同志你的年龄大于18!");
		}
		else{
			System.out.println("同志你的年龄小于18!");
		}
	}
}

课堂练习:

class DoubleBranch{
	public static void main(String[] args){
		// 程序功能:判断一个年份是否为闰年。闰年需满足下面两个条件中的一个
		// (1)年份能被4整除,但是不能被100整除;(2)年份能被400整除 
		int year = 100;
		if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ){
			System.out.println(year+"是闰年");
		}
		else{
			System.out.println(year+"不是闰年");
		}
	}
}

2.3 多分支

知识点概述:
  1. 多分支结构的基本语法为:

if(条件表达式1){
			代码块1;
		}
		else if(条件表达式2){
	代码块2;
}
...
else{
	退出代码块;
}

  上述语句的具体执行过程为:先判断条件表达式1是否成立,若成立则执行代码块1并退出,若不成立则去判断条件表达式2是否成立;若条件表达式2成立,则执行代码块2并退出,若不成立则去判断条件表达式3是否成立;依次类推,一直到条件表达式n。如果条件表示式n也不成立,则执行else的代码块退出。
  2. 多分支的流程图为:
在这里插入图片描述
使用细节:
  1. 多分支的可以没有else ;如果有else , 则是前面所有条件表达式都不成立时,才会执行else语句;
  2. 多分支中,程序只要找到一个出口后,就会马上跳出分支结构,其他的判断不会再执行;
代码验证:

class MultiBranch{
	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");
		}     // 程序最终输出b
	}
}

课堂练习:

import java.util.Scanner; 
class MultiBranch{
	public static void main(String[] args){
	// 程序: 要求输入保国同志的芝麻信用分,判断它属于哪个等级
	// 		  信用分为100时,输出极好;
	// 		  信用分为(80,99]时,输出信用优秀;
	// 		  信用分为(60,80]时,输出信用一般;
	// 		  其他分数时,输出信用分不及格
	// 		  要求从键盘输入信用分,并且如果输入的分数不在1-100之内就报错
	Scanner myScanner = new Scanner(System.in);
	System.out.println("请输入您的信用分:");
	int creditScore = myScanner.nextInt();
	if(creditScore >= 1 && creditScore <= 100){
		if(creditScore == 100){
			System.out.println("信用分极好");
		}
		else if(creditScore > 80 && (creditScore <= 99)){
			System.out.println("信用分优秀");
		}
		else if((creditScore >= 60) && (creditScore <= 80)){
			System.out.println("信用分一般");
		}else{
			System.out.println("信用分不及格");
		}
	}else{
		System.out.println("信用分需要在1-100,请重新输入!");
	}
	
	}
}

2.4 分支嵌套

知识点概述:
  1. 分支嵌套就是在一个分支结构中又嵌套了另一个分支结构,即外分支里又包含了一层内分支。 规范:分支嵌套不要超3层, 因为嵌套层数过多后程序可读性极差;
  2. 分支嵌套的基本语法为:

if(){     //第一层
	if(){   //第二层
		if-else...  // 第三层
	}else{
	...
	}
}else{
	...
}

代码验证:

import java.util.Scanner; 
class NestedBranch{
	public static void main(String[] args){

	// 程序功能: 输入歌手的成绩和性别,判断该歌手的后续比赛走向
	// 		     1.输入歌手初赛成绩,若初赛成绩大于8.0,可以进入复赛,否则提示淘汰;
	// 		     2.输入该歌手的性别,根据性别判断进入男子组还是女子组
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入该歌手的初赛成绩:");
		double score = myScanner.nextDouble();
		if(score > 8.0){
			System.out.println("您已顺利进入复赛!");
			System.out.println("请输入您的性别:");
			char gender = myScanner.next().charAt(0);
			if(gender == '男'){
				System.out.println("进入男子组!");
			}
			else if(gender == '女'){
				System.out.println("进入女子组!");
			}else{
				System.out.println("您输入的性别有误,不能参加比赛");
			}
		}else{
			System.out.println("抱歉,您已被淘汰");
		}
	}
}

课堂练习:

import java.util.Scanner; 
class NestedBranch{
	public static void main(String[] args){

	// 程序功能: 设计一个出票系统,根据当前时间(淡季还是旺季)、人的年龄(成年人、儿童)打印票价
	// 		     1.旺季: 4-10月份
	//					 老人(>60岁),20元
	//					 成人(18-60岁),60元;
	//					 儿童(<18岁),30元
	//		     2.淡季: 其他月份
	// 		     		 成人:40元
	// 		     		 其他:20元
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入当前月份:");
		int month = myScanner.nextInt();
		if(month >=4 && month <= 10){
			System.out.println("请输入您的年龄:");
			double age = myScanner.nextDouble();
			if(age > 60){
				System.out.println("票价为20元");
			}
			else if(age >=18 && age <= 60){
				System.out.println("票价为60元");
			}else{
				System.out.println("票价为30元");
			}
		}else{
			System.out.println("请输入您的年龄:");
			double age = myScanner.nextDouble();
			if(age >=18 && age <= 60){
				System.out.println("票价为40元");
			}else{
				System.out.println("票价为20元");	
			}
		}
	}
}

2.5 switch分支

知识点概述:
  1. switch语句的基本语法为:

switch(表达式){
   		case 常量1:
		语句块1;
		break;
		case 常量1:
		语句块2;
		break;
		...
		case 常量n:
		语句块n;
		break;
		default:
		default语句块;   
		break;
}

  上述语句的含义为:程序首先计算switch关键字后的表达式,如果表达式的值等于常量1,就执行语句块1,然后执行break;语句退出switch;否则继续执行后面的语句,依次类推;如果所有常量值都没有匹配上,则执行default语句块然后退出switch。
  2. switch语句的流程图为:
在这里插入图片描述
上面的流程图中,要注意的是,如果,某个语句块后面没有写break语句,执行完这个语句块后就会直接执行下一个语句块,这个称为 穿透原理。

使用细节:
  1. 表达式的数据类型要么和case后的常量类型一致,要么可以自动转换成可相互比较的类型;
  2. 表达式的返回值必须是byte, short, int, char, enum, String中的一种
  3. case后跟的必须是常量,不能是变量
  4. default语句可有可无,没有时程序也不会报错;
  5. break语句用来执行完一个case分支后跳出switch语句块,如果一句break语句都没有,则程序会顺序执行到switch结尾。(具体可参考上面的switch流程图)
代码验证:

class SwitchBranch{
	public static void main(String[] args){

	    // 测试1. 表达式的值与case后常量类型一致
		char c = 'a';
		switch(c){
			case 'a':          // 表达式与常量的数据类型完全相同
				System.out.println("ok1");
				break;
			case 20:           // 表达式与常量的数据类型虽然不同,但是char可以自动转int,所以编译时也不会出错
				System.out.println("ok2");
				break;
			case "hello":      // char无法与string做比较,因此会报错
				System.out.println("ok3");
				break;
			default:
				break;
		}

		// 测试2. 表达式的返回值必须是byte,short,int,char,enum,String中的一种
		double c = 1.21;
		switch(c){                        //表达式c的值为double,会报错
			case 1.21:          
				System.out.println("ok1");
				break;
			default:
				break;
		}

		String d = "1.21";
		switch(d){                        //表达式c的值为String,编译通过
			case "1.21":          
				System.out.println("ok1");
				break;
			default:
				break;
		}	

		// 测试3. case后必须紧跟常量,而不能用变量
		char c = 'a';
		char c2 = 'c'
		switch(c){
			case 'a':          
				System.out.println("ok1");
				break;
			case c2:          // 此处会报错,因为c2是个变量   
				System.out.println("ok2");
				break;				
			default:
				break;

		}

		// 测试4. default语句可有可无,没有时程序也不会报错
		char c = 'a';
		switch(c){
			case 'a':          // 表达式与常量的数据类型完全相同
				System.out.println("ok1");
				break;
			case 20:           // 表达式与常量的数据类型虽然不同,但是char可以自动转int,所以编译时也不会出错
				System.out.println("ok2");
				break;
			case "hello":      // char无法与string做比较,因此会报错
				System.out.println("ok3");
				break;
		}

		// 测试5. break语句用来执行完一个case分支后跳出switch语句块,如果一句break语句都没有,则程序会顺序执行到switch结尾。
	    char c = 'a';
		switch(c){
			case 'a':          
				System.out.println("ok1");
			case 'b':           
				System.out.println("ok2");	
			case 'c':           
				System.out.println("ok3");			
			default:
				System.out.println("ok4");	  // 程序输出ok1 ok2 ok3 ok4
		}
	
	}
}

课堂练习:

class SwitchBranch{
	public static void main(String[] args){
 
	// 程序1要求: 程序可以接受一个字符,显示出这个字符对应的日期
	// 		     a对应周一,b对应周二,c对应周三,d对应周四,e对应周五,f对应周六,g对应周天
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入字符:");
		char char1 = myScanner.next().charAt(0);
		switch(char1){
			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("输入格式不正确!");
				break;				
		}
		System.out.println("switch语句已执行结束!");

	// 程序2要求: 对学生成绩大于60分的,输出合格;对学生成绩低于60分的,输出不合格
		double score = 1;
		int encoding = (int) (score/60)	;    // 亮点:对问题进行了编码
		if(score<=100){
			switch(encoding){
				case 0:
					System.out.println("成绩不合格");
					break;
				case 1:
					System.out.println("成绩合格");
					break;
			}
		}else{
			System.out.println("输入格式不正确!");
		}  

	// 程序3要求: 输入月份,打印该月份所属的季节;
	//            3 4 5为春季; 6 7 8为夏季; 9 10 11为秋季; 12 1 2为冬季

		Scanner myScanner = new Scanner(System.in);
		System.out.println("输入月份: ");
		int month = myScanner.nextInt();
		switch(month){
			case 3:
			case 4:
			case 5:
				System.out.println("这是春季");
				break;
			case 6:
			case 7:
			case 8:
				System.out.println("这是夏季");
				break;
			case 9:
			case 10:
			case 11:
				System.out.println("这是秋季");
				break;
			case 12:
			case 1:
			case 2:
				System.out.println("这是冬季");
				break;
			default:
				System.out.println("输入格式有误!");      //使用了穿透原理,把相同的情况写到一起
		}


	}
}

2.6 if-else与switch的比较

知识点概述:
  1. 对值进行判断,且表达式的值为byte, short, int, char, enum, String中的一种,用switch更好;
  2. 对区间进行判断,结果为boolean型,用if-else更好

3. 循环控制

3.1 for循环

功能解释:
  1. for循环的基本语法为:

  for(循环变量初始化;循环条件;循环变量迭代){
	  		循环语句;
}

  循环变量初始化、循环条件、循环变量迭代、循环语句是for循环的四要素。
  2. for循环的流程图为:
在这里插入图片描述
使用细节:
  1. 循环条件返回的是一个布尔值
  2. for循环语句中,循环变量初始化和循环变量迭代可以写到其他地方,但注意分号;不能省略;
  3. 循环变量初始化、循环变量迭代都可以有多条语句,不同语句间用逗号隔开。使用多条语句时,要求各循环变量的类型一样;
  4. for循环是先判断再执行语句。
代码验证:

class ForLoop{
	public static void main(String[] args){

	// 1. for循环语法演示
		for(int i = 1 ; i <= 10 ; i++)
		{
			System.out.println("你好"+i);
		}

	// 2. 循环变量初始化和循环变量迭代放到其他位置
		int i = 1 ;                        // 效果与上面的for循环相同       
		for( ; i <= 10 ; )
		{
			System.out.println("你好"+i);
			i++ ;
		}
  	// 3. 循环变量初始化、循环变量迭代都可以有多条语句
		int count = 3;
		for(int i = 0, j = 0 ; i < count ; i++ , j += 2){
			System.out.println( "i=" + i + "j=" + j);
		}

	}
}

课堂练习:

class ForLoop{
	public static void main(String[] args){
	// 练习1: 打印1-100之间所有9的倍数,统计个数及其总和
		int count = 0;
		int sum = 0;
		for(int i = 1 ; i <= 100 ; i++)
		{
			if(i % 9 == 0)
			{
				count++;
				sum = sum + i;
				System.out.println(i);
			}

		}
		System.out.println("9的倍数数量为: " + count + "总和为:" + sum);
	// 练习2: 打印以下输出
	//         0 + 5 = 5
    //         1 + 4 = 5
	//         2 + 3 = 5
	//         3 + 2 = 5
	//         4 + 1 = 5
	//         5 + 0 = 5
	for(int i = 0 ; i <= 5 ; i++)
	{
		System.out.println(i + "+" + (5-i) + "=" + "5");
	}	

	}
}

3.2 while循环

知识点概述:
  1. while循环的基本语法为:

	  循环变量初始化;
	  while(循环条件){
	      循环体;
		   循环变量迭代;
	  }

  while循环的四要素也是循环变量初始化、循环条件、循环变量迭代、循环语句,只不过跟for循环放的位置不同。
  2. while循环的流程图为:
在这里插入图片描述
使用细节:
  1. 循环条件是一个返回布尔值的表达式;
  2. while循环是先判断再执行语句
代码验证:

class WhileLoop{
	public static void main(String[] args){

		int i = 1;
		while( i <= 10){
			System.out.println("你好"+i);
			i++ ;			
		}
	}
}

课堂练习:

class WhileLoop{
	public static void main(String[] args){
	// 1. 打印40-200之间所有的偶数
		int i = 40;
		while( i <= 200){
			if(i % 2 == 0) System.out.println(i);
			i++;
						
		}
	}
}

3.3 do-while循环

知识点概述:
  1. do-while循环的基本语法为:

      循环变量初始化;
	  do{
	      循环体;
		   循环变量迭代;
	  }while(循环条件);

  2. do-while的流程图为:
在这里插入图片描述
使用说明:
  1. do-while循环条件是一个返回布尔值的表达式;
  2. do-while是先执行再判断,也就是说程序无论如何一定会执行一次;
  3. 程序的最后,在while后面有个分号;不能掉。
代码验证:

class do_WhileLoop{
	public static void main(String[] args){

		int i = 1;
		do{
			c
			i++;
		}
		while( i <= 10);
	}
}

课堂练习:

class do_WhileLoop{
	public static void main(String[] args){
	//  程序要求: 计算1-100的和
		int i = 1;
		int sum = 0;
		do{
			sum = sum + i ;
			i++;
		}
		while( i <= 100);
		System.out.println(sum);
	}
}

3.4 多重循环

知识点概述:
  1. 将一个循环放进另一个循环内,形成循环的嵌套。for循环、while循环、do-while循环均可以作为内层循环和外层循环。建议循环的嵌套不要超过3层,否则代码可读性很差;
  2. 内层循环执行完所有案例时,才会结束外层的当次循环;
  3. 若外层循环的次数为m次,外层循环的次数为n次,则整个循环体一共会执行m*n次。
代码验证:

class MultiLoop{
	public static void main(String[] args){

		for(int i = 0; i < 2 ; i++){
			for(int j = 0 ; j < 3 ; j++)
			{
				System.out.println("i=" + i + "j=" + j);
			}
		}
	}
}

课堂练习:

class MultiLoop{
	public static void main(String[] args){
	// 程序1要求: 从键盘输入3个班级的成绩,每个班有5个人;
	//			  统计每个班的平均分,以及3个班合起来的平均分

		Scanner myScanner = new Scanner(System.in);
		double sum = 0;       // 总分
		int num_pass = 0 ;    // 及格人数
		for(int i = 1 ; i <= 3 ; i++){         // 第一层是班级
			System.out.println("这是" + i + "班正在统计成绩: " );
			double sum_temp = 0;
			for(int j = 1 ; j <= 5 ; j++){     // 第二层是班级里的每个人
				System.out.println("请输入该学生的成绩: ");
				double score = myScanner.nextDouble();
				sum_temp = sum_temp + score;
				sum = sum + score ;
				if(score >= 60) num_pass++;
			}
			double average_temp = sum_temp/5;
			System.out.println(i + "班的平均成绩为:" + average_temp);

		}
		double average = sum / 15 ;
		System.out.println("总平均成绩为:" + average);
		System.out.println("及格人数为:" + num_pass);


	// 程序2要求: 初级:  输出一个用*组成的实心金字塔
	//			  进阶1: 输出一个用*组成的空心金字塔
	//            进阶2: 输出一个用*组成的空心菱形
	//            *            *                  *
	//	         ***          * *                * *
	//	        *****        *   *              *   *
	//	       *******      *     *            *     *
	//                                          *   *
	//                                           * *
	//                                            *
	//  初级版: 实心金字塔
	//  在输出每层金字塔时,关键点有两个:	一是开始输出*的位置num1,二是输出*的数量num2, 三是每层一共要输出的字符数量num3
	//  设总层数N, 当前层数n , 分析可知num1 = N+1-n , num2 = 1+2*(n-1) , num3 = 1+2*(N-1)
		Scanner myScanner = new Scanner(System.in);
		System.out.println("您想输出一个几层的实心金字塔?");
		int N = myScanner.nextInt();
		for(int n = 1 ; n <= N ; n++){   // 控制层数
			int num1 = N+1-n;
			int num2 = 1+2*(n-1);
			int num3 = 1+2*(N-1);
			for(int i = 1 ; i <= num3 ; i++){   // 控制当前层的输出
				if(i >= num1 && i <= num1 + num2 - 1 )
				{
					System.out.print("*");
				}else{
					System.out.print(" ");
				}
			}
			System.out.println("\n");
		}

	//  进阶1: 空心金字塔
	//  空心金字塔的关键点跟实心金字塔相同,只不过是把中间挖空了,只留开始和终止位置输出*
		Scanner myScanner = new Scanner(System.in);
		System.out.println("您想输出一个几层的空心金字塔?");
		int N = myScanner.nextInt();
		for(int n = 1 ; n <= N ; n++){   // 控制层数
			int num1 = N+1-n;
			int num2 = 1+2*(n-1);
			int num3 = 1+2*(N-1);
			for(int i = 1 ; i <= num3 ; i++){   // 控制当前层的输出
				if(i == num1 || i == num1 + num2 - 1 )
				{
					System.out.print("*");
				}else{
					System.out.print(" "); 
				}
			}
			System.out.println("\n");

		}

	//  进阶2: 菱形
	//  表面上看,菱形似乎只是两个空心金字塔的简单叠加,但其实事情并没有如此简单,因为在菱形的后半段,
	//	相当于是在输出一个倒立的空心金字塔,编码规则已经发生改变。因此需要先思考如何输出倒立的空心金字塔
	//  2-1: 倒立的空心金字塔编码
	//	     假设要输出的倒立金字塔总层数为N_s,当前层数为n_s , 
	//	     则在每一层时,开始输出*的位置num1_s = n_s , 输出的*数量为num2_s = 1 + 2 *(N_s - n_s) 
	//	     然后要考虑将这里的 N_s、 n_s 跟菱形中的N、 s对应起来, 对应关系为
	//	     N_s = N/2 + 1; n_s = n - N/2;
	//  2-2: 前半段是正立的空心金字塔,编码规则与前面很相似, 但也需要重新编码
	//		 假设要输出的正立金字塔总层数为N_t,当前层数为n_t ,
	//		 N_t = N/2+1; n_t = n ;
	//       num1 = N_t+1-n_t , num2 = 1+2*(n_t-1) , num3 = 1+2*(N_t-1)
		Scanner myScanner = new Scanner(System.in);
		System.out.println("您想输出一个几层的空心菱形?");
		int N = myScanner.nextInt();
		for(int n = 1 ; n <= N ; n++){   // 控制层数

			if(n <= (N/2+1) ){           // 前半段正立金字塔
				int num1 = (N/2+1)+1-n;
				int num2 = 1+2*(n-1);
				int num3 = 1+2*((N/2+1)-1);
				for(int i = 1 ; i <= num3 ; i++){   // 控制当前层的输出
					if(i == num1 || i == num1 + num2 - 1 )
					{
						System.out.print("*");
					}else{
						System.out.print(" "); 
					}
				}
				System.out.println("\n");
			}else{                        // 后半段倒立金字塔
				int num1_s = n - N/2;;
				int num2_s = 1 + 2 *(N/2 + 1 - (n - N/2)) ;
				int num3 = 1+2*(N-1);
				for(int i = 1 ; i <= num3 ; i++){   // 控制当前层的输出
					if(i == num1_s || i == num1_s + num2_s - 1 )
					{
						System.out.print("*");
					}else{
						System.out.print(" "); 
					}
				}
				System.out.println("\n");
			}
		}


	}
}

在这里插入图片描述

(金字塔问题输出展示)

3.5 break\continue\return

知识点概述:
  1. break语句用于跳出某个循环/语句块,常放在switch或循环中。语法格式为:

 							break;

  2. continue语句用于结束本次循环,然后继续执行下一次循环。语法格式为:

 						  continue;

  3. return语句用于跳出所在方法,这里会结合后面讲方法时具体说明。return如果放在main方法中,会退出程序。

使用细节:
  1. break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块;如果没有指定break,默认退出最近的循环体;在实际开发中尽量不要使用标签。下面的break label2就用于退出第2层循环

label1:{  ...
label2:     {  ...
label3:          {  ...
					 break label2;
                   ...
                }
           }
}

  2. continue语句也可以像break语句一样,配合标签使用,指明要终止的是哪一层循环。

label1:{  ...
label2:     {  ...
label3:          {  ...
					 continue label2;
                   ...
                }
           }
}

代码验证:

class breakTest{
	public static void main(String[] args){


	// 1. break语句基本功能-->结束整层循环
		for(int i = 1 ; i <= 10 ; i++){
			if(i== 5){
				break;
			}
			System.out.println(i);    // 输出 1 2 3 4 
		}

    // 2. break配合标签使用
	// 2-1. break语句未指定标签时,相当于退出就近的一层循环
label1:	for(int i = 0 ; i < 4 ; i++){
label2:		for(int j = 0 ; j < 5 ; j++){
				if(j == 2)
				{
					break;       // 这里相当于break label2;   
				}
				System.out.println(j);
			}
		}                        // 程序最终输出4个0 1
		
	// 2-2. break指定标签时,就会退出相应的循环
label1:	for(int i = 0 ; i < 4 ; i++){
label2:			for(int j = 0 ; j < 5 ; j++){
				if(j == 2)
				{
					break label1;          
				}
				System.out.println(j);
			}
		}                        // 程序只会输出1个0 1
	}
}
class continueTest{
	public static void main(String[] args){

		// 1.continue基本功能--> 结束本次循环
		for(int i = 1 ; i <= 10 ; i++){
			if(i== 5){
				continue;
			}
			System.out.println(i);    // 输出 1 2 3 4 6 7 8 9 10
		}


		// 2. continue配合标签使用
		// 2-1. continue语句未指定标签时,相当于退出就近的一层循环
label1:	for(int i = 0 ; i < 4 ; i++){
label2:		for(int j = 0 ; j < 5 ; j++){
				if(j == 2)
				{
					continue;       // 这里相当于continue label2;   
				}
				System.out.println(j);
			}
		}                          // 程序最终输出4个0 1 3 4

		// 2-2. continue指定标签时,就会退出相应的循环
label1:	for(int i = 0 ; i < 4 ; i++){
label2:		for(int j = 0 ; j < 5 ; j++){
				if(j == 2)
				{
					continue label1;       // 这里相当于continue label2;   
				}
				System.out.println(j);
			}
		}                          // 程序最终输出4个0 1 

	
	}

}
class break_continue_return_Compare{
	public static void main(String[] args){

		// 下面这段代码用于比较break , continue 和retrun的区别
		//  使用break时,   会输出 0 1 程序结束!
		//  使用continue时,会输出 0 1 3 4 5 程序结束
		//  使用return时,  会输出 0 1    (return放在main方法中,所以会让main方法结束) 
		//              
		for(int i = 0 ; i <= 5 ; i++){
			if(i == 2){
				break;    // continue , return
			}
			System.out.println(i);
		}
		System.out.println("程序结束!");


	}

}

课堂练习:

class breakTest{
	public static void main(String[] args){

	// 程序要求: 用户登录测试。一共有3次输入机会,如果输入的用户名为“丁真”、密码为“666”则提示登录成功;否则提示还有几次机会
		Scanner myScanner = new Scanner(System.in);
		for(int i = 1 ; i <= 3 ; i++ ){
			System.out.println("请输入用户名:");
			String admin = myScanner.next();
			System.out.println("请输入密码:");
			String password = myScanner.next();	
			boolean b1 = admin.equals("丁真");
			boolean b2 = password.equals("666");
			if(b1 && b2){
				System.out.println("登录成功!");
				break;
			}else{
				System.out.println("还有"+(3-i)+"次登录机会");
			}		
		} 

	}
}

本章小测

class chapterTest1{
	public static void main(String[] args){

	// 程序1要求: 某人有现金100000元,每经过一次路口都需要缴费,缴费规则如下:
	//	          当现金>50000时,每次交%5
	//	          当现金<=5000时,每次交1000
	//	          问可以经过多少次路口?   (要求用while-break)
		double money = 100000;
		int count = 0;
		while(money >= 0){
			if(money > 50000){
				money = money * (1 - 0.05);
			}else{
				if(money - 1000 < 0){
					break;
				}
				money = money - 1000;
			}
			count = count + 1;
		}
		System.out.println("一共可以过路口" + count + "次");
		System.out.println("最后还剩" + money + "元");

	}
}
class chapterTest2{
	public static void main(String[] args){

	// 程序2要求: 测试一个整数是否为水仙花数
	//	          水仙花数是指一个3位数的各个位数立方和等于其本身,例如 153 = 1^3 + 5^3 + 3^3 
	//	          当现金<=5000时,每次交1000
	//	          问可以经过多少次路口?   (要求用while-break)
		int num = 153;
		int hd = num / 100; 
		int td = (num - (100*hd))/10;
		int sd = num - 100 * hd - 10 * td ;
		if(num == hd*hd*hd+td*td*td+sd*sd*sd ){
			System.out.println("这个数是水仙花数");
		}else{
			System.out.println("这个数不是水仙花数");
		}
		
	}
}
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值