day04_流程控制

day04复习

1. 流程控制结构的说明

在这里插入图片描述

  • Java语言对应的三类结构:
    在这里插入图片描述

2. 分支结构1:if-else

  • 格式
格式1:
if(条件表达式){
	执行语句
}

格式2:二选一
if(条件表达式){
	执行语句1
}else{
	执行语句2
}

格式3:多选一
if(条件表达式1){
	执行语句1
}else if(条件表达式2){
	执行语句2
}...
}else{
	执行语句n
}
  • 基本使用
class IfTest {
	public static void main(String[] args) {
		
		//格式1:
		int heartBeats = 70;
		if(heartBeats < 60 || heartBeats > 100){
			
			System.out.println("需要做进一步的检查");
		}

		System.out.println("体检结束");

		//格式2:二选一
		boolean isGirl = true;
		if(isGirl){
			System.out.println("我是一个女孩~");
		}else{
			System.out.println("我不是一个女孩~");
		}

		//格式3:多选一
		int age = 23;
		if(age < 0){
			System.out.println("你输入的数据非法");
		}else if(age < 8){
			System.out.println("幼儿时期");
		}else if(age < 18){
			System.out.println("青少年时期");
		}else if(age < 40){
			System.out.println("青壮年时期");
		}else if(age < 65){
			System.out.println("中年时期");
		}else{
			System.out.println("老年时期");
		}
		//此时的else是可选的
	}
}
  • 使用说明
1.如果多个条件表达式彼此之间没有“交集”,则哪个条件写上面,哪个条件写下面,都可以。
  如果多个条件表达式彼此之间有“交集”,但是还不是包含关系。此时孰上孰下是有影响的,需要具体问题具体分析。
  如果多个条件表达式彼此之间是“包含”关系,此时孰上孰下是有影响的。通常范围小的一定要声明在范围大的上面。

2. 如果条件表达式对应的结构中的执行语句只有一行的话,可以省略其所在的一对大括号。
   但是,建议大家开发时不要省略!
   
3. if-else可以嵌套使用
  • 代码举例
/*
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:
成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphone 12 pro max;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断

*/
//1.
import java.util.Scanner;

class IfTest {
	public static void main(String[] args) {
		//2.
		Scanner scan = new Scanner(System.in);
		//3.
		System.out.print("请输入岳小鹏的期末成绩:(0-100)");
		int score = scan.nextInt();//获取了岳小鹏的期末成绩

		if(score == 100)
			System.out.println("奖励一辆BMW");
		else if(score >= 60 && score <= 80)
			System.out.println("奖励一个 iPad");
		else if(score > 80 && score <= 99){
			System.out.println("奖励一台iphone 12 pro max");
			System.out.println("奖励一台iphone 12 pro max");
		}else{
			System.out.println("什么奖励也没有");
			System.out.println("什么奖励也没有");
		}
		
	}
}

  • 代码举例
import java.util.Scanner;

class IfTest1{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//获取3个整数
		System.out.println("请输入第1个整数:");
		int num1 = scanner.nextInt();
		System.out.println("请输入第2个整数:");
		int num2 = scanner.nextInt();
		System.out.println("请输入第3个整数:");
		int num3 = scanner.nextInt();

		if(num1 >= num2){
			if(num3 >= num1){
				System.out.println("从小到大排列为:" + num2 + "-" + num1 + "-" + num3);
			}else if(num3 <= num2){
				System.out.println("从小到大排列为:" + num3 + "-" + num2 + "-" + num1);
			}else{
				System.out.println("从小到大排列为:" + num2 + "-" + num3 + "-" + num1);
			}

		}else{//num1 < num2
			if(num3 >= num2)
				System.out.println("从小到大排列为:" + num1 + "-" + num2 + "-" + num3);
			else if(num3 <= num1)
				System.out.println("从小到大排列为:" + num3 + "-" + num1 + "-" + num2);
			else
				System.out.println("从小到大排列为:" + num1 + "-" + num3 + "-" + num2);
			
		}
	}
}
  • 课后练习
