Java——程序控制结构
程序流程控制
程序运行的流程控制决定程序是如何执行的
顺序控制
程序从上到下逐行的执行,中间没有任何判断和跳转
分支控制
if-else让程序有选择的执行,共有三种
单分支
if(条件表达式)
{
执行代码块(可以有多条)
}
当条件表达式为true时,就会执行{}中的代码,如果为false,就不执行
双分支
if(条件表达式)
{
执行代码块1(可以有多条)
}
else
{
执行代码块2(可以有多条)
}
当条件表达式为true成立时时,就会执行代码块1,否则执行代码块2
](https://img-
多分支
if(条件表达式)
{
执行代码块1(可以有多条)
}
else if
{
执行代码块2(可以有多条)
}...
else
{
执行代码块(可以有多条)
}
多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有,如果有else,如果所有的条件表达式都不成立,则默认执行else
只要找到一个执行入口,判断就结束
嵌套分支
在一个分支结构又完整的嵌套了另一个完整的分支结构(内层分支和外层分支)
练习题目:
//把字符串转成第一个字符
char gender=sc.next().charAt(0);
switch分支结构
switch(表达式)//Java中只要是一个表达式就会有值返回
{
case 常量1://当..
语句块1;
break;
case 常量2://当..
语句块1;
break;
case 常量n://当..
语句块1;
break;
default:
default语句块;
break;
如果没有break语句,就会直接执行语句块2,而不会进行判断(穿透),只要遇到一个break就会退出
表达式的数据类应该和case后面的常量类型一致,或者是可以自动转换成可以相互比较的类型
switch表达式的返回值必须是:byte,short,int,char,enum,String
case子句中的值必须是常量(或者常量表达式)不能是变量
default子句是可以选的,如果没有case匹配的语句,则执行default,如果没有default子句,又没有匹配任何常量,则没有输出
break语句用来在执行完应该case分支后,使程序跳出switch语句块,如果没有break,程序就会顺序执行到switch结尾,除非遇到一个break
练习:
1.用switch-case实现成绩判定:
2.用switch-case实现月份划分季节
使用case穿透现象实现:
int month=myScanner.nextInt();
swithc(month)
{
case 3:
case 4:
case 5:
System.out.println("这是春季");
break;
case 6:
case 7:
case 8:
System.out.println("这是春夏季");
break;
case 9:
case 10:
case 11:
System.out.println("这是秋季");
break;
case 12:
case 1:
case 2:
System.out.println("这是冬季");
break;
default:
System.out.println("输入格式错误");
switch与if的比较:
1.如果判断的具体数值不多,而且符合byte,short,int,char,enum,String这6种类型,虽然两个语句都可以使用,建议使用switch语句
2.其他情况:对于区间判断,对结果为boolean类型判断,使用if,if使用范围更广
循环控制
for循环
for(循环变量初始化;循环条件;循环变量迭代){
循环操作语句;
}
关键:循环变量初始化,循环条件,循环操作,循环变量迭代
循环流程控制图:
注意:
1.循环条件是返回应该布尔值的表达式
2.for循环的初始条件初始化和迭代可以写到其他地方,但是括号()中的;;不能省略
3. 没有循环判断条件则为无限循环即for(;;)(CTRL+C结束死循环)
4. 4.循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条迭代语句中间用逗号隔开
5. 编程核心:化繁为简,先死后活,实现代码的可移植性
while循环
循环变量初始化
while(循环条件){
循环体语句
循环变量迭代
}
while循环流程图
while循环结束后的代码还会继续执行
循环条件是返回一个布尔值的表达式
while循环是先判断再执行语句
do-while循环
循环变量初始化
do{
循环体语句
循环变量迭代
}while(循环条件);
do-while是先执行后判断,一定会至少执行一次
do-while循环流程图
循环条件是返回一个布尔值的表达式
do-while是先执行后判断
实例:
多重循环
嵌套循环(一般建议两次)
循环执行次数:外层m次,内层,最终内层语句执行次数为m*n次
嵌套循环就是把内层循环当作外层循环的循环体,只有内层循环条件为false时才结束内层循环,结束外层当次循环,开始外层下一次循环
示例:空心金字塔
public class Stars{
public static void main(String[] args){
int totalLevel=5;
for(int i=1;i<=totalLevel;i++){
for(int k=1;k<=totalLevel-i;k++){
System.out.print(" ");
}
for(int j=1;j<=2*i-1;j++){
if(j==1||j==2*i-1||i==totalLevel){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
}
}
化繁为简,先死后活很重要
跳转控制语句break
随机生成语句
(int)(Math.random()*100)+1
//Math.random随机返回带正号的double数,大于等于0.0,小于1.0
当某个条件满足时,终止循环,通过该需求说明其他流程控制的必要性
基本语法:
{
...
break;
...
}
while为例的循环示意图
break语句出现在多层嵌套语句块中时,可以通过标签指明要终止的是哪一层语句块,但是实际开发中尽量不要使用标签
如果没有指定默认break,默认退出最近的循环体
break后指定到哪个label就退出到哪里
标签名字由程序员指定
label1:
for(){
label2:
for(){
if(){
break;
}
System.out.println("");
}
}
//break后面什么都没有,等价于break label2,结束内层for循环
//break label1,直接结束外层for循环
实例:
String内容比较,一般选择第二种,可以避免空指针
Scanner myScanner=new Scanner(system.in);
String name="";
String passwd="";
int chance=3;
for(int i=0;i<3;i++){
name=myScanner.next();
passwd=myScanner.next();
if("aa".equals(name)&&"666".equals(passwd)){
System.out.println("true");
break;
}
System.out.println("false and 剩余机会:"+chance);
}
跳转控制语句continue
continue语句用于结束本次循环,继续执行下一次循环
continue语句出现在多层嵌套循环语句体中是,可以通过标签指明要跳过的是哪一层循环
基本语法:
{
...
continue;
...
}
while为例的循环示意图:
跳过其他语句块,也就是这一次循环剩下的所有语句都跳过
continue后面没有带标签等价于continue label2,跳过该层当前次循环,进入内层for循环的下一次
continue label1 跳过外层for循环的当次执行语句块,进入外层for循环的下一次
跳转控制语句return
return用于跳出所在方法
如果return用在main方法,代表退出程序
总结实例