第四章 控制结构

一、概述

  • 程序运行时的流程控制取决于程序时如何执行的,有三大流程控制语句,即顺序控制、分支控制、循环控制。

二、顺序控制

  • 1、程序从上到下逐行的执行,中间没有任何判断和跳转
  • 2、注意事项
    Java中定义变量时采用合法的前向引用,也就是变量先定义再使用。
int n1 = 12;
int n2 = n1 + 1;
//完全可以
int n2 = n1 + 1;
int n1 = 12;
//这么写就不行了

三、分支控制

1、单分支 if

  • (1)语法:

     		if(条件表达式){
     			执行代码块;可以有多条语句
    		 }
    
  • (2)说明:当条件表达式为 true 时,就会执行 { } 中的代码,反之,不执行 { } 中的代码;
    如果执行代码块中只有一条数据,则 { } 可以省略,但是建议写上

  • (3)例如:编写一个程序,输入自己的年龄,如果年龄大于18岁,则输出 “你的年龄大于18岁,要对自己的行为负责,可以坐牢了”

    思路分析:1、接收输入的年龄,一个 Scanner 对象
       		2、把年龄保存到一个变量中
       		3、使用 if 判断,输出对应消息
       
       Scanner scanner = new Scanner(System.in);
       System.out.println("请输入你的年龄");
       int age = scanner.nextInt();
       if(age>14){
       	  System.out.println("你的年龄大于18岁,要对自己的行为负责,可以坐牢了");
       }
       
       //输出
       //请输入你的年龄
       //21
       //你的年龄大于14岁,要对自己的行为负责,可以坐牢了
    

2、双分支 if else

  • (1)语法:.

    	if(条件表达式){
    		 	执行代码块1;(可以有多条语句)
    	 }else{
    			执行代码块2;(可以有多条语句)
    	 }
    
  • (2)说明
    当条件表达式为 true 时,就会执行 { 执行代码块1 } 中的代码,反之,执行 { 执行代码块2 } 中的代码;
    如果执行代码块中只有一条数据,则 { } 可以省略,但是建议写上

  • (3)例如:编写一个程序,输入自己的年龄,如果年龄大于18岁,则输出 “你的年龄大于18岁,要对自己的行为负责,可以坐牢了”,否则就输出"你的年龄还小,这次就放过你了"

    	思路分析:1、接收输入的年龄,一个 Scanner 对象
    			2、把年龄保存到一个变量中
    			3、使用 if 判断,输出对应消息
    
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入你的年龄");
    	int age = scanner.nextInt();
    	if(age>18){
    		System.out.println("你的年龄大于18岁,要对自己的行为负责,可以坐牢了");
    	}else{
    		System.out.println("你的年龄还小,这次就放过你了");
    	} 
    	
    	//输出
    	//请输入你的年龄
    	//16
    	//你的年龄还小,这次就放过你了
    
  • (4)相关练习1:读程序,写出最后输出结果

    	int x = 7;
    	int y = 4;
    	if(x > 5){			//正确,进入这个 代码块中
    		if(y > 5){		//错误,不会进行这个代码块,
    						//反而会进入这个 if 所对应的 else 的代码块中
    			System.out.println(x + y);
    		}else{
    			System.out.println("学习Java");  //所以会输出这个语句
    		}
    	}else{
    		System.out.println("x = " + x);
    	}
    	//输出   学习Java
    
  • (5)相关练习2:编写程序:声明 2 个 double型 变量并赋值,如果第一个数小于 10,且第二个数小于 20,打印两数之和

    	思路分析:1、接收输入的数据,一个 Scanner 对象
      			2、把 输入数据 保存到一个 double型 变量中
      			3、使用 if 判断,输出对应消息
      			
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入第一个数 " );
    	double d1 = scanner.nextDouble();
    	System.out.println("请输入第二个数 " );
    	double d2 = scanner.nextDouble();
    	if(d1 > 10.0 && d2 <20 ){
    		System.out.println("输入的两数之和为" + (d1 + d2) );
    	}
    	//输出  
    	//请输入第一个数 
    	//15
    	//请输入第二个数 
    	//15
    	//输入的两数之和为30.0 
    
  • (6)相关练习3:编写程序:定义两个变量 int型,判断二者的和,是否能被 3 又被 5 整除,打印结果

    	思路分析:1、接收输入的数据,一个 Scanner 对象
    			2、把 输入数据 保存到一个 int型 变量中
    			3、使用 if 判断,输出对应消息	
    			
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入第一个数" );
    	int n1 = scanner.nextInt();
    	System.out.println("请输入第二个数" );
    	int n2 = scanner.nextInt();
    	int sum = n1 + n2;
    	if(sum % 3 == 0 && sum % 5 == 0){
    		System.out.println("输入的两数之和为" + (n1 + n2) +
    		 "\n能够被 3 和 5 整除" );
    	}else{
    		System.out.println("输入的两数之和为" + (n1 + n2) + 
    		"\n不能够被 3 和 5 整除" );
    	}
    	//输出  			
    	//请输入第一个数
    	//6
    	//请输入第二个数
    	//9
    	//输入的两数之和为15
    	//能够被 3 和 5 整除
    
  • (7)相关练习4:编写程序:判断一个年份是否为闰年,判断条件1:年份能被4整除,但是不能被100整除,2:能被400整除

    	思路分析:1、接收输入的数据,一个 Scanner 对象
      				2、把 输入数据 保存到一个 int型 变量中
      				3、使用 if 判断,输出对应消息		
      				
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入一个数" );
    	int n1 = scanner.nextInt();
    
    	if((n1 % 4 == 0 && n1 % 100 != 0) || n1 % 400 == 0){
    		System.out.println("输入的年份 是 闰年" );
    	}else{
    		System.out.println("输入的年份不是闰年" );
    	}		
    	//输出  			
    	//请输入第一个数
    	//2000
    	//输入的年份 是 闰年
    

