03 流程控制

一、选择结构-if

1.1 if语句的第一种格式

1.if语句的第一种格式:	
			if(布尔表达式){
				语句体;
			}
			其它语句;

2.注意:
	(1)if语句的第一种格式,只适用于有一种情况的场景
	(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
	(3)if和后面的()之间以及()和{}之间都是没有分号的
	(4)if后面的{}中的语句体要么被执行,要么被跳过
	(5)if后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
	(6)if后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留

练习

1.键盘录入三个整数,按照从小到大的顺序输出

2.如果用户输入的是3 2 1,程序运行后打印格式"按照从小到大排序后的顺序为:1 2 3"

//冒泡排序
import java.util.Scanner;
public class Task05 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个整数:");
		int a = sc.nextInt();
		System.out.println("请输入第二个整数:");
		int b = sc.nextInt();
		System.out.println("请输入第三个整数:");
		int c = sc.nextInt();
		//a中保留了a和b两个数字中的较大中的值
		if(a<b) {
			int temp = a;
			a = b;
			b = temp;
		}
		//b中保留了b和c两个数字中的较大中的值,此时c中已经是最小值了
		if(b<c) {
			int temp = b;
			b = c;
			c = temp;
		}
		//经过上面的操作c中已经确定了最小值,只需要再确定a和b就可以了
		if(a<b) {
			int temp = a;
			a = b;
			b = temp;
		}
		
		System.out.println("a="+a+",b="+b+",c="+c);		
	}
}

1.2 if语句的第二种格式

1.if语句的第二种格式:
			if(布尔表达式){
				语句体1;
			} else {
				语句体2;
			}
2.注意:
	(1)if语句的第二种格式,只适用于有两种情况的场景,是一个二选一的情况
	(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
	(3)if和后面的()之间以及()和{}之间以及else和前后的{}都是没有分号的
	(4)语句体1和语句体2必须只有一个会被执行,属于二选一的情况
	(5)if和else后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
	(6)if和else后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留   

练习1

1.键盘录入三个整数,按照从小到大的顺序输出

2.如果用户输入的是3 2 1,程序运行后打印格式"按照从小到大排序后的顺序为:1 2 3"

import java.util.Scanner;
public class Task05 {
	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个整数:");
		int a = sc.nextInt();
		System.out.println("请输入第二个整数:");
		int b = sc.nextInt();
		System.out.println("请输入第三个整数:");
		int c = sc.nextInt();
		
		if(a>b) {//a>b
			if(a>c) {//a>b&&a>c   a是最大的
				if(b>c) {//a>b&&a>c&&b>c
					System.out.println("a="+a+",b="+b+",c="+c);
				} else {//a>b&&a>c&&b<=c
					System.out.println("a="+a+",c="+c+",b="+b);
				}
			} else {//a>b&&a<=c  ->c a b
				System.out.println("c="+c+",a="+a+",b="+b);
			}
		} else {//b>=a
			if(c>b) {//b>=a&&c>b  c b a
				System.out.println("c="+c+",b="+b+",a="+a);
			} else {//b>=a&&b>=c   b 
				if(a>c) {//b>=a&&b>=c&&a>c  b a c 
					System.out.println("b="+b+",a="+a+",c="+c);
				} else {//b>=a&&b>=c&&a<=c  b c a  
					System.out.println("b="+b+",c="+c+",a="+a);
				}
			}
		}
	}
}

练习2

import java.util.Scanner;
/*
	某商场购物可以打折,具体办法如下:
		普通顾客购满100元打9折
		会员购物打8折
		会员购物满200元打7.5折
		请根据此优惠计划进行购物结算
	分析:
		1.创建键盘录入对象
		2.定义String类型的变量identity(其值为y/n,y表示为会员,n表示为非会员),double类型的变量money表示购物金额
		3.通过键盘录入给变量identity和变量money赋值
		4.使用嵌套if选择结构实现
		5.先判断顾客是否是会员
			(1)非会员,直接打9折
			(2)会员,接着判断顾客购物是否达到相应的打折的数量要求,根据结果做不同的处理
 */
