07-控制结构(顺序控制、分支控制、循环控制)
程序流程控制介绍
在程序中,程序运行的流程控制决定程序是如何运行的。
主要有三大流程控制语句:顺序控制、分支控制和循环控制。
1. 顺序控制
程序从上到下,逐行地执行,中间没有任何判断和跳转。
2. 分支控制(if , else , switch)
if-else 分支结构
让程序有选择的执行,分支控制有三种:单分支、双分支和多分支。
a) 单分支
基本语法:
if(条件表达式){
执行代码块; //(可以有多条语句)
}
说明:当条件表达式为true时,就会执行{}里面的代码;如果为false,则不执行。
这里需要特别注意:如果{}里面只有一条语句,则可以不用{},但建议加上{}。
//需求:编写一个程序,可以输入年龄,如果该同志的年龄大于18岁,则输出"你年龄大于18,要对自己的行为负责,送入监狱!" import java.util.Scanner; public class If01{ public static void main(String[] args){ //思路分析 //1.定义一个Scanner对象,接收输入的年龄 Scanner sc = new Scanner(System.in); System.out.println("请输入年龄:"); //2.把年龄保存到一个变量 int age int age = sc.nextInt(); //3.使用 if 判断,是否输出对应信息 if(age > 18){ System.out.println("你年龄大于18,要对自己的行为负责,送入监狱!"); } System.out.println("程序继续..."); } }
b) 双分支
基本语法:
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
说明:当条件表达式成立时,即执行代码块1,否则执行代码块2。
//需求:编写一个程序,可以输入年龄,如果该同志的年龄大于18岁,则输出"你年龄大于18,要对自己的行为负责,送入监狱!" //否则,输出"你的年龄不大,这次放过你了!" import java.util.Scanner; public class If02{ public static void main(String[] args){ //思路分析 //1.定义一个Scanner对象,接收输入的年龄 Scanner sc = new Scanner(System.in); System.out.println("请输入年龄:"); //2.把年龄保存到一个变量 int age int age = sc.nextInt(); //3.使用 if-else 判断,是否输出对应信息 if(age > 18){ System.out.println("你年龄大于18,要对自己的行为负责,送入监狱!"); }else{ System.out.println("你年龄不大,这次放过你了!"); } System.out.println("程序继续..."); } }
c) 多分支
基本语法:
if(条件表达式1){
执行代码块1;
}
else if(条件表达式2){
执行代码块2;
}
...
else{
执行代码块n;
}
说明:当条件表达式1成立时,即执行代码块1;如果条件表达式1不成立时,才去判断表达式2是否成立,如果条件表达式2成立时,就执行代码块2;以此类推,如果所有的表达式都不成立时,则执行else代码块。
import java.util.Scanner; public class NestedIf{ public static void main(String[] args){ /** * 参加歌手比赛,如果初赛成绩大于8.0,则进入决赛,否则提示淘汰。 * 并且根据性别提示进入男子组或女子组。 * * 提示:double score; char gender; * 接收字符:char gender = Scanner.next().CharAt(0); * * 思路分析 * 1.创建Scanner对象,接收用户输入 * 2.接收 成绩 保存到 double score * 3.使用 if-else 判断,如果初赛成绩大于8.0进入决赛,否则提示淘汰 * 4.如果进入到决赛,再接收 char gender ,使用 if-else 输出信息 * */ Scanner sc = new Scanner(System.in); System.out.println("请输入该歌手的初赛成绩:"); double score = sc.nextDouble(); if(score > 8.0){ System.out.println("请输入该歌手的性别:"); String gender1 = sc.next(); //String类型转char类型,调用getChar(0)方法将单个字符串转换为char char gender2 = gender1.charAt(0); if(gender2 == '男'){ System.out.println("恭喜您,进入男子组决赛!"); }else if(gender2 == '女'){ System.out.println("恭喜您,进入男子组决赛!"); }else{ System.out.println("抱歉,性别输入错误!"); } }else{ System.out.println("抱歉,您未进入决赛!"); } } }
switch 分支结构
基本语法:
switch(表达式){
case 常量1: //当表达式的值与case 常量1匹配,则执行语句块1
语句块1;
break; //表示退出switch
case 常量2: //如果没有匹配case 常量1,则继续判断是否与case 常量2匹配
语句块2;
break;
...
case 常量n:
语句块n;
break;
default: //如果一个都没有匹配上,则执行default语句块
default 语句块;
}
这里需要注意:
a) 表达式的数据类型,应和case后的常量类型一致,或者是自动转成可以相互比较的类型(比如表达式是char,而常量是int)
b) switch中表达式的返回值,必须是byte,short,int,char,enum,String类型
c) case子句中的值必须是常量,而不是变量
d) default子句是可选的,当没有匹配的case时,执行default语句
e) break语句,是用来执行完一个case分支后,使程序跳出switch分支结构,如果没有写break,程序会顺序执行到下一个case分支,直到switch结尾
import java.util.Scanner; public class Switch01{ public static void main(String[] args){ /** * * 需求:编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g * a 表示 星期一,b 表示 星期二,... * 根据用户的输入,显示相应的信息 * * 思路分析 * 1. 接收一个字符,创建Scanner对象 * 2. 使用 switch 来完成匹配,并输出对应信息 * */ Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符(a-g):"); //String类型转char类型,调用getChar(0)方法将单个字符串转换为char char c1 = sc.next().charAt(0); switch(c1){ case 'a': System.out.println("今天星期一,猴子穿新衣"); break; case 'b': System.out.println("今天星期二,猴子肚子饿"); break; case 'c': System.out.println("今天星期三,猴子去爬山"); break; case 'd': System.out.println("今天星期四,猴子看电视"); break; case 'e': System.out.println("今天星期五,猴子爱跳舞"); break; case 'f': System.out.println("今天星期六,猴子去烤肉"); break; case 'g': System.out.println("今天星期天,猴子不吸烟"); break; default: System.out.println("抱歉,您输入的字符有误,不在a-g范围内!"); } System.out.println("已退出switch语句,继续执行程序..."); } }
if-else和switch的比较
a) 如果判断的具体数值不多,而且符合byte、short、int、char、enum、String这六个类型。虽然两个语句都可以使用,但建议使用switch语句
b) 其它情况,需要对区间进行判断,或者对结果类型为boolean类型进行判断,则使用if-else,使用范围更广
3.循环控制
for 循环控制
基本语法:
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(可以多条语句);
}
这里需要注意:
a) for循环控制四个要素的顺序:(1)循环变量初始化 (2)循环条件 (3)循环操作 (4)循环变量迭代
b) 循环条件是返回一个boolean值的表达式
c) for(;循环条件;) 中的循环变量初始化和循环变量迭代,可以写到其它地方,但是分号不能省略
e) 如果 循环操作(语句) 只有一条语句,可以省略{},但建议不要省略
public class For01{ public static void main(String[] args){ //for(循环变量初始化;循环条件;循环变量迭代) for(int i = 1; i <= 10; i++){ System.out.println("你好,这是第" + i + "次循环..."); } // System.out.println("i = " + i); 错误: 找不到符号i,这是因为方法内声明的局部变量 //for(;循环条件;)中的循环变量初始化和循环变量迭代,可以写到其它地方 //但是分号不能省略 int j = 1; for(; j <= 10;){ System.out.println("你好,这是第" + j + "次循环..."); j++; } System.out.println("j = " + j); //j = 11 } }
while 循环控制
基本语法:
循环变量初始化;
while(循环条件){
循环体(语句);
循环变量迭代;
}
这里需要注意:
a) while循环控制也有四个要素,只是四要素放的位置不一样:(1)循环变量初始化 (2)循环条件 (3)循环体 (4)循环变量迭代
b) 循环条件也是返回一个boolean值的表达式
c) while循环是先判断循环条件,再执行循环体语句(先判断再执行)
public class While01{ public static void main(String[] args){ //for 循环控制 for(int i = 1; i <= 10; i++){ System.out.println("你好,这是for循环的第" + i + "次循环..."); } //while 循环控制 int j = 1; while(j <= 10){ System.out.println("你好,这是while循环的第" + j + "次循环..."); j++; } } }
do while 循环控制
基本语法:
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
这里需要注意:
a) do while 是关键字
b) do while循环控制也有四个要素,只是四要素放的位置不一样:(1)循环变量初始化 (2)循环体 (3)循环变量迭代 (4)循环条件
c) do while循环是先执行循环体语句,再判断循环条件(先执行再判断,也就是说至少会执行一次)
public class DoWhile01{ public static void main(String[] args){ //while 循环控制 int j = 1; while(j <= 10){ System.out.println("你好,这是while循环的第" + j + "次循环..."); j++; } //dowhile 循环控制 int i = 1; do{ //循环执行语句 System.out.println("你好,这是do...while循环的第" + i + "次循环..."); //循环变量迭代 i++; }while(i <= 10); System.out.println("退出do...while,继续执行..."); } }
多重循环控制(嵌套循环)
将一个循环放在另一个循环体内,就形成了嵌套循环。
实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层循环。
import java.util.Scanner; public class MulForExercise01{ public static void main(String[] args){ /** * 需求1:统计3个班级成绩情况,每个班有五名同学 * 求出各个班的平均分和所有班级的平均分【学生成绩从键盘输入】 * * * 思路分析: * (1) 先计算一个班的情况,5个学生的成绩,使用for循环 * 1.1 创建Scanner对象,接收用户输入的学生成绩 * 1.2 得到该班级的平均分,定义一个 double sum 变量,把该班级的5个学生成绩累计计算 * * (2) 统计三个班(每个班5个学生)的平均分,再外面嵌套一个for循环 * * (3) 统计所有班级的平均分,定义一个 double totalScore变量,把三个班级的学生成绩累计计算 * */ //创建Scanner对象,接收用户输入的学生成绩 Scanner sc = new Scanner(System.in); //定义一个 double sum 变量 double sum = 0.0; //定义一个 double totalScore 变量 double totalScore = 0.0; for(int i = 1; i <= 3; i++){ for(int j = 1; j <= 5; j++){ //接收用户输入的学生成绩 String tip = String.format("请输入第%d个班的第%d个学生的成绩:",i,j); System.out.println(tip); double score = sc.nextDouble(); //把该班级的5个学生成绩累计计算 sum += score; } //输出各个班的平均分 System.out.println("第" + i + "个班的总成绩 = " + sum + "\t平均分 = " + (sum/5.0)); //把三个班级的学生成绩累计计算 totalScore += sum; } //所有班级的平均分 System.out.println("三个班的总成绩 = " + totalScore + "\t平均分 = " + (totalScore/15.0)); } }
扩展:break 和 continue
break和continue都是用来控制循环结构的,主要作用是停止循环。
break语句的作用是跳出一个循环体或者完全结束一个循环
a) 结束本次循环,并停止下次循环条件判断(在多重嵌套循环中,break默认跳出最近循环体)
b) 可以作用于switch语句
continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定
a) 结束本次循环,继续下次循环,并进行条件判断(在多重嵌套循环中,continue默认跳过最近循环体的本次循环)
b) 不可作用于switch语句
public class Break01{ public static void main(String[] args){ // break 使用 for(int i =1; i <= 5; i++){ if(i == 3){ break; } System.out.println("i = " + i); //当i = 3时,结束循环 } // continue 使用 for(int i =1; i <= 5; i++){ if(i == 3){ continue; } System.out.println("i = " + i); //当i = 3时,只是跳出本次循环 } } }