/*
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出一定的条件:
高:180cm以上;富:财富1千万以上;帅:是。

如果这三个条件同时满足,则:“我一定要嫁给他!!!”
如果三个条件有为真的情况,则:“嫁吧,比上不足,比下有余。”
如果三个条件都不满足,则:“不嫁!”


*/
import java.util.Scanner;
class IfExer1 {
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);

		System.out.print("身高(cm):");
		int tall = scan.nextInt();

		System.out.print("财富(单位:万):");
		double money = scan.nextDouble();
		/*
		方式一:
		System.out.print("帅否(true/false):");
		boolean isHandsome = scan.nextBoolean();
		
		if(tall >= 180 && money >= 1000 && isHandsome){
			System.out.println("我一定要嫁给他!!!");
		}else if(tall >= 180 || money >= 1000 || isHandsome){
			System.out.println("嫁吧,比上不足,比下有余。");
		}else{
			System.out.println("不嫁!");
		}
		*/

		//方式二:
		System.out.print("帅否(是/否):");
		String handsome = scan.next();
		
		if(tall >= 180 && money >= 1000 && "是".equals(handsome)){
			System.out.println("我一定要嫁给他!!!");
		}else if(tall >= 180 || money >= 1000 || "是".equals(handsome)){
			System.out.println("嫁吧,比上不足,比下有余。");
		}else{
			System.out.println("不嫁!");
		}

	}

}

3. 如何从键盘获取指定类型的数据

/*
需求:如何从键盘获取不同类型的变量

解决方案:使用Scanner类及其相关的方法

具体的实现步骤:
① 导包:import java.util.Scanner;
② 实例化Scanner(或创建Scanner类的对象):Scanner scan = new Scanner(System.in);
③ 调用Scanner类中相关方法,获取指定类型的数据即可。

  nextByte():获取byte类型的变量值
  nextShort():获取Short类型的变量值
  nextInt():获取int类型的变量值
  nextLong():获取long类型的变量值

  nextFloat():获取float类型的变量值
  nextDouble():获取double类型的变量值
  nextBoolean():获取boolean类型的变量值
  
  next()/nextLine():获取String类型的变量值

说明:
1. 如果用户输入的类型与接收的变量的类型不匹配,会报InputMismatchException的异常信息
2. Scanner类中没有直接获取一个char变量的方法!


*/
import java.util.Scanner;

class ScannerTest{
	public static void main(String[] args){
		//数据类型  变量名 = 变量值
		Scanner scan = new Scanner(System.in);
		
		//获取字符串
		System.out.println("请输入你的姓名:");
		String name = scan.next(); //"阻塞式"的方法

		//获取整型
		System.out.println("请输入你的年龄:");
		int age = scan.nextInt();

		//获取浮点型
		System.out.println("请输入你的体重(公斤):");
		double weight = scan.nextDouble();

		//获取boolean类型
		System.out.println("请输入你的性别(女:true ; 男:false):");
		boolean isFemale = scan.nextBoolean();

		//打印个人基本信息
		System.out.println(name + "的年龄为:" + age + "岁,体重为:" + weight + "公斤,性别是女:" + isFemale);
		

		//如何考虑获取一个char类型的变量
		System.out.println("请输入你的性别(女/男):");
		String gender = scan.next();
		char genderChar = gender.charAt(0);//索引从0开始
		System.out.println("性别为:" + genderChar);
	}
}

4. 如何获取指定范围的随机数

/*
1. 如何获取随机数?
使用Math的random()能获取一个[0.0,1.0)范围的一个double型的数据

2. 如何获取一个两位数[10,99],作为彩票号码出现。

Math.random(): [0.0,1.0) * 90 ---> [0.0,90.0) + 10 ----> [10.0,100.0)  -->(int)[10.0,100.0) --> [10,99]


 [0.0,1.0) * 100 -->[0.0,100.0) + 10 --> [10.0,110.0)

3. 如何获取指定范围[a,b]的随机数:公式

  (int)(Math.random() * (b - a + 1) + a)

*/
class RandomTest {
	public static void main(String[] args) {
		System.out.println("获取随机数:" + Math.random());

		int value = (int)(Math.random() * (99 - 10 + 1)) + 10;
		System.out.println("获取一个两位数的随机数:" + value);
	}
}

5. 分支结构2:switch-case

结构:
switch(表达式){
	case 常量1:
		语句1;
		// break;
	case 常量2:
		语句2;
		// break;
	… …
	case 常量N:
		语句N;
		// break;
	default:
		语句;
		// break;
} 
  • 代码演示