public class Task13 {
	public static void main(String[] args) {
//		1.创建键盘录入对象
		Scanner sc = new Scanner(System.in);
//		2.定义String类型的变量identity(其值为y/n,y表示为会员,n表示为非会员),double类型的变量money表示购物金额
		String identity;
		double money;
//		3.通过键盘录入给变量identity和变量money赋值
		System.out.println("请输入是否是会员:是(y)/否(其他字符)");
		identity = sc.nextLine();
		System.out.println("请输入购物金额:");
		money = sc.nextDouble();
//		4.使用嵌套if选择结构实现
		if(identity.equals("y")) {	//是会员
//		5.先判断顾客是否是会员
//			(1)会员,接着判断顾客购物是否达到相应的打折的数量要求,根据结果做不同的处理
			if(money >= 200) { //会员购物200元以上打7.5折
				money = money * 0.75;
			} else {	//会员200元以内的大8折
				money = money * 0.8;
			}
		} else {
//			(2)非会员,直接打9折
			if(money >= 100) { //非会员购物100元以上打9折
				money = money * 0.9;
			}
		}
		System.out.println("实际支付:"+money);
	}
}

1.3 if语句的第三种格式

1.if语句的第三种格式:
	            	if(布尔表达式1){
                        	语句体1;
                    	} else if(布尔表达式2){
                        	语句体2;
                    	}
                    		...
                    	else if(布尔表达式n){
                        	语句体n;
                    	} else {
                        	语句体n+1;
                    	}
                    	其它语句;
2.注意:
	(1)if语句的第三种格式,只适用于有多种(两种以上)情况的场景,是一个多选一的情况
	(2)if后面()中的表达式,不管多么简单或者多么复杂,结果必须是布尔类型,要么是true,要么是false
	(3)if和后面的()之间以及()和{}之间以及else和前后的{}都是没有分号的
	(4)语句体1到语句体n+1必须只有一个会被执行,属于多选一的情况
	(5)if和else后面的{}中的语句体: 一条/多条语句(根据实际需求确定)
	(6)if和else后面的{}中如果只有一条语句,则可以省略{},但是对于初学者而言,建议保留
	(7)最后一个else后面是没有条件的,是用来兜底的,如果前面的所有条件都不成立,执行最后一个else中的代码
	(8)不能直接在else后面写条件,只能在if后面()中写条件
		有if就可以写条件,没有if就不能写条件

练习1

import java.util.Scanner;
/*
	某人想买车,没什么车决定于此人在银行有多少存款(键盘录入)。
	如果此人的存款超过500万,则买雪铁龙DS9;
	否则,如果此人的存款超过100万,则买雪铁龙C6;
	否则,如果此人的存款超过50万,则买雪铁龙C5;
	否则,如果此人的存款超过10万,则买雪铁龙爱丽舍;
	否则此人买捷安特。
	分析:
		1.创建键盘录入对象
		2.定义int类型变量money,并通过nextInt()方法获取键盘录入的值赋值给变量money
		3.使用if-else 对money的值进行判断,并打印相关信息
 */
public class Task11 {
	public static void main(String[] args) {
//		1.创建键盘录入对象
		Scanner sc = new Scanner(System.in);
//		2.定义int类型变量money,并通过nextInt()方法获取键盘录入的值赋值给变量money
		int money = sc.nextInt();	//单位是万元
//		3.使用if-else 对money的值进行判断,并打印相关信息
		if(money >= 500) { 			//money>=500
			System.out.println("太好了,我可以买辆雪铁龙DS9");
		} else if(money >= 100) {	//money>=100 && money<500
			System.out.println("不错,我可以买辆雪铁龙C6");
		} else if(money >= 50) {	//money>=50 && money<100
			System.out.println("我可以买辆雪铁龙C5");
		} else if(money >= 10) {	//money>=10 && money<50
			System.out.println("至少我可以买辆雪铁龙爱丽舍");
		} else {					//money<10
			System.out.println("看来我只能买辆捷安特了");
		}
	}
}

