4.程序流程控制

程序流程控制

1. 分支结构

1.1 基本if结构

语法:
if(布尔表达式){
​ //代码块1
}

后续代码…
执行流程:
对布尔表达式进行判断。
结果为true,则先执行代码块1,再执行后续代码。
结果为false,则跳过代码块1,直接执行后续代码。

import java.util.Scanner;

/**
 * 	需求:提示用户输入年龄 判断是否成年
 */
public class Test {
	public static void main(String[] args) {
		// 创建Scanner类型的变量
		Scanner input = new Scanner(System.in); // ctrl + 1回车 实现导包
	
		System.out.println("请输入您的年龄");
		
		int age = input.nextInt();
		
		if(age >= 18) {
			System.out.println("恭喜你,成年了");
		}
		
		System.out.println("程序结束");
	}
}
1.2 if-else结构

语法:
if(布尔表达式){
​ //代码块1
}else{
​ //代码块2
}
后续代码…
执行流程:
对布尔表达式进行判断。
结果为true,则先执行代码块1,再退出整个结构,执行后续代码。
结果为false,则先执行代码块2,再退出整个结构,执行后续代码。

else不能单独出现 必须结合if结构或者else - if结构

import java.util.Scanner;

/**
 * 	使用if-else结构实现
 * 	需求:提示用户输入年龄 判断是否成年
 *
 */