3、多分支

  • (1)语法:

     		if(条件表达式1){
     			执行代码块1;(可以有多条语句)
    		 }else if(条件表达式2){
     			执行代码块2;(可以有多条语句)
    		 }
    		 else if(条件表达式3){
    			执行代码块3;(可以有多条语句)
    		 }
            ......
            else{          //多分支 可以没有这个最后的 else,如果所有条件表达式都不成立,则一个执行入口都没有
            	执行代码块n   //如果有这个 else ,如果所有的条件表达式都不成立,则默认执行这个 else 中的代码块
            }
    
  • (2)说明
    当 条件表达式1 为 true 时,就会执行 { 执行代码块1 } 中的代码,
    如果 条件表达式1 不成立,才会去判断 条件表达2 是否成立,如果条件表达式2成立,则执行 { 执行代码块2 } 中的代码;
    如果 条件表达式2 不成立,才会去判断 条件表达3 是否成立;
    以此类推,如果所有的表达式都不成立,则执行 else 的代码块,注意,只能有 1 个执行入口

  • (3)例如:编写一个程序,输入芝麻信用分,显示对应结果;
    如果:
    信用分为100,则输出 信用极好
    信用分为(80,99],则输出 信用良好
    信用分为(60,80],则输出 信用一般
    其他情况 ,则输出 信用不及格

    	思路分析:1、接收输入的分数,一个 Scanner 对象
    			2、把分数保存到一个变量中
    			3、使用 if - else 多分支 判断,输出对应消息
    
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入你的芝麻信用分" );
    	int n1 = scanner.nextInt();
        if(n1 >= 1 && n1 <=100){    //这个可以使用异常处理机制来完成
    		if(n1 == 100){
    			System.out.println("信用极好" );
    		}else if(n1 > 80 && n1 <= 99){
    			System.out.println("信用良好" );
    		}else if(n1 >=60 && n1 <= 80){
    			System.out.println("信用一般" );
    		}else{
    			System.out.println("信用不及格" );
    		}
    	}else{
    		System.out.println("输入的信用分要在 1 ~ 100" );
    	}
    	
    	//输出  					
    	//请输入你的芝麻信用分
    	//97
    	//信用良好
    

4、嵌套分支

  • (1)基本介绍:
    在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支结构被称为外层分支。

    书写规范:不要超过三层,为保障代码的可读性

  • (2)语法:

     		if(条件表达式1){
     				if(条件表达式2){
     				执行代码块2;(可以有多条语句)
    				}
    		 		else if(条件表达式3){
    					执行代码块3;(可以有多条语句)
    		 		}   
    		 }else{
              .....
            }
    
  • (3)例如:编写一个程序,根据输入,显示对应结果
    如果:
    参加歌手比赛,如果初赛成绩大于 8.0,则进入决赛,否则提示淘汰
    并且根据性别提示进入男子组还是女子组
    输出成绩和性别,进行判断和输出信息

    	思路分析:1、接收输入的信息,一个 Scanner 对象
    			2、把信息分别保存到 变量中
    			3、使用 if - else 多分支、嵌套分支 判断,输出对应消息
    			     首先判断是否进入决赛,然后在 进入决赛的嵌套中 再判断是男子组还是女子组
        
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入你的成绩" );
    	double score = scanner.nextDouble();
    	if(score > 0.0){
    		if(score > 8.0){
    			System.out.println("你已经进入了决赛" );
    			System.out.println("请输入你的性别" );
    			char gender = scanner.next().charAt(0);
    			if(gender == '男' ){
    				System.out.println("你已进入决赛男子组");
    			}else if(gender == '女' ){
    				System.out.println("你已进入决赛女子组");
    			}else{
    				System.out.println("你输入的性别有误,请重新输入" );
    			}
    		}else{
    			System.out.println("你已经被淘汰");
    		}
    	}else{
    		System.out.println("你输入的成绩有误,请重新输入" );
    	}
    	//输出  		
    	//请输入你的成绩
    	//9
    	//你已经进入了决赛
    	//请输入你的性别
    	//男
    	//你已进入决赛男子组
    
  • (4)课后练习:写出一个出票系统:根据淡旺季的月份和年龄,打印票价

    	思路分析:1、接收输入的信息,一个 Scanner 对象
    			2、把信息分别保存到 变量中
    			3、使用 if - else 多分支、嵌套分支 判断,输出对应消息
    			     首先先根据输入的月份判断淡旺季,然后在 不同的月份嵌套中 根据输入判断票价
        	 
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入当前月份" );
    	int month = scanner.nextInt();
    	if(month >= 4 && month <= 10){
    		System.out.println("请输入你的年龄" );
    		int age = scanner.nextInt();
    		if(age >=18 && age <=60){
    			System.out.println("你所购买的票价是:60 元" );
    		}else if(age < 18){
    			System.out.println("你所购买的票价是:30 元" );
    		}else if(age >60){
    			System.out.println("你所购买的票价是:20 元" );
    		}else{
    			System.out.println("你输入的年龄有误,请重新输入" );
    		}
    	}else if((month > 10 && month <= 12) || (month > 0 && month <= 3)){
    		System.out.println("请输入你的年龄" );
    		int age = scanner.nextInt();
    		if(age >=18 && age <=60){
    			System.out.println("你所购买的票价是:40 元" );
    		}
    	}else {
    		System.out.println("你输入的月份有误,请重新输入" );
    	}
    
    	//输出  	
    	//请输入当前月份
    	//8
    	//请输入你的年龄
    	//40
    	//你所购买的票价是:60 元
    

