一.什么是流程控制
Java程序在运行时,会有以下三种执行结构:
1.顺序结构:代码从上到下,依次执行,这是代码执行的基本结构。
2.分支结构:代码执行到某一代码片段时,遇到了多种继续执行的可能性,
需要选择一种可以执行的继续执行。
3.循环结构:代码执行到某一片段时,由于某种条件,需要执行多次。
二.分支流程控制
2.1 if-else 相关语法
if(boolean表达式){ //code1:表达式返回true执行 }else{ //code2:表达式返回false执行 }
这种结构相对简单,我们通过一个小案例来解释一下
package com.basic.day03.branch;
public class _01IfDemo {
public static void main(String[] args) {
//三目运算
int a = 10;
int b = 20;
String str = a<b ? "正确":"错误";
System.out.println("a<b?"+str);
//将上述代码转成if-else分支结构的语法
if(a<b){
System.out.println("正确");
}else{
System.out.println("错误");
}
System.out.println("--main方法结束--");
}
}
代码的前半部分使用了三目运算,判断出“a<b”这个布尔值是true,所以选择“正确”赋值
而把它改写成if-else分支语句写法相对简单,先在if的()填充布尔值,else不需要填充,只需要分别在if和else的{}中分别给上 System.out.println("正确"); 或者错误就可以。最后的返回结果如下:
2.2 if 单分支语法
在 if-else 语句中,可以不写else部分,这个分支依然成立;
1.带有else语句块的分支结构,一定会执行某一分支
2.不带else语句块的分支结构,可能一条分支都不执行
3.if分支结构不可能执行多条分支
我们通过一个案例来解释:
package com.basic.day03.branch;
public class _05IfDemo {
public static void main(String[] args) {
//年满十八岁,才可以单独进入澡堂子洗澡
int age = 16;
if (age > 18) {
System.out.println("可以单独进入澡堂子");
}
System.out.println("--------------------");
int answer = (int)(Math.random() * 10);
if (answer>6) {
System.out.println("随机出来的数字大于6");
} else if (answer>3) {
System.out.println("随机出来的数字大于3");
}
System.out.println("--main方法结束--");
}
}
首先设置一个int类型的变量age并赋值为16,然后用一个单独分支的if语句判断,返回结果是空的,这个过程不需要else语句;
而下一部分也是这样,设置一个[0,10)的随机数,如果大于6,就打印出来,如果大于3,也可以打印出来,但是若是小于等于3,最终的结果还是不显示出来。
2.3 多分支语法
在if-else语句中,多分支语法属于一种嵌套格式,在if或者else中嵌套更多的if或else if。
直接上案例:
package com.basic.day03.branch;
import java.util.Scanner;
public class _04IfDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
if (num<0|| num>100) {
System.out.println("输入有误,请重新输入");
}else{
if(num >=90){
System.out.println("优秀");
} else if (num>=80) {
System.out.println("良好");
} else if (num>=60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
}
sc.close();
}
}
在第一个else中,我们嵌套了一个if,达成了多分支,最后用一个else收尾,这也属于引用了一个scanner类来完成这个案例,需要注意if中执行的是boolean类型的判断语句。返回结果
2.4 Switch-case
语法: switch(变量|具有返回值的表达式){
case 值1: code1;
case 值1: code1;
case 值1: code1;
.......
default 值N codeN;
}
注意事项:
1若是想让Java执行值后的code代码,必须要让(变量|具有返回值的表达式)与case值完全相同
2.(变量|具有返回值的表达式)的类型只能是byte,short,int,char,String,枚举。
3.(变量|具有返回值的表达式)会选择case的值一一对照,知道完全相同为止,如果都对照不上,则会执行default的值。
4.switch语句具有穿透性,当switch与某一个值对应成功,则不会继续对照后面case的值,执行后面的所有代码,如果想取消穿透性,则需要使用关键字 break
break的作用是跳出switch结构
我们上一个案例:
public class _06SwitchCaseDemo {
public static void main(String[] args) {
int num = (int)(Math.random()*5);
switch(num) {
case 0:
System.out.println("随机的是0");break;
case 1:
System.out.println("随机的是1");break;
case 2:
System.out.println("随机的是2");break;
case 3:
System.out.println("随机的是3");break;
default: //相当于else但还是有区别
System.out.println("随机的是4");
}
}
}
通过上述的代码和运行结果我们可以发现,我们首先设置了0~5的随机数,然后使用switch-case结构,来显示生成的随机数是几,需要在每步跳出结构,要不然会多次运行输出语句
2.5if 和switch的使用场景
如果使用场景是一个确定的范围,则使用if结构;
如果使用场景是一个确定的值,则使用switch-case结构,if结构也可以。
三.循环流程控制
3.1 for 循环
语法:for(循环起点,循环条件,循环步长){
code //循环体,当满足循环条件时,这里的代码会循环运行
}
我们需要在循环起点声明变量并初始化,for循环的工作流程是重复执行循环条件,循环体,循环步长,知道变量不满足循环条件,会跳出循环。
我们看一个最简单的循环案例:
for(int i = 1; i <= 10; i++){
System.out.println("Hello world");
首先声明变量 i 并初始化值为1,设置循环条件小于等于10,i每次循环会自增1,我们可以判断,会循环10次,则会执行10次输出语句,最后的返回结果是:
我们也可以在输出语句中打印变量的值:
for(int i = 1; i <= 10; i++){
System.out.println("i的值:"+i);
}
和上述代码类似,这次打印的值是 i 的值了
for循环执行10次,则会返回从1~10的10个数字:
此外,我们还可以在for循环的循环起点改变变量值,也可以改变循环条件,比如
使用for循环生成20以内的偶数:
for(int i = 2; i <=20; i+=2){
System.out.println("i的值:"+i);
这样就会生成10个20以内的偶数
我们可以利用for循环生成一个5*5的*方阵:
for(int i=0 ; i<5 ; i++ ){
System.out.println("*****");
}
初始变量值设置为0,i<5,那么会循环5次,每次都输出字符串"*****"
我们还可以使用for循环来计算1~100的和:
我们需要先定义一个变量sum作为计算和的接受变量;
int sum = 0;
for(int i = 1;i <=100;i++){
sum = sum+i;
}
System.out.println("1~100的和:"+sum);
需要注意: sum = sum +i 的意思等同于 sum += i,这是一个累加操作,来计算总和
在for循环结构中:
for()中除了;;都可以不写
循环起点中的变量可以在for循环前面提前声明的初始化
循环步长可以写在循环体中
循环条件如果不写,默认值是true,相当于死循环。
//循环因子的声明和初始化写在了for循环之前
int i= 1;
for(;i<10;i++){
System.out.println(i);
}
这段代码就是把循环起点中的变量的声明和初始化都放在了for循环的前面,依旧可以运行
//循环步长写在循环体内:
for (int m = 0;m<10;){
System.out.println(m);
m+=3;
}
这段代码就是把循环步长写在了循环体内,依然不影响运行,但是需要注意的是,以上两种方式,都不要忘记写()中的两个";"
当循环体的代码只有一行时,可以省略{ }
//循环体中只有一行代码时,可以省略{}
for(int n = 0;n<10;n++)
System.out.println("n="+n);
这样依旧可以正常运行
if-else也是一样的,如果结构体中只有一行代码的话,可以不用写{ }
int x = (int)(Math.random()*2);
int y = (int)(Math.random()*2);
if(x==y)
System.out.println("x和y相等");
else
System.out.println("x和y不相等");
3.2 while 结构
语法: while(循环条件){
code//循环体
}
int i = 0; //循环要素之循环变量的声明和初始化写在while之前
while(i<5){
i++; //循环要素之循环步长,写在了循环体中
System.out.println("hello world");
}
我们需要把循环变量的声明和初始化放在while()的前面;
其次,循环条件放在while()中,
循环步长放在了循环体中;
最后得到的结果就是:
可以看到,打印了五次hello world
案例1:使用while循环,打印100以内能被5整除的数字
int b = 1;
while(b <101){
b++;
if(b % 5 == 0){
System.out.println("b: " + b);
}
}
通过上述代码,首先声明了循环变量 b 并初始化值为1;
循环条件是小于101,
循环体中先设置了循环步长,b自增1,执行代码设置了一个if结构,判断b模5是否等于0,如果等于0就打印b
案例2: 使用while循环,计算100以内能被3整除的数字和
肯定需要事先定义一个变量sum 来计算总和,然后使用while循环,控制条件小于等于100
int sum = 0;
int a=1;
while (a<101){
if(a % 3 == 0){
sum += a;
}
a++;
}
System.out.println("sum: " + sum);
if中的判断语句需要注意==, sum +=a 的意思等价于 sum = sum+a,是累加的意思,需要在if判断语句的后面加上循环步长a++,
案例3:使用while语句,判断一个数是几位数
int num = 0;
int count = 1;//定义一个变量,统计循环次数,也就是除以10的次数
while (num/10!=0) {//判断num是不是一位数,如果不是一位数,就进入循环体,如果是,就直接打印了
num = num / 10;
count++;
}
System.out.println("是"+count+"位数");
首先定义了循环变量并初始化值为0;
之后定义了一个统计变量count,来统计除10的次数
循环条件是num/10!=0,如果初始变量num输入的是0,则不会进入循环,直接在后面打印是1位数
如果初始变量设置的比较大,就会进入循环体,先除10,然后count自增1,表示多了一位,直到变量num比10小,除10等于0,结束循环,输出count的值作为位数。
3.3 do while 循环结构
语法:
do{
循环体
}while(循环条件)
特点: 先执行一遍循环体,再判断是否满足循环条件,如果满足,循环执行循环体
如果循环条件一开始就不成立,则do while 比 while 多执行一次循环体。
package com.basic.day04.loop;
import java.util.Scanner;
public class _05DoWhileDemo {
public static void main(String[] args) {
//使用for或者while来完成模拟ATM机输入密码操作,5次不正确就结束循环。
String realPWD = "123456";
Scanner sc = new Scanner(System.in);
boolean flag = false; //false表示关闭
for (int i = 0; i < 5; i++) {
System.out.println("请输入密码:");
String inputPWD = sc.nextLine();
if (inputPWD.equals(realPWD)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("密码正确");
} else {
System.out.println("密码错误");
}
}
}
首先导包关于Scanner的,先声明一个字符串变量 realPWD 代表真实的密码
之后引用Scanner类,然后定义一个boolean类型的变量,作用是判断,初始值设置为false
使用for循环设置循环变量初始值为1,循环条件小于5(即循环5次),循环步长是i++
扫描字符串类型变量inputPWD,然后通过if判断语句,如果输入的密码和真实密码相同则跳出循环,需要设置跳出循环的关键字break
之后再for循环外设置一个if判断语句,如果布尔值是true就打印密码正确,其他情况密码错误。
我们可以使用 do while来完成这一个案例:
package com.basic.day04.loop;
import java.util.Scanner;
public class _06DoWhileDemo {
public static void main(String[] args) {
String realPWD = "123456";
String inputPWD = " ";
Scanner sc = new Scanner(System.in);
do{
System.out.println("请输入密码");
inputPWD = sc.nextLine();
}while(!realPWD.equals(inputPWD));
if(inputPWD.equals(realPWD)){
System.out.println("密码正确");
}else{
System.out.println("密码错误");
}
}
}
我们首先定义了正确的密码是123456,输入密码是空字符串,然后引用Scanner方法,进入do-while结构先执行一遍循环体,扫描在控制台输入的inputPWD,然后判断循环条件是否成立,如果输入的密码与真实的密码不一样,则继续循环。最后执行一个判断语句,如果密码相等,则输出密码正确。