public class Test {
	public static void main(String[] args) {
		// 创建Scanner类型的变量
		Scanner input = new Scanner(System.in); // ctrl + 1回车 实现导包
	
		System.out.println("请输入您的年龄");
		
		int age = input.nextInt();
		
		if(age >= 18) {
			System.out.println("恭喜你,成年了");
		}else {
			System.out.println("未成年");
		}
		
		System.out.println("程序结束");
	}
}
import java.util.Scanner;
/**
 * 	使用if-else结构实现 
 * 	需求:根据用户的分数进行判断 是否可以获得奖励
 * 	如果 Java成绩 大于95  并且 数据库成绩 大于85 
 * 	或者
 * 	HTML成绩等于100 并且 JS成绩大于75 
 * 	获得奖励 非常好
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入Java成绩");
		
		double javaScore = input.nextDouble();
		
		System.out.println("请输入数据库成绩");
		
		double mysqlScore = input.nextDouble();
		
		System.out.println("请输入HTML成绩");
		
		double htmlScore = input.nextDouble();
		
		System.out.println("请输入JS成绩");
		
		double jsScore = input.nextDouble();
		
		
		if((javaScore > 95 && mysqlScore > 85)  || (htmlScore == 100 && jsScore > 75)) {
			System.out.println("非常好");
		}else {
			System.out.println("继续加油");
		}
		
		System.out.println("程序结束");
	}
}
1.3 多重if

语法:
if(布尔表达式1){
​ //代码块1
}else if(布尔表达式2){
​ //代码块2
}else if(布尔表达式3){
​ //代码块3
}else{
​ //代码块4
}

执行流程:
表达式1为true,则执行代码块1,再退出整个结构。

表达式2为true,则执行代码块2,再退出整个结构。

表达式3为true,则执行代码块3,再退出整个结构。

以上均为false,则执行代码块4,再退出整个结构。

注意:相互排斥,有一个为true,其他均不再执行,
适用于区间判断。

import java.util.Scanner;

/**
 * 	使用多重if实现如下效果
 * 	根据分数的区间进行等级判断
 * 	90分以上优秀
 * 	80分以上良好
 * 	70分以上中等
 * 	60分以上及格
 * 	60分一下 不及格
 * 	多重if用于处理某个值处于连续区间的情况 
 * 	条件书写要按照升序或者降序 不能乱序
 * 	多重if中的else根据情况是否书写
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入您的成绩");
		
		int score = input.nextInt();
		
		if(score > 80) {
			System.out.println("良好");
		}else if(score > 90) {
			System.out.println("优秀");
		}else if(score > 70) {
			System.out.println("中等");
		}else if(score >= 60) {
			System.out.println("及格");
		}else {
			System.out.println("不及格");
		}
		
		System.out.println("程序结束");
	}
}
1.4 嵌套if

语法:
if(外层表达式){
​ if(内层表达式){
​ //内层代码块1
​ }else{
​ //内层代码块2
​ }
}else{
​ //外层代码块
}

执行流程:
当外层条件满足时,再判断内层条件。

注意:
一个选择结构中,可嵌套另一个选择结构。
嵌套格式正确的情况下,支持任意组合。

import java.util.Scanner;

/**
 * 	需求:学校举行百米跑步比赛 时间小于13秒的可以进入决赛
 * 	然后根据性别进行分组  
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入成绩");
		
		double time = input.nextDouble();
		
		if(time < 13) {
			System.out.println("恭喜你,进入决赛");
			
			System.out.println("请输入性别");
			
			String sex = input.next();
			
			// 分组
			// 判断字符串是否与某一个内容相同  使用equals 
			// 使用 变量名.equals("比较的内容")
			if(sex.equals("男")) {
				System.out.println("进入男子组");
			}else if(sex.equals("女")){
				System.out.println("进入女子组");
			}else {
				System.out.println("暂未开放第三性别");
			}
			
		}else {
			System.out.println("很遗憾,下次继续加油");
		}
		
		System.out.println("程序结束");	
	}
}
1.5 switch结构

语法:
switch(变量|表达式){
​ case 值1:
​ 逻辑代码1;
​ case 值2:
​ 逻辑代码2;
​ case 值n:
​ 逻辑代码n;
​ default:
​ 未满足时的逻辑代码;
}

可判断的类型:
byte、short、int、char、String(JDK7+),枚举

执行流程:
如果变量中的值等于值1,则执行逻辑代码1。
如果变量中的值等于值2,则执行逻辑代码2。
如果变量中的值等于值n,则执行逻辑代码n。
如果变量中的值没有匹配的case值时,执行default中的逻辑代码。

注意:所有case的取值不可相同。

switch用于处理某个值属于固定等值的情况

switch中的default可以省略,根据需求是否书写。default的位置不固定,但是推荐写在所有的case之后,如果需要每种情况都独立,那么default之后也要加上break。

import java.util.Scanner;

/**
 * 	使用switch实现
 * 	第一名:奖励夏令营
 * 	第二名:非常好
 * 	第三名:奖励笔记本一本
 * 	第四名:口头表扬一次
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);

		System.out.println("请输入名次");

		int num = input.nextInt();

		switch(num) {
		
		case 1:
			System.out.println("夏令营");
			break;
		case 2:
			System.out.println("苹果12袋");
			break;
		case 3:
			System.out.println("笔记本一本");
			break;
		case 4:
			System.out.println("口头表扬一次");
			break;
		default:
			System.out.println("继续加油");
			break;
		}

		System.out.println("程序结束");
	}
}

2. 循环

2.1 while循环

计数器初始化;

while ( 循环条件 ) {

​ 循环操作

}

while:当……

任何循环都必不可少的四个条件:

1.计数器初始化

2.判断条件

3.循环体

4.计数器变化

while循环可以用于处理循环次数确定以及不确定的情况,通常用来处理循环次数不确定的情况

public class Test {
	public static void main(String[] args) {
		// 计数器初始化
		int i = 1;
		
		while(i <= 10) { // 判断条件
			System.out.println("第" + i + "遍好好学习"); // 循环体
			i++; // 计数器变化
		}
		
		System.out.println("程序结束");		
	}
}
import java.util.Scanner;

/**
 * 	需求:老师每天检查赵四的学习任务是否合格,
 * 	如果不合格,则继续进行。
 * 	老师给赵四安排的每天的学习任务为:
 * 	上午阅读教材,学习理论部分,下午上机编程,掌握代码部分。
 * 	使用while循环实现
 * 	以下代码同样拥有循环四个必不可少的条件
 * 	while循环可以用于处理循环次数确定以及不确定的情况
 * 	通常用来处理循环次数不确定的情况 
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请问你今天学习任务合格了吗?y/n");
		
		String answer = input.next();
		
		while(answer.equals("n")) {
			System.out.println("上午阅读教材,下午敲代码");
			
			System.out.println("请问你今天学习任务合格了吗?y/n");
			
			answer = input.next();
		}		
		System.out.println("恭喜你完成任务");
	}
}
2.2 do-while循环

计数器初始化;

do {

​ 循环操作

} while ( 循环条件 );

do-while是先执行 后判断 不管条件是否成立 至少执行一次

do-while可以处理循环次数确定或者不确定的情况 通常用来处理循环次数不确定的情况

因为循环次数确定的情况 使用for循环书写更为简洁

while和do-while的区别?

while循环是先判断后执行 条件不成立 一次都不执行

do-while先执行后判断 不管条件是否成立 至少执行一次

import java.util.Scanner;

/**
 * 	经过几天的学习,老师给赵四一道测试题,
 * 	让他先上机编写程序完成,然后老师检查是否合格。
 * 	如果不合格,则继续编写……  
 * 	使用do-while循环实现
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		String answer;
		
		do {
			System.out.println("上机编写测试");
			
			System.out.println("是否合格?y/n");
			
			answer = input.next();
			
		}while(answer.equals("n"));
				
		System.out.println("恭喜你完成任务");
	}
}
/**
 * 	使用do-while循环打印N遍好好学习
 */
public class Test {
	public static void main(String[] args) {
		int i = 1;
		do {
			System.out.println("第" + i + "遍好好学习");
			i++;
		}while(i <= 1000);
		
		System.out.println("程序结束");
	}
}
2.3 for循环

循环次数固定,for比while更简洁

for循环执行过程:

第一轮:

1.计数器初始化(只执行一遍)

2.判断条件

3.循环体

4.计数器变化

第二轮:

从判断条件开始执行