class SwitchCaseTest {
	public static void main(String[] args) {
		int num = 2;
		switch(num){
			//default:
			//	System.out.println("other");
			//	break;
			case 1:
				System.out.println("one");
				break;
			case 2:
				System.out.println("two");
				break;
			case 3:
				System.out.println("three");
				break;
			case 4:
				System.out.println("four");
				break;
			default:
				System.out.println("other");
				break;
			
		}

		/*
		编译失败
		switch(num){
			case num < 10:
				System.out.println("1111");
				break;
			case num < 20:
				System.out.println("2222");
				break;
			default:
				System.out.println("3333");
				break;
		}
		*/

		String season = "summer";
		switch (season) {
		case "spring":
			System.out.println("春暖花开");
			break;
		case "summer":
			System.out.println("夏日炎炎");
			break;
		case "autumn":
			System.out.println("秋高气爽");
			break;
		case "winter":
			System.out.println("冬雪皑皑");
			break;
		default:
			System.out.println("季节输入有误");
			break;
		}

	}
}

  • 使用说明
① 执行过程:根据switch中表达式的值,依次匹配case中的常量。如果与某一个case中的常量匹配,则进入此case对应结构的执行语句中进行执行。执行完此case结构以后,仍会考虑继续向下执行其下的其他case语句或出现break,跳出当前的switch结构。

② 我们在switch-case结构中可以使用关键字break。一旦执行break,则跳出当前switch-case结构。
③ switch后的表达式,其实也可以理解为一个变量。此表达式或变量的类型只能是如下的这些:
   byte \ short \ char \ int \ 枚举类(jdk5.0) \ String(jdk7.0新增)
④ default 类似于if-else结构中的else。default结构是可选的,位置是灵活的。
1. 通常使用switch-case结构时,需要匹配的case的情况通常不会太多。
2. 多个case如果执行语句相同,可以合并
3. switch-case与if-else的对比:
	
	3.1 使用switch-case的分支结构都可以转换为if-else。反之,不成立。
    3.2 在二者都可以使用的场景下,建议使用switch-case。因为效率稍高。
  • 代码举例
class SwitchCaseTest1{
	public static void main(String[] args) {
		
		int score = 67;
		if(score >= 60){
			System.out.println("合格");
		}else{
			System.out.println("不合格");
		}

		//switch-case实现:
		/*
		switch(score){
		case 0:
			//...
		case 1:
			//...
		//....
		case 100:
			//....
		}
		*/

		switch(score / 10){
		
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			System.out.println("不合格");
			break;
		case 6:
		case 7:
		case 8:
		case 9:
		case 10:
			System.out.println("合格");
			break;
		}
		
		//更优的写法:
		switch(case / 60){
			case 1:
				System.out.println("合格");
				break;
			case 0:
				System.out.println("不合格");
				break;
		}
		
	}
}
  • 代码举例:switch-case中可以没有break
/*

编写程序:从键盘上输入2021年的“month”和“day”,要求通过程序输出输入的日期为2021年的第几天。


5只鸡5天下5个蛋, ? 100天 下100个蛋
*/
import java.util.Scanner;

class SwitchCaseTest2 {
	public static void main(String[] args) {
		
		Scanner scann = new Scanner(System.in);

		System.out.println("请输入当年的月份:(month)");
		int month = scann.nextInt();
		System.out.println("请输入当月的日期:(day)");
		int day = scann.nextInt();
		
		int sumDays = 0;
		/*
		switch(month){
			case 1:
				sumDays = day;
				break;
			case 2:
				sumDays = 31 + day;
				break;
			case 3:
				sumDays = 31 + 28 + day;
				break;
			case 4:
				
			//...
		}
		*/

		switch(month){
			case 12:
				sumDays += 30;
			case 11:
				sumDays += 31;
			case 10:
				sumDays += 30;
			case 9:
				sumDays += 31;
			case 8:
				sumDays += 31;
			case 7:
				sumDays += 30;
			case 6:
				sumDays += 31;
			case 5:
				sumDays += 30;
			case 4:
				sumDays += 31;
			case 3:
				sumDays += 28;//28:一月份的总天数
			case 2:
				sumDays += 31; //31:一月份的总天数
			case 1:
				sumDays += day;
		}
		
		System.out.println(month + "月" + day + "日是2021年的第" + sumDays + "天");
	}
}

拓展:
从键盘分别输入年、月、日,判断这一天是当年的第几天
 
   注:判断一年是否是闰年的标准:
       1)可以被4整除,但不可被100整除
	或
       2)可以被400整除