练习2

import java.util.Scanner;
/*
 * 分析以下需求,并用代码实现:			
	1.功能描述:键盘录入月份,输出对应的季节
	2.要求:
		(1)键盘录入一个整数(代表月份,范围1-12)
		(2)输出该月份对应的季节
			3,4,5春季
			6,7,8夏季
			9,10,11秋季
			12,1,2冬季
		(3)演示格式如下:
			请输入一个月份:3
			控制台输出:3月份是春季
 */
public class Task06 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);	//创建键盘录入对象
		System.out.println("请输入月份");
		int month = sc.nextInt();		//将键盘录入的结果存储在month
		if (month > 12 || month < 1) {
			System.out.println("对不起没有对应的季节");
		}else if (month >= 3 && month <= 5) {
			System.out.println(month + "月是春季");
		}else if (month >= 6 && month <= 8) {
			System.out.println(month + "月是夏季");
		}else if (month >= 9 && month <= 11) {
			System.out.println(month + "月是秋季");
		}else {
			System.out.println(month + "月是冬季");
		}
	}	
}

二、循环语句1--for

1.for循环格式:	
		for (初始化表达式1;布尔表达式2;步进表达式4) {
			循环体3;
		}
		其它语句;

2.执行流程:
	1,2(循环条件:true),3,4 --> 2(循环条件:true),3,4 --> ... --> 直到2(循环条件:false)为false时,结束for循环,执行后面的其它语句

3.注意:
	(1)for和(),以及()和{}之间是没有分号的
	(2)()中有3个表达式,之间用2个分号(缺一不可)隔开,第三个表达式后面没有分号
	(3)第二个表达式一定是布尔类型,结果只能是true和false
	(4)循环体就是一条/多条语句

练习1

import java.util.Scanner;
/*
 * 分析以下需求,并用代码实现:
	1.打印1到100之内的整数,但数字中包含9的要跳过
	2.每行输出5个满足条件的数,之间用空格分隔
	3.如:1 2 3 4 5 
	
		分析:
		1.定义计数器,用于统计满足条件的数字的个数
		2.遍历1到100的数字
		3.求出个位数字(ge)和十位数字(shi)
		4.如果个位数字不是9并且十位数字也不是9(<=>如果个位数字是9或者十位数字是9,什么都不做(continue))
			计数器加1
			打印该数字
			判断计数器是否能被5整除
			如果能被5整除,打印换行
			不能被5整除,什么都不做
 */
public class Task07 {
	public static void main(String[] args) {
		//1.定义计数器,用于统计满足条件的数字的个数
		int count = 0;
		//2.遍历1到100的数字
		for(int i = 1;i<100;i++) {
			//3.求出个位数字(ge)和十位数字(shi)
			int ge = i%10;
			int shi = i/10%10;
			//4.如果个位数字不是9并且十位数字也不是9
			if(ge!=9&&shi!=9) {
				//计数器加1
				count++;
				//打印该数字
				System.out.print(i+" ");
				//如果能被5整除,打印换行
				if(count%5==0)
					System.out.println();
				//不能被5整除,什么都不做
			}
		}
	}
}

练习2

import java.util.Scanner;

/*
	循环录入某学生的5门课程的成绩并计算平均分。如果某分数录入为负,则停止录入并提示录入错误。
	分析:
		1.创建键盘录入对象
		2.定义int类型的变量sum(总分)和avg(平均分),两个变量的初始值位0,String类型的变量name,表示学员姓名
		3.定义boolean类型的变量flag(表示该学生的5门成绩是否正确录入,如果有一个为负值,则负值为true,表示录入错误),初始值为false
		4.利用for循环,录入5个成绩
			(1)判断当前的成绩如果小于0,flag赋值为true,终止for循环
			(2)否则,如果当前录入的成绩>=0,累加求和
		5.打印结果
			(1)如果flag为true,打印录入错误
			(2)否则如果flag为false,打印总分和平均分
 */