5、switch 分支结构

  • (1)语法

    	switch(条件表达式){
    		case 常量1:
    			执行代码块1;(可以有多条语句)
    			break;
    		case 常量2:
    			执行代码块2;(可以有多条语句)
    			break;
    		.....
    		case 常量n:
    			执行代码块n;(可以有多条语句)
    			break;
    		default:
    			default 执行代码块;
    			break;
         }
    
  • (2)使用细节
    1、switch 关键字,表示 switch 分支

    2、表达式对应一个值

    3、case 常量1:当 条件表达式的的值 等于 常量1,那么就 执行代码块1

    4、break 表示退出这个switch

    5、如果 条件表达式的的值 不等于 常量1,则继续向下寻找,看是否有匹配,如果又匹配的,就执行相应代码块

    6、如果一个都没有匹配上,执行 default 中的代码块

  • (3)注意事项和细节讨论
    1、表达式数据类型,应和 case 后的常量类型保持一致,或者是可以自动转成可以相互比较的类型,比如输入的是 字符,而常量是 int

    2、switch(表达式)中表达式的返回值必须是 byte short int char enum(枚举) String // 注意 没有浮点型

    3、case 子句中的值必须是常量,而不能是变量,,比如

    	char c1 = 'a';
        char c2 = 'b';
        switch(c1){
        case c2:    //这个地方就会报错,不能用 c2 要用 'b'
        	System.out.println("OK");
        	break;
        }
    

    4、default 子句是可选的,没有也行,当没有匹配的 case 时,执行 default

    5、break 语句用来在执行一个 case 分支后使得程序跳出整个 switch 语句块,如果没有 break,则程序会在 switch 中顺着往下执行,一直到结尾这就是字句代码块穿透

  • (4)switch 和 if 的比较

    1、如果判断的具体数值不多,且符合 byte,short,int,char,enum,String 这 6 种数据类型,建议 switch

    2、对于区间判断,对结果为 boolean 类型判断,使用 if ,if 使用的范围更广

  • (5)课后练习①:写出一个程序,该程序可以接收一个字符,a,b,…,g,分别对应一周七天,通过 switch 完成

    	思路分析:1、接收输入的信息,一个 Scanner 对象
    			2、把信息分别保存到 变量中
    			3、使用 switch case来判断应该输出什么对应消息
    
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入一个字符 a~ g");
    	char c = scanner.next().charAt(0);
    	//java中只要是有值返回就是一个表达式
    	switch(c){
    	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("没有匹配结果,请检查输入");
    	}
    	
    	System.out.println("退出了 switch,但是程序继续在执行");
    	//输出  	
    	//请输入一个字符 a~ g
    	//c
    	//星期三
    	//退出了 switch,但是程序继续在执行
    
  • (6)课后练习②:写出一个程序,转换大小写,只转换a,b,c,d,e,其他的输出other

    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入一个小写字符");
    	char c = scanner.next().charAt(0);
    	//java中只要是有值返回就是一个表达式
    	switch(c){
    	case 'a':
    		System.out.println("A");
    		break;
    	case 'b':
    		System.out.println("B");
    		break;
    	case 'c':
    		System.out.println("C");
    		break;
    	case 'd':
    		System.out.println("D");
    		break;
    	case 'e':
    		System.out.println("E");
    		break;
    	default:
    		System.out.println("other");
    	}
    	//输出  	
    	//请输入一个小写字符
    	//a
    	//A
    
  • (7)课后练习③:写出一个程序,输入一个百分制的分数,大于60,输出合格,小于60 输出不合格

    	设计思路:要转换一下,int score 获取收据,然后 int x = score / 60;及格的人 x = 1;不及格的人 x = 0; case 子句用 x 来完成
    	
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入成绩");
    	int c = scanner.nextInt();
    	int x = c / 60;
    	switch(x){
    	case 1:
    		System.out.println("合格");
    		break;
    	case 0:
    		System.out.println("不合格");
    		break;
    	default:
    		System.out.println("输入有误");
    	}
    	//输出  	
    	//请输入成绩
    	//30
    	//不合格
    
  • (8)课后练习④:写出一个程序,根据用户输入的月份确定季节(使用穿透)

    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入月份");
    	int c = scanner.nextInt();
    	switch(c){
    	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;
    	}
    	//输出  
    	//请输入月份
    	//6
    	//夏
    