if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
	sumDays += 29;
}else{
	sumDays += 28;
}

6. 循环结构的说明

在这里插入图片描述

  • 只要是循环结构,都包含如上的4个要素。
  • 循环条件部分,一定是boolean的。

7. 循环结构1:for

for循环结构的格式

for(①;②;④){
	③
}

执行过程:① - ②  - ③ - ④  - ② - ③ - ④ - ... - ②
  • 代码举例
class ForTest {
	public static void main(String[] args) {
		/*
		System.out.println("Hello World!");
		System.out.println("Hello World!");
		System.out.println("Hello World!");
		System.out.println("Hello World!");
		System.out.println("Hello World!");
		*/

		for(int i = 1;i <= 5;i++){			
			System.out.println("Hello World!");
		}
		//System.out.println("i = " + i);
		int i = 1;
		for(System.out.print("a");i <= 3;System.out.print("c"),i++){
			System.out.print("b");

		}
		
		System.out.println();
		//输出结果:abcbcbc

		//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
		int sum = 0;//统计偶数的和
		int count = 0;//统计偶数的个数

		for(int j = 1;j <= 100;j++){
			if(j % 2 == 0){
				System.out.println(j);
				sum += j;
				count++;
			}
			
		}
		System.out.println("偶数的总和为:" + sum);	
		System.out.println("偶数的个数为:" + count);	
	}
}

8.循环中break的使用举例

/*

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

比如:12和20的最大公约数是4,最小公倍数是60。

说明:break关键字的使用
在循环结构中,可以使用break。表示一旦执行break,则跳出当前循环结构。
*/
class ForTest1{
	public static void main(String[] args) {
		
		int m = 12;
		int n = 20;
		
		//#########获取最大公约数##############
		//获取二者的较小值
		int min = (m > n)? n : m;
		
		for(int i = min;i >= 1;i--){
			if(m % i == 0 && n % i == 0){
				System.out.println("最大公约数为:" + i);
				break;//
			}
		}
		
		//#########获取最小公倍数##############
		int max = (m > n)? m : n;
		for(int i = max;i <= m * n;i++){
			if(i % m == 0 && i % n == 0){
				System.out.println("最小公倍数:" + i);
				break;
			}
		}
		
	}
}

  • 总结
总结:循环结构结束的方式:
方式一:循环条件不满足,返回false时
方式二:在循环体内,执行了break

9. 循环结构:while

while结构的格式:
①
while(②){
	③
	④
}

执行过程:① - ②  - ③ - ④  - ② - ③ - ④ - ... - ②
  • 代码举例
class WhileTest {
	public static void main(String[] args) {
		//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
		int i = 1; //① 初始化部分

		int sum = 0;//记录偶数总和
		int count = 0;//记录偶数的个数

		while(i <= 100){ //② 循环条件部分
			//③ 循环体
			if(i % 2 == 0){
				System.out.println(i);
				sum += i;
				count++;
			}
			//④ 迭代条件
			i++;
		}

		System.out.println("偶数的总和为:" + sum);	
		System.out.println("偶数的个数为:" + count);	
		System.out.println(i); //101
	}
}
  • 说明
1. 使用while循环时,一定要小心,不要丢了迭代条件!!一旦丢了,就可能构成一个死循环!
2. while循环初始化条件部分对应的变量的作用域与for循环的初始化条件部分对应的变量的作用域不同。

结论:for循环和while循环是可以相互转换的。

10. 循环结构:do-while

do-while格式:

①
do{
	③
	④
}while(②);

执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
  • 代码举例
class DoWhileTest {
	public static void main(String[] args) {
		
		//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
		int i = 1;
		
		int sum = 0;//记录偶数总和
		int count = 0;//记录偶数的个数

		do{
			if(i % 2 == 0){
				System.out.println(i);
				sum += i;
				count++;
			}
			i++;
		}while(i <= 100);

		System.out.println("偶数的总和为:" + sum);	
		System.out.println("偶数的个数为:" + count);
		
		//#######do-while至少执行一次循环体##########
		int num = 10;
		do{
			System.out.println(num);
			num--;
		}while(num < 5);
		
	}
}
  • 说明
1. 相较于for、while循环来说,do-while至少执行一次循环体!
2. 从使用频率上来说,do-while 要少于while ,while要少于for
  • 可以做的练习
    请添加图片描述

请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值