public class Task09 {
	public static void main(String[] args) {
//		1.创建键盘录入对象
		Scanner sc = new Scanner(System.in);
//		2.定义int类型的变量sum(总分)和double类型的变量avg(平均分),两个变量的初始值位0,String类型的变量name,表示学员姓名
		int sum = 0;
		double avg = 0;
		String name;
//		3.定义boolean类型的变量flag(表示该学生的5门成绩是否正确录入,如果有一个为负值,则负值为true,表示录入错误),初始值为false
		boolean flag = false;
		System.out.print("请输入学员姓名:");
		name = sc.nextLine();//录入学员姓名
//		4.利用for循环,录入5个成绩
		for(int i = 0;i < 5; i++) {
			System.out.print("请输入第"+(i+1)+"门课程的成绩: ");
			int score = sc.nextInt();
//			(1)判断当前的成绩如果小于0,flag赋值为true,终止for循环
			if(score < 0) {
				flag = true;
				break;
			}
//			(2)否则,如果当前录入的成绩>=0,累加求和
			sum = sum + score;
		}
//		5.打印结果
		if(flag) {
//			(1)如果flag为true,打印录入错误
			System.out.println("抱歉,分数录入错误,请重新进行录入!");
		} else {
			avg = (double)sum / 5;//计算平均分
//			(2)否则如果flag为false,打印总分和平均分
			System.out.println(name + "的平均分是:" + avg);
		}
	}
}

练习3

import java.util.Scanner;
/*
	循环录入学员Java课程的成绩(学员数量由键盘录入),统计分数大于等于80分的学生的比例。
	分析:
		1.创建键盘录入对象
		2.定义int类型的变量score(学员成绩)、total(学员数量)、count(>=80分的学员数量)
		3.通过键盘录入操作给total变量赋值
		4.利用for循环(循环次数为total),循环录入学员成绩
			(1)获取当前键盘录入的成绩
			(2)判断该成绩如果<80,continue继续进行下次录入
			(3)否则如果改成绩>=80,count++
		5.定义double类型的rate,并计算80分以上的比例,赋值给rate
		6.打印最终的 计算结果
 */
public class Task16 {
	public static void main(String[] args) {
//		1.创建键盘录入对象
		Scanner sc = new Scanner(System.in);
//		2.定义int类型的变量score(学员成绩)、total(学员数量)、count(>=80分的学员数量)
		int score = 0,total = 0,count = 0;
//		3.通过键盘录入操作给total变量赋值
		System.out.print("请输入班级总人数:");
		total = sc.nextInt();
//		4.利用for循环(循环次数为total),循环录入学员成绩
		for(int i = 0; i < total;i++) {
//			(1)获取当前键盘录入的成绩
			System.out.print("请输入第"+(i+1)+"位学生的成绩:");
			score = sc.nextInt();
			if(score < 80) {
//			(2)判断该成绩如果<80,continue继续进行下次录入
				continue;
			}
//			(3)否则如果改成绩>=80,count++
			count++;
		}
//		5.定义double类型的rate,并计算80分以上的比例,赋值给rate
		System.out.println("总共有"+count+"位同学的成绩在80分以上");
		double rate = (double)count/total*100;
//		6.打印最终的 计算结果
		System.out.println("80分以上的学生所占的比例为:" + rate + "%");
	}
}

练习4

/* 键盘录入一个数构成一个空菱形*/