四、循环控制

1、for 循环控制

  • (1)基本介绍:听其名,知其意,就时让你的代码可以循环的执行

  • (2)基本语法:

    	for(循环变量初始化 ; 循环条件 ; 循环变量迭代){
    		循环操作(语句) ;//若这个部分只有一条语句,则{}可以省去,但是不建议
    	}
    

    说明:四要素:循环变量初始化 ; 循环条件 ; 循环变量迭代;循环操作(语句)

  • (3)注意事项和细节说明

    0)、执行顺序:循环变量初始化 ; 循环条件判断; 进入循环体,执行循环操作(语句); 循环变量迭代

    1)、循环条件时返回一个 blooean 的表达式

    2)、for(;循环判断条件;)中的初始化和变量迭代可以写在其他地方,但是 两边的 ; 不能省略

    3)、循环变量的初始化可以有多条初始化语句,但要求类型一样,并且中间用 , 隔开

    4)、使用内存分析法,下面输出为

    	int count =3;
    	for(int i= 0,j = 0;i < count;i++,j += 2){
    		System.out.println("i = " + i + "  j = " + j);//这个执行完之后 循环变量才会按照循环变量迭代去修改
    	}
    	//输出
    	//i = 0  j = 0
        //i = 1  j = 2
        //i = 2  j = 4
    
  • (4)课堂练习
    1)、输出 0 ~ 100 所有 9 的倍数,统计个数和总和

    	int count = 0;
    	int sum = 0;
    	for(int i = 1 ; i < 100 ; i ++){
    		if(i % 9 == 0){
    			System.out.println(i);
    			count ++;
    			sum += i;
    		}
    	}
    	System.out.println(count);
    	System.out.println(sum);
    	//输出  9  18  27  36  45  54  63  72  81  90  99  
    	//11
    	//594
    		
    	编程思想,可以把其实,终止,倍数都用变量来表示
    	
    	int start = 1;
    	int end = 100;
    	int t = 9;   // 倍数
    	int count = 0;
    	int sum = 0;
    	for(int i = start ; i < end ; i ++){
    		if(i % t == 0){
    			System.out.println(i);
    			count ++;
    			sum += i;
    		}
    	}
    	System.out.println(count);
    	System.out.println(sum);
    

    2)、输出这样的结果

    	//输出
    	//0+10 = 10
    	//1+9 = 10
    	//2+8 = 10
    	//3+7 = 10
    	//4+6 = 10
    	//5+5 = 10
    	//6+4 = 10
    	//7+3 = 10
    	//8+2 = 10
    	//9+1 = 10
    	//10+0 = 10
    
    	先化繁为简,先输出一列,再输出一列,找出规律,合并这几列
    	for(int i = 5,j = 0; i >= 0 ; i--,j++){
    		System.out.println(i + "+" + j + " = " +(i + j));
    	}
    	//输出
    	5+0 = 5
    	4+1 = 5
    	3+2 = 5
    	2+3 = 5
    	1+4 = 5
    	0+5 = 5
    	//先死后活
    	int n=10;
    	for(int i = 0 ; i <= n ; i++){
    		System.out.println(i + "+" + (n - i) + " = " + n));
    	}
    

2、whlie 循环控制

  • (1)基本语法:

    	whlie(循环条件){ //循环条件 为真,进入循环内部
    		循环体(语句);
    		循环变量迭代   ;     //执行后,再次去判断 循环条件
    	}
    	
    	while 也有四要素,只是放的地方和 for 不一样
    	while 退出之后,程序会继续执行,不会终止
    
  • (2)注意事项和细节说明

    1)、循环条件是返回一个 boolean型 的表达式

    2)、while 循环是先判断再执行语句

  • (3)课堂练习:

    1)、打印 1 ~ 100之间所有能被 3 整除的数

    	int i =1;
    	while(i < 100){
    		if(i % 3 == 0){
    			System.out.print(i + "  ");
    		}
    		i++;
    	}
    	//输出
    	3  6  9  12  15  18  21  24  27  30  33  36  39  42  45  48  51  54  57  60  63  66  69  72  75  78  81  84  87  90  93  96  99  
    

    2)、打印40 ~ 200 之间所有的偶数

    	//编程思想:同样的,还可以把循环条件用变量来代替
    	int i =40;
    	while(i < 200){
    		if(i % 2 == 0){
    			System.out.print(i + "  ");
    		}
    		i++;
    	}
    

