第4章:流程控制

文章目录

  • 第四章 流程控制
    • 一、选择
      • 1.if
        • if ..else..
        • 小知识:debug
        • if 多个else if ... else
      • 2. switch case
        • 定义:做多分支判断
        • 语法
        • [switch的规则]
        • 优缺点
    • 二、循环
      • (一)循环方式
        • 1. while
        • 2. do while
        • 3.for
      • (二)嵌套循环
      • (三)跳出循环
        • 2.continue
      • (四)循环标签

第四章 流程控制

流程控制:就是程序执行的过程:顺序、选择、循环

  1. 顺序:程序按部就班的执行
  2. 选择:根据条件不同,执行不同的代码段
  3. 循环:体现的重复执行一件事情
    /

一、选择

1.if

  • 当条件成立时,则执行的代码段
  • 语法
if可以单独使用
		  if(条件表达式){
		    条件成立时执行的代码段(如果代码只有一句话,则可以不写{ }}
  • if外侧的语句无论条件是否成立都会正常执行
    	int score=70;
    	if(score>=60){
    	System.out.println("及格了");
    	System.out.println("及格万岁");
    	}
    	System.out.println("无论if是否成立都会执行的代码段");
    	
    

if …else…

二选一
		  if(条件表达式){
		    条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
		  }else{
		    不能单独使用
		    else后面没有条件
		    是if条件不满足时执行的代码
		  }
  • if外侧的语句无论条件是否成立都会正常执行
    	int  score =50;
    	if(score >=60){
    		System.out.println("及格万岁");
    		System.out.println("!!!!");
    	}else{
    		System.out.println("挂科了");
    		System.out.println("哭了");
    	}
    	System.out.println("不受if和else的影响");
    
    

小知识:debug

步骤:
(1)设置断点,当程序执行到断点的位置,就会停止在这一行(这一行还没有执行)
(2)程序下一步执行 F6
(3)程序可以执行到下一个断点,如果没有断点执行完毕 F8
(4)当鼠标悬停在变量的,可以看到变量的值
(5)启动的时候要用debug

【练习一】  判断一个数字value ,如果数字==8,输出“发发发”,
否则如果value<8 太小了,如果>8输出太大了
	在if条件中,一定要避免并列的if条件中出现相同变量值判断。
		int value=9;
		if(value==8){
			System.out.println("发发发");
		}
		if(value>8){
			System.out.println("大了");
		}
		if(value <8){
			System.out.println("小了");
		}
		
		使用if else
		int value=9;
		if(value==8){
			System.out.println("发发发");
		}else{
			if(value>8){
				System.out.println("大了");
			}else{
				System.out.println("小了");
			}
		}

if 多个else if … else

多选一,执行的时候,会从上到下依次跟if条件进行匹配,
只要遇见匹配的条件则进入代码块执行。之后,不会再继续进行向下匹配(只匹配依次)
if(条件表达式){
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else if(条件表达式)
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else if(条件
表达式)
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else{
不能单独使用
else后面没有条件
是if条件不满足时执行的代码
}
if外侧的语句无论条件是否成立都会正常执行

【练习二】
		int w=121;
		if(w<=100){
			System.out.println("我很瘦");
		}else if(w<=120){
			System.out.println("需要去健身房");
		}else if(w<=110){
			System.out.println("我不能继续再吃了");
		}else{
			System.out.println("不能出门了");
		}
	}

【在if else if else中要注意的问题】

  1. if 和else if后面有条件, else后面没有条件
  2. if可以单独使用,else if 和else 都不能单独使用
  3. if 和多个else if会从上到下进行匹配,只要遇到匹配项,就不再继续向下匹配
  4. 注意if 和else if的顺序(不要有交集)
  5. 将发生概率大的条件放在前面

2. switch case

定义:做多分支判断

语法

switch(表达式){
   case 常量表达式1:操作1;break;
   case 常量表达式2:操作1;break;
   case 常量表达式3:操作1;break;
   ...
   case 常量表达式n:操作1;break;
   default:默认执行的语句;
}
  1. 表达式的值跟case值相比较,跟哪个case分支符合,就会执行哪个case下的相关语句。
  2. default 以上条件都不符合的时候,会执行的语句
  3. break代表跳出,
  4. 如果没有break,无论case是否匹配都会执行case中的语句体。

[switch的规则]

  1. switch 后面表达式的类型可以是byte,char,short,int(或者是对应的包装器),String,枚举
    不允许浮点类型和long
  2. case 后面的值是要与表达式类型相同的常量,不允许有重复读 case,case后面语句块不可以加{ }
  3. default语句可以不写
  4. 按照执行频率排列case子句,把可能发生的放在前面。
  5. break,如果去掉 ,则后面case无论是否匹配,都会继续执行。
public class Day3_1_ControlSwitch {
	public static void main(String[] args) {
		int x=2;
		switch(x){
//		    可以两个条件执行同一句话,去掉第一个里面break。(不建议)
//			case 1: 
		
			case 1:System.out.println("值为1");break;
			case 2:System.out.println("值为2") ;break;
			case 3:System.out.println("值为3");break;
			default :System.out.println("值未知");
		}

优缺点

思考: if else和switchcase 相比有哪些区别
从内部运行的角度:switch case直接跳转到符合case语句,进行执行。
if else if …else 是从上到下依次进行匹配

  • if else if …else优缺点
    优点:if else 能够应用于更复杂的业务逻辑,更灵活
    缺点:匹配的时候,从上到小, 效率较低

  • switch case优缺点:
    优点:执行的效率较高,因为当条件匹配的时候,直接跳转
    缺点:代码量多,不灵活,重要的是case只能处理常量。

如果分支很多, 但是业务并不复杂,可以使用switch case
如果业务相对复杂,需要比较灵活的处理,使用if else

二、循环

  • 背景:为什么要用循环
  • 需求:控制台打印*,打印5行,每行1个
  • 重复代码造成的问题:不仅仅是代码冗余,代码的可维护性差、代码的可读性差

(一)循环方式

  1. (1)while
  2. (2) do while
  3. (3) for
  4. (4) 增强for循环(不讲)
public class Day3_2_ControlLoop4 {
	public static void main(String[] args) {
		 需求
		 System.out.println("*");
		 System.out.println("*");
		 System.out.println("*");
		 System.out.println("*");
		 System.out.println("*");

1. while

while(条件表达式){ 循环体; }

首先判断表达式是否成立,如果成立 ,则会执行循环体,如果循环体执行完毕,会继续
判断表达式是否成立,如果成立,则继续执行,否则离开while循环,不再执行循环体的内容

		 int i = 1;
		 while (i++<= 5) { ++i错误
		 System.out.println("*");
		 i=i+1;
		 i+=1;
		 i++;
		 ++i;
		 }

		 1+2+3+4..100
		 先考虑产出1 2 3...100
		int num = 1;
		int s = 0;
		while (num <= 100) {
			 System.out.println(num);
			 s=s+num;
			s += num;
			num++;
		}
		System.out.println(s);

2. do while

	语法: do{ 循环体 }while(条件表达式)

先执行一次循环体中的内容,再进行条件表达式的判断,如果成立,则继续重新执行循环体, 否则不再执行循环体。

		 int time = 1;
		 do {
		 System.out.println("*");
		 time++;
		 } while (time <= 5);

对比while 和do while do while一定会先执行一次,无论条件是否满足 while是先判断是否满足,才执行。
如果第一次执行条件就不满足,这两种循环执行的结果不同

3.for

	语法: for(初始化语句;条件表达式;循环控制语句){ 循环体 }

执行过程:

  1. 初始化语句中的变量属于局部变量(特殊) 先执行初始化语句,只在初始化的时候执行一次
  2. 判断条件表达式是否成立,如果成立,则执行循环体
  3. 执行完循环体后,会执行循环控制语句
  4. 再执行条件判断,如果成立,继续执行循环体。
    直到条件表达式不成立为止。

for(内容):内容哪一个部分都可以不写

	【练习】使用for循环解决打星星的问题
		for (int i = 1; i <= 5; i++) {
			System.out.println("*");
		}

		 for 1+2+3+。。。100
		int su = 0;
		for (int i = 1; i < 101; i++) {
			 System.out.println(i);
			 su=su+i;
			su += i;
		}
		System.out.println(su);

		 无限循环: 不代表永远执行下去,跳出循环时间、时刻,可以由循环体内部进行决定
		 while (true){
		
		 }

		 不是死循环
		 int i=0;
		 while(i>=0){
		 i++;
		 }

		 死循环
		 byte b = 0;
		 while (b <= 127) {
		 b++;
		 }

		 for 进行永久循环
		 while(true)
		 for(;;){
		
		 }
		 int i=1;
		 Effecive Java 教导:局部便利浪作用域一定要最小化
		 for(;i<=5;i++){
		 System.out.println(i);
		 }

(二)嵌套循环

外循环每执行一次,内层循环都会执行一轮。
背景 :每行打印5个星星,打印10行

		 for (int i=1;i<=10;i++){
		 System.out.println("*****");
		 }

		 解决,使用循环打印五个星星
		 for (int i = 0; i < 5; i++) {
		 System.out.print("*");
		 }

		 打印10for (int j = 0; j < 10; j++) {
			for (int i = 0; i < 5; i++) {
				System.out.print("*");
			}
			System.out.println();
		}
		 j=0 i=0 i=1 i=2 i=3 i=4
		 j=1 i=0 i=1 i=2 i=3 i=4

思考: 比较下面的程序,外循环次数尽量少,对于内存执行的效率会稍微高一些。

		 for(int i=0;i<10;i++){
		 for (int j=0;j<100000;j++){
		
		 }
		 }
		
		 for(int i=0;i<100000;i++){
		 for (int j=0;j<10;j++){
		
		 }
		 }
	 练习: 1. 输出1..100以内所有的奇数和所有的偶数
	 2. 输入10个数,找到最大值和最小值输出
		for (int i = 1; i < 101; i++) {
			 %2
			if (i % 2 == 0) {
				System.out.println("偶数" + i);
			} else {
				System.out.println("奇数" + i);
			}
		}

		 Scanner sc=new Scanner(System.in);
		 int max=0,min=0;
		 for(int i=0;i<5;i++){
		 System.out.println("请输入一个数字");
		 int n=sc.nextInt();
		 if(i==0){
		 max=i;
		 min=i;
		 }else{
		 if(max<n){
		 max=n;
		 }
		 if(min>n){
		 min=n;
		 }
		 }
		 }
		 System.out.println("max="+max);
		 System.out.println("min="+min);

		 希望通过exit来控制程序退出
		 Scanner sc=new Scanner(System.in);
		 int max=0,min=0;
		 System.out.println("请输入一个数字");
		 String temp;
		 boolean tag=true;
		 while(!"exit".equalsIgnoreCase(temp=sc.next())){
		 int n=Integer.parseInt(temp);
		 if(tag){
		 max=n;
		 min=n;
		 tag=false;
		 }else{
		 if(max<n){
		 max=n;
		 }
		 if(min>n){
		 min=n;
		 }
		 }
		 System.out.println("请输入一个数字");
		 temp=sc.next();
		 }
		 System.out.println("max="+max);
		 System.out.println("min="+min);

(三)跳出循环

背景 :需求希望从0123…查找有没有3这个数
当循环的过程中,希望终止循环,可以使用跳出循环的 关键字
分两种:break continue
break和continue使用的时候,原则上都是有条件的使用 。

		 for (int i =0;i<11;i++){
		 if(i==3){
		 System.out.println("找到了");
		 }else{
		 System.out.println("不是3");
		 }
		 }
#### 		 1.break
		 作用:跳出当前循环
		 break有两种用法,switch case中,在循环中。
		boolean tag=true;
		for (int i = 0; i < 11; i++) {
			if (i == 3) {
				System.out.println("找到了");
				tag=false;
				break;
			} 
		}
		if(tag)
			System.out.println("没找到30");

练习:判断一个数是否是质数
质数(素数):只能被1和自己整除的数
思路
(1)num 从2.3…num-1 当成除数,num当成被除数,是否能够被整除,
如果能够被任何一次整除了,说明不是质数
如果从来都没有被整数 ,说明是质数
(2)判断是否“不是质数”

		int num1=97;
		num1当被除数  2.3.4  ...num1-1 当除数,看一下是否可以被整除
		boolean t=true;
		for (int i=2;i<(int)Math.sqrt(num1)+1;i++){
			if(num1%i==0){
				System.out.println("不是质数");
				t=false;
				break;
			}
		}
		if(t)
			System.out.println("是质数");
		
		因式分解  16  1*16  2*8  4*4  8*2  16*1
		         17             4.n*4.n  

2.continue

结束本次循环
注意:在使用continue的时候,后面一定要有可执行的的有效代码,才有意义,
否则程序不会报错,但是continue没有效果

		for (int i = 0; i < 11; i++) {
			if (i == 3) {
				continue;
			} 
			System.out.println(i);
		}
	判断1..20之间所有的数,输出所有数字,如果是偶数则标记
		for (int i=1;i<21;i++){
			if(i%2==0){
				System.out.println("是偶数"+i);
				continue;
			}
			System.out.println(i);
		}
		
		continue无效的时候
		for(.){
			contiune
		}

(四)循环标签

	可以对循环起名字(循环标签)
	定义  :在循环的上方   名字:
	out:
	for (int i=0;i<5;i++){
		for(int j=0;j<10;j++){
			if(j==2)
				break out;
		}
	}
}

你可能感兴趣的:(Java学习笔记)