public class Test {
	public static void main(String[] args) {
		for(int i = 1;i <= 1000;i++) {
			System.out.println("第" + i + "遍好好学习");
		}
	}
}
import java.util.Scanner;
/**
 * 	循环输入某同学结业考试的5门课成绩,并计算平均分
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		double sum = 0;
		
		for(int i = 1;i <= 5;i++) {
			System.out.println("请输入第" + i + "门成绩");
			
			double score = input.nextDouble();
			
			sum = sum + score; // sum += score;
		}
		
		System.out.println("平均分是" + sum / 5);
	}
}
import java.util.Scanner;
/**
 * 	根据用户输入数字打印加法表
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		
		System.out.println("请输入一个数字");
		
		int num = input.nextInt();
		
		for(int i = 0;i <= num;i++) {
			System.out.println(i + "+" + (num - i) + "=" + num);
		}
		
		input.close(); // 关闭input流  避免警告
		
		System.out.println("程序结束");
	}
}

3. 三种循环对比

在这里插入图片描述

区别1:语法

区别2:执行顺序
while 循环:先判断,再执行
do-while循环:先执行,再判断
for循环:先判断,再执行

区别3:适用情况
循环次数确定的情况,通常选用for循环
循环次数不确定的情况,通常选用while或do-while循环

4. break

break关键字:break可以用于switch或者循环中

在switch中表示跳出switch结构

在循环中表示中断循环 未执行完的循环次数 不再执行

在循环中使用break,通常结合分支语句来使用

/**
 * 	使用for循环加break描述跑10圈  当跑到第5圈 退出
 */
public class Test {
	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			System.out.println("跑步第" + i + "圈");
			
			if(i == 5) {
				System.out.println("太累了,跑不动了");
				break;
			}
			
		}
		System.out.println("程序结束");	
	}
}
import java.util.Scanner;

/**
 * 	循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		int sum = 0;
		
		boolean flag = true; // 定义一个变量 作为标记 用于标记分数是否有负数的情况
		
		for(int i = 1;i <= 5;i++) {
			System.out.println("请输入第" + i + "门成绩");
			
			int score = input.nextInt();
			
			if(score < 0) {
				flag = false;
				System.out.println("分数输入有误:不能为负数");
				break;
			}
			sum += score;
		}
		
		if(flag) { // flag == true
			System.out.println("平均分是:" + sum / 5);
		}else {
			System.out.println("分数录入有误,不再计算平均分");
		}
	}
}

5. continue

continue : 继续

适用场景:只能用在循环中 表示跳出本次循环 继续执行下一次循环

对比break和continue

使用场合
​ break用于switch结构和循环结构中
​ continue用于循环结构中

作用(循环结构中)
​ break语句终止某个循环,程序跳转到循环块外的下一条语句
​ continue跳出本次循环,进入下一次循环
​ 双重循环亦如此

import java.util.Scanner;
/**
 * 	continue : 继续
 * 	适用场景:只能用在循环中 表示跳出本次循环 继续执行下一次循环
 * 
 * 	循环录入Java课的学生成绩,统计分数大于等于80分的学生比例
 */
public class Test {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.println("请输入班级总人数");
		
		int num = input.nextInt();
		
		double count = 0; // 用于统计大于等于80分的变量
		
		for(int i = 1;i <= num;i++) {
			System.out.println("请输入第个" + i + "人的成绩");
			
			double score = input.nextDouble();
			
			if(score < 80) {
				System.out.println("分数小于80 不再进行统计 直接执行下一次循环");
				continue;
			}
			
			System.out.println("分数大于等于80,count自增1");
			count ++;
		}
		
		System.out.println("大于等于80分总人数是:" + count);
		System.out.println("大于等于80分的学生占比是:" +  count / num * 100 + "%");
		
	}
}
/**
 * 	求1~10之间的所有偶数和 
 */
public class Test {
	public static void main(String[] args) {
		int sum = 0;
		for(int i =1;i <= 10;i++) {
			if(i % 2 != 0) {
				System.out.println("奇数不再进行累计,直接执行下一次循环" + i);
				continue;
			}
			sum += i;
		}
		
		System.out.println("偶数总和为:" + sum);	
	}
}

6. 多重循环

多重循环打印图案规律:外层循环控制行数 内层循环控制列数

外层循环变量变化一次 内层循环变量变化一轮

当我们使用多重循环 打印三角形

第一行元素的个数决定了计数器的初始值

如果元素个数越来越多 那么就++ 此时必须设置一个上限 也就是计数器必须小于或者小于等于某个值

如果元素个数越来越少 那么就-- 此时必须设置一个下限 也就是计数器必须大于或者大于等于某个值

package com.atguigu.test3;
/**
 * 	使用多重循环实现打印平行四边形
 */
public class Test {
	public static void main(String[] args) {
		for (int i = 1; i <= 5; i++) { // 外层循环  5行
			// 左半部分
			for(int j = 5;j >= i;j--) {
				System.out.print("&");
			}
			
			// 右半部分 
			for(int j = 1;j <= 5;j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}
/**
 * 	使用多重循环打印正三角形
 */
public class Test {
	public static void main(String[] args) {
		for (int i = 1; i <= 5; i++) {// 外层循环控制行数
			// 左半部分 倒三角
			for(int j = 5;j >= i;j--) {
				System.out.print(" ");
			}
			
			// 右半部分 直角三角形
			for(int j = 1;j <= 2 * i -1;j++) {
				System.out.print("*");
			}
			// 换行
			System.out.println();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值