3、do while循环控制

  • (1)基本语法:

    	d0{ 
    		循环体(语句);
    		循环变量迭代   ;     //执行后,再次去判断 循环条件
    	}while( 循环条件 ) ;
    

    注意:
    1)、do while 是关键字

    2)、do while 也有四要素,只是放的地方不一样

    3)、先执行代码块,也就是说,代码块一定会至少执行一次

    4)、最后要有一个 ;

    5)、 while 是先判断,再执行;do while 是先执行,再判断

  • (2)注意事项和细节说明
    1)、循环条件是返回一个 boolean型 的表达式
    2)、do while 是先执行,再判断,循环内代码块至少执行一次

  • (3)课堂练习:

    打印 1 ~ 100之间所有的数;统计他们的和;

    	int i = 1;
    	int sum = 0;
    	int j = 1;
    	int count = 0;
    	char answer;
    	
    	do{
    			System.out.println(i);
    			sum += i;
    			i++;
    	}while( i <= 100);
    	
    	System.out.print("1 ~ 100 的总和是" + sum);	
    

    统计1 ~ 200 能被五但是不能被0三整除的数;

    	//思路分析 统计1 ~ 200 能被五但是不能被0三整除的数
    	//先输出 1 - 200
    	//然后判断 %5 == 0 && % 3 != 0;
    	//统计满足条件的个数
    	//输出个数
    	do{
    			if(j % 5 == 0 && j % 3 != 0){
    				count++;
    			}
    			j++;
    	}while( j <= 200);
    	
    	System.out.println("1 ~ 200 能被五但是不能被0三整除的数有" + count + " 个");
    

    如果张三不还钱,就一直打到他还钱

    	do{
    		System.out.println("我问你 你还钱吗?");
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("请输入你的回答(y/n)");
    		answer = scanner.next().charAt(0);
    		System.out.println("他的回答是" + answer);
    		j++;
    	}while( answer == 'n');
    	
    	System.out.println("你终于还钱了");
    