Scanner sc = new Scanner(System.in);
System.out.println("请输入您要构成的空菱形的行数(奇数个):");
int a = sc.nextInt();
if (a % 2 == 0) {
    a++;
}
int count = 1;
for (int i = 1; i <= a/2+1; i++) {          //上半部分  a/2+1
    for (int j = 1; j <=a/2+i ; j++) {
        if (j == a/2+i || j == a/2-i+2) {
            System.out.print("* ");
        } else {
            System.out.print("  ");
        }
    }
    System.out.println();
    count++;
}
for (int i = 1; i <= a / 2; i++) {         //下半部分  a/2
    for (int j = 1; j <= a - i; j++) {
        if (j == a-i || j == i+1) {
            System.out.print("* ");
        } else {
            System.out.print("  ");
        }
    }
    System.out.println();
}

三、循环语句2--while

1.while循环格式:
			初始化表达式1;
			while(布尔表达式2){
				循环体3;
				步进表达式4;
			}
			其它语句;

2.执行流程:		
	1,2(循环条件:true),3,4-->2(循环条件:true),3,4--> ... -->直到布尔表达式2(循环条件: false)	的结果为false,结束while循环,执行后面的其它语句
	
3.注意:
	(1)while和(),以及()和{}之间是没有分号的
	(2)()中的表达式必须是布尔类型	
	(3)循环体就是一条/多条语句

练习

需求:
    世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。
    请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
    折纸(折叠后的厚度是原有厚度的2倍,而不是平方的关系):
		原来: 0.1 paper	
		第一次: 0.1*2: 0.2 paper = paper * 2
        	第二次: 0.2*2: 0.4 
        	第三次: 0.4*2: 0.8
        	第四次: 0.8*2: 1.6
        	...
                
实现步骤:
	1.定义int变量count,初始值0,用来统计折叠纸张的次数
	2.定义2个double变量paper和zf,分别代表珠峰的高度和纸张的厚度,根据题目需求进行初始化
	3.使用while循环统计折叠纸张的次数
	3.1 初始化表达式: 步骤1和2中定义的变量
	3.2 循环条件: 纸张的总厚度 小于 珠峰的高度	paper<zf
	3.3 循环体: 计数器的值增加1
	3.4 步进表达式: 折叠一次纸张 paper = paper * 2
    	4.while循环结束后,打印count的值
public class Demo02ZF {
    public static void main(String[] args) {
        //1.定义int变量count,初始值0,用来统计折叠纸张的次数
        int count = 0;

        //2.定义2个double变量paper和zf,分别代表珠峰的高度和纸张的厚度,根据题目需求进行初始化
        double paper = 0.1,zf = 8844430;

        //3.使用while循环统计折叠纸张的次数
        //3.1 初始化表达式: 步骤1和2中定义的变量
        //3.2 循环条件: 纸张的总厚度 小于 珠峰的高度	paper<zf
        while (paper < zf) {
            //3.3 循环体: 计数器的值增加1
            count++;

            //3.4 步进表达式: 折叠一次纸张 paper = paper * 2
            paper = paper*2;
            System.out.println("折叠第"+count+"次后,纸张的厚度: "+paper);
        }
        //4.while循环结束后,打印count的值
        //1.34217728E7: 科学计数法
        //1.34217728 * 10^7 ==> 13421772.8
        System.out.println("总共折叠 "+count+"次,达到珠峰的高度,最终纸张的厚度: "+paper);
    }
}

四、循环语句3--do-while

1.do-while循环格式:
			初始化表达式1;
			do {
				循环体3;
				步进表达式4;
			} while (布尔表达式2);
			其它语句;

2.执行流程:
	1,3,4 --> 2(循环条件:true),3,4 --> 2(循环条件:true),3,4 --> 
        直到布尔表达式2(循环条件:false)的结果为false,结束do-while循环,执行后面的其它语句

3.注意:
	(1)do和{},{}和while,以及while后()之间都是没有分号的
	(2)()中的表达式必须是布尔类型,而且()后面必须写一个分号,不写是语法格式错误	
	(3)循环体就是一条/多条语句
	(4)代码从上到下依次执行,它是先执行循环体,再进行条件判断,所以对于do-while而言,循环体至少执行一次

练习

//在控制台输出5次HelloWorld

