程序流程控制
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();
}
}
}