4、多重循环控制

  • (1)、基本介绍
    1)、讲一个循环放在另一个循环体内,就形成了嵌套循环。其中 for/ while/ do while 均可以作为内层循环和外层循环[建议一般使用两层,不要超过三层]

    2)、实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次的循环

    3)、设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m * n 次

    4)、案例分析

    	for(int i = 0;i < 2;i++){
    		for(int j = 0; j < 3;j++){
    			System.out.println("i = " + i + "j = " + j);
    		}
    	}
    	//输出
    	//i = 0  j = 0
    	//i = 0  j = 1
    	//i = 0  j = 2
    	//i = 1  j = 0
    	//i = 1  j = 1
    	//i = 1  j = 2   
    
  • (2)、课堂练习
    1)、统计三个班的成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入],计算三个班的及格人数,每个班有 5 名同学

    	//化繁为简
    	//1.1、统计一个班的 5 个学生的成绩;一个 for 单层平均分循环
    	//1.2、得到一个班级的平均分,累计 所有成绩,再均分
    	//2.1、统计三个班的平均分 外层一个 班级循环,嵌套在 平均分循环外面
    	//3.1 、统计及格人数,定义一个count ,在班级平均分循环中,判断接收到的成绩是否及格,if 语句 count++ 
    	Scanner scanner = new Scanner(System.in);
    	double score = 0;
    	double sum = 0; //统计班级总分,为求平均使用
    	double ave = 0; //计算平均分
    	double total_score = 0;//三个班的平均分
    	int count = 0;  //计算及格的总人数
    	for(int i = 1; i <= 3; i++){  //i 表示班级 这个还可以再次优化 使用变量来搞定
    		for(int j = 1;j <= 5;j++){//j 表示学生
    			System.out.println("请输入第" + i + "个班的第 " + j +"个学生的成绩");
    			score = scanner.nextDouble();//获取键盘输入
    			System.out.println("成绩为 :" + score );
    			if(score >= 60){//及格判断
    				count++;
    			}
    			sum += score;	     //获取班级分数
    			total_score += score;//获取总分数
    		}
    		ave = score / 5;
    		System.out.println("\n第" + i + "个班级的平均分为 : " + ave );
    	}
    	total_score /= 15;
    	System.out.println("\n所有班级的平均分为 : " + total_score );
    	System.out.println("\n所有班级的及格人数为 : " + count );
    

    2)、打印输出 九九乘法表

    	//化繁为简
    	//0、1  先输出9行出来,单层 for循环
    	//0、2  在每一行中完成下列目标
    	//1.1、第 1 行输出 1 个,第2行输出 2个,以此类推,即 每一行 比 上一行 多出 一列 ,
    	//1.2、先输出 1 * 1 = 1  到 每一行的 行数  1 * 行数  = 行数 ,每一行的输出应该不换行,只有一行输出完了之后才会换行
    	//2.1、统计三个班的平均分 外层一个 班级循环,嵌套在 平均分循环外面
    	//3.1 、统计及格人数,定义一个count ,在班级平均分循环中,判断接收到的成绩是否及格,if 语句 count++ 
    	//先死后活,其中 行数可以用变量代替,来完成更多的乘法表
    	for(int i = 1; i <= 9; i++ ){   // i 是行数
    		for(int j = 1; j <= i; j++){// j 是每一行的列数,列数最多应该和行数相等
    			System.out.print( j + " * " + i + " = " + (i * j) +  '\t' );//输出乘法口诀
    		}
    		System.out.println();//使得换行
    	}
    	//输出结果
    	//1 * 1 = 1	
    	//1 * 2 = 2	2 * 2 = 4	
    	//1 * 3 = 3	2 * 3 = 6	3 * 3 = 9	
    	//1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16	
    	//1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25	
    	//1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36	
    	//1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49	
    	//1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64	
    	//1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81
    

    3)、打印输出空心金字塔

    		      *
    		     * *
    		    *   *
    		   *     *
    		  *       *
    		 ***********	
    
    • //1.1、先输出一个直角三角形 *

      	int totalLever =6;//层数
      	for(int i = 1; i <= totalLever; i++ ){   // i 是行数
      		for(int j = 1; j <=  i ; j++){// j 是每一行的列数,列数最多应该和行数相等
      			System.out.print("*");//输出*
      		}
      		System.out.println();//使得换行
      	}	
      	
      			*
      			**
      			***
      			****
      			*****
      			******
      
    • //1.2、然后把上方的 直角三角形 补全成等腰三角形

      		      *
      		     ***
      		    *****
      		   *******
      		  *********
      		 ***********
      		*************
      
    • //1.3、第一行移动的是(最后一行个数 - 第一行个数) / 2,

      第二行移动的是(最后一行个数 - 第二行个数) / 2,

      接下来的移动规律以此类推,先输出实心金字塔

    • //1.4、移动过后,每一行 打印的 * 的个数 为

      	 行数   *1		1
            2		3
            3 	5
            4		7
        得到规律: *= 行数 X 2 - 1
      
      	int totalLever =6;//层数
      	for(int i = 1; i <= totalLever; i++ ){   // i 是行数
      		for(int k = 0; k < totalLever - i; k++){
      			System.out.print(" ");//输出空格,移动位置
      		}	
      		for(int j = 1; j <=  i* 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等
      			System.out.print("*");//输出*
      		}
      		System.out.println();//使得换行
      	}
      
    • //2、使空心

      	      *
      	     * *
      	    *   *
      	   *     *
      	  *       *
      	 *         *
      
      	//    让每一行第一个和最后一个位置打印出* ,
      	//	     第一个位置    就是 空格结束的位置 为:j == 1
      	//	     最后一个位置就是  原来实心金字塔最后一个 * 的位置 : 2 * 当前行数 -1,
      	//	     在打印 * 的循环中插入 if 条件判断语句,是 ||,否则就输出空格
      	int totalLever =6;//层数
      	for(int i = 1; i <= totalLever; i++ ){   // i 是行数
      		for(int k = 0; k < totalLever - i; k++){
      			System.out.print(" ");//输出空格,移动位置
      		}	
      		for(int j = 1; j <=  i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等
      			if(j == 1 || j == i * 2 -1 ){
      				System.out.print("*");//输出*
      			}else{
      				System.out.print(" ");//输出*
      			}
      			
      		}
      		System.out.println();//使得换行
      	}
      
    • //3、把最后一行补齐,加一个判断,判断这一行是否为最后一行,如果是,直接输出 全*,这个可以放在上面输出空格那里,就不用多写一个 if 了

      	      *
      	     * *
      	    *   *
      	   *     *
      	  *       *
      	 ***********	
      
      	int totalLever =6;//层数
      	for(int i = 1; i <= totalLever; i++ ){   // i 是行数
      		for(int k = 0; k < totalLever - i; k++){
      			System.out.print(" ");//输出空格,移动位置
      		}
      			for(int j = 1; j <=  i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等
      				if(j == 1 || j == i * 2 -1 || i == totalLever){
      					System.out.print("*");//输出*
      				}else{
      					System.out.print(" ");//输出*
      				}
      			}
      			System.out.println();//使得换行
      		}
      
    • //4 、终极版:先死后活,其中 行数可以用变量代替,来完成更多的形状的空心金字塔

      	Scanner scanner = new Scanner(System.in);
      	System.out.println("请输入你想要打印的空心金字塔的层数:");//输出*
      	int totalLever =scanner.nextInt();//层数
      	for(int i = 1; i <= totalLever; i++ ){   // i 是行数
      		for(int k = 0; k < totalLever - i; k++){
      			System.out.print(" ");//输出空格,移动位置
      		}
      			for(int j = 1; j <=  i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等
      				if(j == 1 || j == i * 2 -1 || i == totalLever){
      					System.out.print("*");//输出*
      				}else{
      					System.out.print(" ");//输出*
      				}
      			}
      			System.out.println();//使得换行
      		}
      	
      	//输出 
      	//请输入你想要打印的空心金字塔的层数:
      	//8
      	       *
      	      * *
      	     *   *
      	    *     *
      	   *       *
      	  *         *
      	 *           *
      	***************
      