public class Demo01DoWhileHello {
    public static void main(String[] args) {
        //初始化表达式
        int count = 1;
        do {
            System.out.println("HelloWorld..." + count);//循环体
            count++;//步进表达式
        } while (count <= 5);//11<=5:false

        System.out.println("其它语句....");
    }
}

五、循环语句其它知识

5.1 循环语句的区别

三种循环的区别总结
	1.建议使用的顺序: for,while,do-while 			
	2.循环次数确定的话,建议使用for,循环次数不确定建议使用while 【先了解: 后面有使用场景】
    	循环次数不确定需要先写成死循环的格式
	3.do-while循环来讲的话,至少执行一次 
	4.while和do-while循环而言,循环结束后,初始化条件中定义的变量可以继续使用, 但是for循环的不能使用(在for循环内部定义初始化语句)   意思就是:{}内定义的变量,在{}外不可以使用。
以下说法正确的是:	ABCEF
    A: for循环是先判断条件,后执行循环体
    B: while循环是先判断条件,后执行循环体
    C: do-while循环是先执行循环体,后判断条件
    D: for和while至少执行一次
    E: for和while可以一次都不执行
    F: do-while而言至少执行一次

5.2 死循环

死循环
1.概念: 用不停止的循环,又叫做永真循环

2.分类:
      (1)for循环的死循环格式:
           for (; ; ) {
               ...
           }

      (2)while循环的死循环格式:
           while (true) {
               ...
           }

      (3)do-while循环的死循环格式:
           do {
               ...
           } while (true);

六、循环嵌套

练习1

/*九九乘法表*/
int sum;
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        sum = i * j;
        System.out.print(i + "*" + j + "=" + sum + "\t");
    }
    if (i == 9) {
        break;
    }
    System.out.println();

练习2

/*质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。
 *1-100之间的素数 */
        
//boolean flag = true;
for (int i =2 ; i <= 100; i++) {
    boolean flag = true;
    for (int j = i / 2; j > 1; j--) {
        if (i % j == 0) {
            flag=false;
            break;
        }
    }
    if (flag) {
        System.out.print(i+" ");
    } // else {
              //  flag =true;
           // }
}

七、switch语句

1.格式:
        switch(表达式) {
        	case 常量值1:
        		语句体1;
        		break;
        	case 常量值2:
        		语句体2;
        		break;
        	...
        	case 常量值n:
        		语句体n;
       			break;
        	default:
        		语句体n+1;
        		break;
        }
        其它语句;
        
2.执行流程:

        (1)首先计算出表达式的值
        (2)其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到            break就会结束。
        (3)最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程            序结束掉。

3.注意事项:

        (1)switch语句()中表达式的类型: byte/short/char/int 	String/枚举---最重要的---
        (2)case后面必须写常量,而且不能重复,常量的类型要和表达式的结果类型匹配
        (3)switch和后面的(),以及()和{}之间都没有分号,case后面常量值的后面是冒号不是分号
        (4)break是用来结束switch语句的,一旦遇到break,直接结束switch语句,继续执行switch后面的其它语句
        (5)default是用来兜底的,如果所有的case的常量值和表达式的结果都不相同,直接执行default中的代码
        (6)如果每个case和default后面都有break,那么case和default的顺序可以任意调整,不影响结果
        (7)如果default放在最后的话,那么可以省略default中的break
        (8)语句体: 一条/多条语句(根据题目需求确定)

case 穿透

package itheima03;

public class Demo06SwitchTest {
    public static void main(String[] args) {
        int i = 5, j = 10, x = 15;
        switch (j - i) {//10 - 5: 5
            case 4:
                x += 16;
            case 5:
                x++;
            case 6:
                x += 2;
            case 7:
                x += 3;
            default:
                --x;
        }
        System.out.println(i);//5
        System.out.println(j);//10
        System.out.println(x);//20
    }
}
posted @ 2021-07-05 09:47  uoi  阅读(116)  评论(0)    收藏  举报