zoukankan      html  css  js  c++  java
  • JAVA——选择,循环,顺序控制结构

    一、顺序控制

    介绍:程序从上到下逐行地执行,中间没有任何判断和跳转

    注意事项:

    • Java中定义变量时采用合法的前向引用。

    二、选择控制

    2.1分支控制

    2.1.1单分支

    image-20211120211243507

    2.1.2双分支

    image-20211120212849933

    2.1.3分支控制if-else

    image-20211120224442222

    image-20211120224326477

    注意:

    1. 多分钟可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有
    2. 如果有else,如果所有的条件表达式都不成立,则默认执行else代码块

    2.1.4嵌套分支

    在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外 层分支。老师建议: 不要超过 3 层


    2.2switch分支结构

    1. switch关键字,表示switch分支
    2. 表达式对应一个值
    3. case 常量1:当表达式的值等于 常量1,就执行 语句块1
    4. break:退出switch
    5. 如果一个都没有匹配,就执行default

    image-20211121153055372

    细节讨论

    1.表达式数据类型,应和case 后的常量类型一致

    • 或者是可以 自动转换成可以相互比较的类型,比如输入的是字符,而常量是int

    2.switch(表达式) 中表达式的返回值必须是:(byte,short,int,char,enum[枚举],Sting)

    3.case子句中的值必须是常量 或者常量表达式,不能是变量

    4.default子句 是可选的,当没有匹配case时默认执行default

    5.如果没有写break,程序会顺序执行到switch结尾,除非遇到一个break;

    • break语句用来执行一个case分支后使程序跳出switch语句块

    image-20211121161952910

    练习

    1. 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出 "other"。

    2. 对学生成绩大于 60 分的,输出"合格"。低于 60 分的,输出"不合格"。(注:输入的成绩不能大于 100), 提示 成绩/60

    3. 根据用于指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季

    4. 课堂练习, 提示 使 用穿透

    题目1

    使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出 "other

    import java.util.Scanner;
    
    public class SwitchExercise{
    
    	public static void main(String[] args){
    		Scanner myScanner = new Scanner(System.in);
    		char ch = myScanner.next().charAt(0);
    		switch(ch){
    			case 'a':
    				ch = 'A';
    				System.out.println(ch);
    				break;
    			case 'b':
    				ch = 'B';
    				System.out.println(ch);
    				break;
    			case 'c':
    				ch = 'C';
    				System.out.println(ch);
    				break;	
    			case 'd':
    				ch = 'D';
    				System.out.println(ch);
    				break;	
    			case 'e':
    				ch = 'E';
    				System.out.println(ch);
    				break;
    			default:
    				System.out.println("你的输入有误");					
    		}
    	}
    } 
    

    题目2

    对学生成绩大于 60 分的,输出"合格"。低于 60 分的,输出"不合格"。(注:输入的成绩不能大于 100), 提示 成绩/60

    import java.util.Scanner;
    
    public class SwitchExercise01{
    
    	public static void main(String[] args){
    		Scanner myScanner = new Scanner(System.in);
    		System.out.print("请输入学生的成绩:");
    		double score = myScanner.nextDouble();
    
    		//把用score/60并转换成int类型如果等于1,就是60以上及格
    		//如果不等于1,就是不及格
    		if(score>=0 &&score<=100){
    			switch((int)score/60){
    				case 1:
    					System.out.print("成绩合格");
    				case 0:
    					System.out.print("成绩不合格");	
    			}
    		}else{
    			System.out.print("输入的成绩有误");
    		}
    	}
    } 
    

    题目3

    根据用于指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季

    import java.util.Scanner;
    
    public class SwitchExercise02{
    
    	public static void main(String[] args){
    		Scanner myScanner = new Scanner(System.in);
    		System.out.print("请输入月份:");
    		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("请输入正确的月份");
    				break;	
    		}
    	}
    } 
    

    2.3 switch和if的比较

    1. 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可 以使用,建议使用 swtich 语句
    2. 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围

    三、循环控制

    3.1for循环

    3.1.1基本语法

    image-20211122215156060

    1. for 关键字,表示循环控制

    2. for 有四要素:

    1)循环变量初始化

    2)循环条件

    3)循环操作

    4)循环变量迭代

    1. 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码

    2. 如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省

    3.1.2注意事项和细节

    1. 循环条件是返回一个布尔值的表达式
    2. for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略
    3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开循环变量迭代可以有多条变量迭代 语句中间用逗号隔开
    
    public class ForDetail{
    
    	public static void main(String[] args){
    
    			int i = 1;//循环变量初始化,for循环结束之后,还想使用这个i,就写在外面
    			for( ; i <= 10;){
    				System.out.println("Hello World!" + i);
    				i++;
    			}
    
    			System.out.println(i);//11
    			for(;;){//表示一个无限循环
    				System.out.println("ok~");
    			}
    		}
    	}
    } 
    

    练习

    题目1:打印1~100之间所有是9的倍数的整数,并统计个数及和

    
    //打印1~100之间所有是9的倍数的整数,并统计个数及和
    public class ForExercise{
    
    	public static void main(String[] args){
    		//1.利用for循环进行搜索 for(int i=1;i<100;i++)
    		//2.进行判断,如果i满足 i%9==0 则输出i的值,并利用cnt变量记录个数
    		//cnt变量默认为1
    		//3.求和:满足条件后,把i加到sum里面去。
    		int cnt = 0;
    		int sum = 0;
    		for(int i =1; i <= 100; i++){
    			if( i % 9 == 0 ){
    				System.out.println(i);
    				sum+=i;
    				++cnt;
    			}
    		}
    		System.out.println("1~100中9的倍数的个数为: " + cnt);
    		System.out.println("1~100中9的倍数和为: " + sum);
    	}
    } 
    

    方法2:

    
    //打印1~100之间所有是9的倍数的整数,并统计个数及和
    public class ForExercise{
    
    	public static void main(String[] args){
    		//1.利用for循环进行搜索 for(int i=1;i<100;i++)
    		//2.进行判断,如果i满足 i%9==0 则输出i的值,并利用cnt变量记录个数
    		//cnt变量默认为1
    		//3.求和:满足条件后,把i加到sum里面去。
    		int cnt = 0;
    		int sum = 0;
    		int i = 9;
    		int end =100;
    		for(int j =1; i*j <= end; j++){
    			System.out.println(i*j);
    			sum+=i*j;
    			++cnt;
    		}
    		System.out.println("1~100中9的倍数的个数为: " + cnt);
    		System.out.println("1~100中9的倍数和为: " + sum);
    	}
    } 
    

    3.2while循环

    基本形式:

    image-20211123164222987

    3.2.1注意事项和细节

    1. 循环条件是返回一个布尔值的表达式
    2. while循环是先判断再执行语句

    练习

    题目一:打印 1—100 之间所有能被 3 整除的数 [使用 while, 老师评讲 ]

    
    public class WhileExercise{
    
    	public static void main(String[] args){
    		//打印 1—100 之间所有能被 3 整除的数
    		
    		int i = 1;
    		int end = 100;
    		while(i<=end){
    			if(i%3==0){
    				System.out.println(i);
    			}
    			i++
    		}
    	}
    } 
    

    题目二:打印 40—200 之间所有的偶数 使用 while

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

    3.3do while循环

    循环变量初始化;

    do{ 
    
    	循环体(语句); 
    
    	循环变量迭代; 
    
    }while(循环条件);
    
    1. do while 是关键字
    2. 也有循环四要素, 只是位置不一样
    3. 先执行再判断,也就是说,一定会至少执行一次
    4. 最后 有一个 分号 ;
    5. whiledo..while 区别举例

    练习

    题目:打印 1—100 并计算 1—100的和

    
    public class DoWhileExercise{
    
    	public static void main(String[] args){
    		//打印 1—100之并计算和
    		
    		int sum = 0;
    		int i = 1;
    		int end = 100;
    		do{
    			sum+=i;
    			System.out.println("i=" + i);
    			i++
    		}while(i<=end);
    		
    	}
    } 
    

    题目: 统计 1---200 之间能被 5 整除但不能被 3 整除的个数

    
    public class DoWhileExercise01{
    
    	public static void main(String[] args){
    		//统计 1---200 之间能被 5 整除但不能被 3 整除的个数
    		
    		int cnt = 0;
    		int i = 1;
    		int end = 200;
    		do{
    			if(i % 5 ==0 && i % 3 != 0){
    					System.out.println("i=" + i);
    					cnt++;
    			}
    			i++;
    		}while(i<=end);
    		System.out.println("cnt=" + cnt);
    	}
    } 
    

    题目:如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为止

    import java.util.Scanner;
    
    public class DoWhileExercise02{
    
    	public static void main(String[] args){
    		//如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为止
    		Scanner myScanner = new Scanner(System.in);
    		char anwser = ' ';
    		//方法1
    		/*do{
    			System.out.println("还钱吗?y/n");
    			anwser = myScanner.next().charAt(0);
    			if (anwser!='y') {
    				System.out.println("五连鞭");
    			}else{
    				System.out.println("张三还钱了");
    			}
    		}while(anwser!='y');*/
    
    		do{
    			System.out.println("老韩使出五连鞭");
    			System.out.println("老韩问:还钱吗?y/n");
    			anwser = myScanner.next().charAt(0);
    			System.out.println("张三的回答:" + anwser);
    		}while(anwser!='y');
    
    		System.out.println("张三还钱了");
    		
    	}
    } 
    

    3.4多重循环

    1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
      • 建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差
    2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内 层循环才可结束外层的当次循环,开始下一次的循环。
    3. 设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。

    练习

    题目:统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

    import java.util.Scanner;
    
    public class MulForExercise01{
    
    	public static void main(String[] args){
    		//统计统计 3 个班成绩情况,每个班有 5 名同学,
    		//求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
    		
    		Scanner myScanner = new Scanner(System.in);
    		double score = 0;
    		double average = 0;
    		double sum = 0;
    		int cnt = 0;//统计的及格人数
    		double classSum;
    		double classAve;
    
    		for(int i = 1 ; i<=3; i++){
    			 classSum = 0;//统计各班的总分
    			 classAve =0;//统计各班的平均分
    			for(int j = 1 ; j<=5;j++){
    				System.out.println("请输如第 "+ i +"班"+ "第" +j +"个同学的成绩:");
    				score = myScanner.nextDouble();
    				classSum+=score;
    				if(score>=60){
    					cnt++;//分数大于60的cnt+1,cnt,代表及格个数
    				}
    			}
    			sum+=classSum;//把各班级加到sum里面去,sum位总成绩之和
    			classAve= classSum/5.0;
    			System.out.println("第 "+ i +"班的平均成绩是:"+ classAve );
    			System.out.println("============================");
    			System.out.println("============================");
    		}
    		average = sum/15.0;
    		System.out.println("三个班的平均成绩是:"+ average);
    		System.out.println("及格人数:"+ cnt);
    	}
    } 
    

    题目:九九乘法表

    
    public class MulForExercise03{
    
    	public static void main(String[] args){
    		int i;
    		int j;
    		for( i = 1; i < 10 ;i++){
    			for( j = 1 ; j <=i ; j++){
    				System.out.print(j + "*" + i + "=" + i*j + "\t");
    			}	
    			System.out.print("\n");
    		}
    	}
    } 
    

    题目:经典的打印金字塔

    image-20211124145134201

    public class Stars{
    
    	public static void main(String[] args){
    	/*打印空心金字塔
    		totaLeave 层数
    		1.打印完整的金字塔
    		 1.1打印的空格
    		 	1.1.1 每层的空格数=总层数-1
    		 1.2打赢*
    	*/	
    	
    		for (int i = 1;i <= 5 ; i++ ) {//i 表示层数
    			
    			//在输出*之前,还要输出对应空格 
    			for (int k = 1; k <= 5-i; k++) {
    				System.out.print(" ");
    			}
    
    
    			for (int j = 1; j <= i *2  - 1; j++ ) {
    				System.out.print("*");
    			}
    			
    			System.out.print("\n");
    		}
    	}
    } 
    
    
    
    public class Stars{
    
    	public static void main(String[] args){
    	/*打印空心金字塔
    		1.打印完整的金字塔
    		*  			//第1层 有1个*	4个空格   
    	   ***			//第2层 有3个*	3个空格
    	  *****			//第3层 有5个*	2个空格
    	 *******		//第4层 有7个*	1个空格
    	*********		//第5层 有9个*	0个空格
    		2.打印空心金字塔
    				
    		* 			//第1层 有1个*	当前行的第一个位置是*,最后一个位置也是*
    	   * *			//第2层 有2个*	当前行的第一个位置是*,最后一个位置也是*	
    	  *   *			//第3层 有2个*	当前行的第一个位置是*,最后一个位置也是*
    	 *     *		//第4层 有2个* 	当前行的第一个位置是*,最后一个位置也是*
    	*********     	//第5层 有9个*	全部输出*
    		3.先死后活
    		层数变成变量
    	
    	*/	
    		int totalLevel = 20;
    		for (int i = 1;i <= totalLevel ; i++ ) {//i 表示层数
    			
    			//在输出*之前,还要输出对应空格 
    			for (int k = 1; k <= totalLevel - i ; k++) {
    				System.out.print(" ");
    			}
    			//输出*
    			for (int j = 1; j <= i * 2 - 1 ; j++ ) {
    				if ( i==totalLevel||j==1||j==i*2-1) {
    					System.out.print("*");
    				}else{
    					System.out.print(" ");
    				}
    				
    			}
    			//没打印完一行就换行
    			System.out.print("\n");
    		}
    	}
    } 
    

    3.5跳转控制语句break

    随机生成 1-100 的一个数,直到生成了 97 这个数,看看你一共用了几次?

    思路分析:

    • 循环,但是循环的次数不知道. -> break ,当某个条件满足时,终止循环
    • 通过该需求可以说明其它流程控制的必要性,比如 break
    random() 
    返回值为 double值为正号,大于等于 0.0 ,小于 1.0 
    

    介绍:break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]中

    基本语法:
    {
     break;
    }
    
    

    3.5.1break语句标签

    1. break语句出现在多重嵌套的语句块中,可以通过标签指明要终止的是哪一层语句块BreakDetial.java

    2. 标签的基本使用

    lable1:{
    lable2:	
        {
        
    	}
    }
    
    • break语句可以指定退出哪一层
    • lable1是标签,名字由程序员决定
    • break 后指定到那个lable就突出到哪里
    • 在实际的开发中,老韩建议尽量不使用标签
    • 如果没有指定break,默认退出最近的循环体

    练习

    题目:1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for + break】

    
    public class BreakDetail{
    
    	public static void main(String[] args){
    		int i;
    		int sum = 0;
    		for (i = 1;i <= 100 ;i++ ) {
    			sum+=i;
    			if(sum > 20){
    				System.out.println("第一次大于20的数="+ i);
    				break;
    			}
    		}
    	
    	}
    } 
    

    题目:实现登录验证,有 3 次机会,如果用户名为"丁真" ,密码"666"提示登录成功,否则提示还有几次机会,请使用 for+break 完成

    import java.util.Scanner;
    
    public class BreakExercise{
    
    	public static void main(String[] args){
    		Scanner myScanner = new Scanner(System.in);
    		String name = "";
    		String password = "";
    		int chance = 3;
    		int i;
    		for (i = 1; i<=3 ; i++ ) {
    			System.out.print("请输入用户名:");
    			name = myScanner.next();
    			System.out.print("请输入密码:");
    			password = myScanner.next();
    
    			if ( "丁真".equals(name)  &&  "666".equals(password)) {
    				//这样写可以避免空指针
    				System.out.println("登陆成功~");
    				break;
    			}
    			chance--;
    			System.out.println("你还有" + chance + "次登陆机会");
    		}
    		System.out.println("程序运行结束");
    	}
    } 
    

    注意:

    • 字符串不能直接进行比较,要用equal进行比较
      • 格式:"字符串".equals(字符串变量名)

    3.6continue跳转控制语句

    1. continue 语句用于结束本次循环,继续执行下一次循环
    2. continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的 使用的规则一样.

    image-20211125101023169

    import java.util.Scanner;
    
    public class Java_Continue{
    
    	public static void main(String[] args){
    		label1:
    		for(int j = 0; j < 4; j++){
    		label2:
    			for(int i = 0; i < 10; i++){
    				if(i == 2){
    				//看看分别输出什么值,并分析
    				//continue ;
    				//continue label2;
    				continue label1;
    				}
    				System.out.println("i = " + i);//4组 i=0,i=1
    			}
    		}
    	}
    } 
    

    3.6.1跳转控制语句-return

    return 使用在方法,表示跳出所在的方法

    本章作业

    
    public class Homework01{
    
    	public static void main(String[] args){
    		/* 
    		我的思路
    		int cnt = 0;
    		double money = 100000;
    		while(money>=1000){
    			if (money>50000) {
    				money-=money*0.05;
    
    			}else{
    				money-=1000;
    			}
    			cnt++;
    		}
    		System.out.println("该人可以经过" + cnt + "次路口");//62次 
    		*/
    
    		double money = 100000;
    		int cnt = 0;
    		while(true){
    			if(money>50000){
    				money -= money*0.05;
    				cnt++;
    			}else if(money>=1000&&money<=50000){
    				money -= 1000;
    				cnt++;
    			}else{
    				break;
    			}
    		}
    		System.out.println("可以经过" + cnt + "次路口");
    	}
    } 
    
  • 相关阅读:
    音乐商店
    sort函数
    优先队列
    畅通工程 并查集,最小生成树,最短路径
    线段树(segment tree )
    bfs
    完全背包
    【Matlab】向图像域添加噪声/高斯/均匀/伽马/指数/椒盐
    【手帐】Bullet Journal教程
    【Matlab】取整函数:fix/round/floor/ceil
  • 原文地址:https://www.cnblogs.com/DL50/p/15798744.html
Copyright © 2011-2022 走看看