五、跳转控制语句 break - - for 循环控制

  • 1、基本介绍

    听其名,知其意,就时让你的代码可以循环的执行,所有循环内部都可以使用

  • 2、基本语法

    	{
    		...
    		break;
    		....
    	}
    
  • 3、快速入门

     	for(int i = 1; i <= 10; i++ ){ 
         	if (i == 3){
         	break;
         	}
         	System.out.println("i = " + i);
         }
    	//输出     	
    	//i = 1
    	//i = 2
    
  • 4、注意事项和细节说明
    (1)、break语句出现在多层嵌套中的语句块中使,可以通过标签指明要终止的使那一层语句块
    (2)、标签的基本使用
    1)、语法

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

    2)注意:
    ①、berak 语句可以指定退出哪层

    ②、label1 使标签,由程序员指定,label 可以写成任意 ,满足标识符命名规则即可

    ③、break 指定到哪个label 就推出到哪里

    ④、实际开发中,尽量不要使用标签

    ⑤、如果没有指定 break ,默认推出最近的循环体

    #)实际应用

    	abc1:
    	for(int i = 1; i <=4; i++ ){ 
    		abc2:for(int j = 1; j <= 2; j++ ){
    			if(i == 2){
    			break;//等价于退出abc2  //输出  i = 1  i = 2  i = 3  i = 4
    			//reak abc1;  		   //输出  i = 1
    			}
    		}
    		System.out.println("i = " + i);
    	}
    
  • 4、课堂练习
    (1)、1 - 100以内的数据求和,求出 当 和 第一次大于 20 的当前数

    	//如果想在for循环 外面输出 i ,则需要定义一个变量 n ,或者把 i 定义在循环外部 (int i = 0;);
    	int sum = 0;
    	int n = 0;
    	for(int i = 1; i <=100; i++ ){ 
    		n = i;
    		sum += i;
    		if(sum > 20){
    			System.out.println("累计的和大于20");
    			System.out.println("i = " + i);
    			break;
    		}
    	}
    	System.out.println("i = " + n);//输出  i = 6
    	//输出
    	//累计的和大于20
    	//i = 6
    

    (2)、实现登录验证,有三次机会,如果用户名为 “陈然”,密码 "666"提示登陆成功,否则提示还有几次机会

    	思路:
    	用 for 循环嵌套,如果 输入密码正确,则使用 break 退出for 循环
    	设计一个登陆机会 的 变量 ,每次不成功,就会 -- ,然后判断 == 0 ?,
    		如果 != ,则提示还有几次机会,如果 ==0,则输出 你输入的密码错误,刷新页面
    	Scanner scanner = new Scanner(System.in);
    	String name = "";
    	String password = "";			
    	int chance = 3;
    	for(int i = 1; i <=3; i++ ){ 
    		 System.out.println("请输入你的用户名:");
    		 name = scanner.next();
    		 System.out.println("请输入你的用户名:");
    		 password = scanner.next();
    		 if("陈然".equals(name) && "666".equals(password)){
    			 System.out.println("登陆成功"); 
    			 break;
    		 }else{
    			 chance--;
    			 System.out.println("你还有" + chance + "次 机会"); 
    		 }
    	}
    	//输出
    	//请输入你的用户名:
    	//陈鑫
    	//请输入你的用户名:
    	//666
    	//你还有2次 机会
    	//请输入你的用户名:
    	//陈然
    	//请输入你的用户名:
    	//666
    	//登陆成功
    

六、跳转控制语句 continue

  • (1)、基本介绍

    1、coutinue 语句用于结束本次循环,继续执行下一次循环,continue 执行时,自动完成循环变量的迭代,然后开启下一次循环条件判断

    2、continue 语句出现在多层嵌套的循环语句中时,可以通过标签要跳过的是那一层循环,不写标签默认跳出最近的循环,使用方法与break 中标签一致,这里不展开

  • (2)、语法

        {
        	...
        	continue;
        	...
        }
    
  • (3)、课堂练习

    	int i = 1;
    	while(i <= 4){
    		i++;
    		if(i ==2){
    			continue;
    		}
    		System.out.println("i = " + i);
    	}
    	//输出
    	//i = 3
    	//i = 4
    	//i = 5
    

七、跳转控制语句 return

  • (1)、基本介绍

    return 使用在方法中,表示跳出所在的方法,如果写在 main()方法中,则会退出程序

  • (2)、课堂练习

    	for(int i = 1; i <=3; i++ ){ 
    		if(i == 2){
    			System.out.println("ii");
    			//return;	//输出  helloworld ii
    			//continue;	//输出  helloworld ii helloworld 你好
    			break;	//输出  helloworld ii 你好
    		}
    		System.out.println("helloworld");
    	}
    	System.out.println("你好");
    

八、课后练习

  • (1)、编程实现以下功能
    某人有100,000元,每经过一次路口,要交费,规则如下
    当现金 > 50000时,每次交 5%
    当现金 <= 50000时,每次交1000
    问:可以经过多少次路口,(while break完成)
    	//思路分析
    	//while 的条件是身上的钱大于0,所以定义一个变量来存钱,也定义一个变量来存储通过的路口数目
    	//while 内部写 if 语句,来扣钱,if 条件时钱的数量范围  >50000 else if 的范围是  <= 50000
    	//然后在 if 的执行语句块中 扣钱
    	//上述的 else if 里面还要有一个 if 是判断钱够不够通过下一个路口也就是钱 >= 1000?,如果不能,则break
    	int count = 0;
    	double money = 100000;
    	while(true){
    		if(money > 50000){
    			money = money * 0.95;
    			count++;
    		}else if( money >= 1000){
    			    money -= 1000;
    				count++;
    			  }else{
    				 break;
    			  }
    	}
    	System.out.println("你一共通过了 " + count + " 个路口");//62个
    
  • (2)、判断一个数是不是水仙花数 水仙花数:一个三位数 的 各个位置上的立方和 等于其本身 例如 153 = 111 + 333 + 555
    	//思路,这就是求个位、十位、百位的具体数值,然后 if(判断公式是否为真)
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("请输入一个数:");
    	int n = scanner.nextInt();
    	int ge = n % 10;
    	int shi = (n%100)/10;
    	int bai = n/100;
    	if(ge*ge*ge + shi*shi*shi + bai*bai*bai == n  ){
    		System.out.println(n + "  是一个水仙花数");
    	}else{
    		System.out.println(n + "  不是一个水仙花数");
    	}
    	
    	//求得100 - 1000 的水仙花数
    	for(int i = 100; i <1000; i++ ){
    		int ge = i % 10;
    		int shi = (i%100)/10;
    		int bai = i/100;
    		if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i  ){
    		System.out.println(i + "  是一个水仙花数");//371 153 370 407
    		}
    	}
    
  • (3)、输出 1 - 100 之间所有被5整除的数,5 个为 1 行
    	//思路:
    	//判断是否整除 5 
    	//定义一个变量来存储每一行输出的个数,到达 5 个后,启动换行操作
    	int count = 0;
    	for(int i = 1; i <=100; i++ ){
    		if(i % 5 == 0){
    			System.out.print((i) +" \t");
    			count ++;
    			if(count == 5){
    				System.out.println();
    				count = 0;
    			}
    		}
    	}
    	//5 	10 	15 	20 	25 	
    	//30 	35 	40 	45 	50 	
    	//55 	60 	65 	70 	75 	
    	//80 	85 	90 	95 	100 	
    
  • (4)、输出小写 a - z 以及 大写Z - A
    	//思路:
    	//字符的本质是一个编码,我们能对这个编码进行操作, 接下来就是循环 + / -
    	char small_a = 97;
    	char big_Z = 90;//大写字符 = 小写字符 - 22
    	for(int i = 0; i <25; i++ ){
    		System.out.print(small_a + "  ");
    		small_a ++;
    	}
    	System.out.println();
    	for(int i = 0; i <25; i++ ){
    		System.out.print(big_Z + "  ");
    		big_Z --;
    	}
    	System.out.println();
    
  • (5)、求1 - 1/2 + 1/3 - 1/4…1/100 的值
    	//思路
    	//分母逐渐递增,用for 来完成
    	//分子是 1 / -1 来回切换,只需要判断位数 (偶数位为负,奇数位为正) 即可 
    	double sum = 0;
    	for(int i = 1; i <= 100; i++ ){
    		if(i % 2 == 0){
    			sum -= 1.0/i ;//隐藏陷阱,分子的 1 写成1.0
    		}else{
    			sum += 1.0/i; 
    		}
    	}
    	System.out.println(sum);//输出  0.688172179310195
    
  • (6)、求 1 + (1+2) + (1+2+3) + … + (1+2+3+…+100) 的结果
    	//双层循环外面一层是第多少次 + ,为 里面一层 提供加的结束数值
    	int sum = 0;
    	for(int i = 1; i <= 100; i++ ){
    		for(int j = 1; j <= i; j++ ){
    			sum += j ;
    		}
    	}
    	System.out.println(sum);//171700
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值