流程控制语句
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说程序的流程对运行结果有直接的影响。
所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
流程控制语句分类
顺序结构
选择结构
循环结构
顺序结构
顺序结构概述
是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
总的来说:写在前面的先执行,写在后面的后执行。
选择结构
选择结构也被称为分支结构。
选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,
所以产生选择,按照不同的选择执行不同的代码。
Java语言提供了两种选择结构语句
if语句
switch语句
选择结构(if语句)
if语句有三种格式
if语句第一种格式:
if(关系表达式) {
语句体
}
执行流程
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体
如果是false就不执行语句体
注意事项:
1、如果在关系表达式小括号后面加上了一个分号,说明if语句结束
默认存在一个空语句体
2、括号都是成双成对出现的
3、小括号中关系表达式的结果必须是布尔类型(boolean类型)
示例
public class IfDemo1 {
public static void main(String[] args) {
System.out.println("程序开始执行");
int a = 12;
if(a == 10) {
System.out.println("a的值是10");
}
System.out.println("over");
}
}
if语句第二种格式:
if(关系表达式) {
语句体1;
}else {
语句体2;
}
执行流程
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
举例:
上厕所案例,用键盘录入实现
分析:
1、导包
2、创建键盘录入对象
3、键盘录入信息
4、if判断输入的信息是男生还是女生
5、输出
//导包
import java.util.Scanner;
public class IfDemo2 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//键盘录入信息
System.out.println("请输入你是男生还是女生(男生扣1,女生扣2)");
int i = sc.nextInt();
if(i == 1){
System.out.println("请走男生通道");
}else {
System.out.println("请走女生通道");
}
}
}
if语句的第二种格式与三目运算符的关系
注意事项:
1、当if-else格式中的语句体是一条输出语句的时候,不能转换成三目运算符
2、当if-else格式中的语句体不是一条的时候,也不能转换成三目运算符
public class IfDemo3 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int res1 = (a > b)?a:b;
System.out.println(res1);
if(a > b){
res1 = a;
a++;
}else {
res1 = b;
b++;
}
System.out.println(res1);
//两者不能转换,情况1
// int res2 = (a > b)?res1=a;a++;:res1=b;b++;
//两者不能转换,情况2
// if(a < b){
// System.out.println("a比b小");
// }else {
// System.out.println("a比b大或者相等");
// }
// (a < b)?System.out.println("a比b小"):System.out.println("a比b大或者相等");
}
}
if语句的第三种格式:
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if(关系表达式3){
语句体3;
}
...
else{
语句体n;
}
执行流程
首先判断关系表达式1看其结果是true还是false
如果是true就执行语句体1
如果是false就继续判断关系表达式2看其结果是true还是false
如果是true就执行语句体2
如果是false就继续判断关系表达式…看其结果是true还是false …
如果没有任何关系表达式为true,就执行语句体n+1。
示例
x和y的关系满足如下:
x>=3 y = 2x + 1;
-1<=x<3 y = 2x;
x<=-1 y = 2x - 1;
键盘录入x的值,判断x的范围,执行不同的公式
分析:
1、导包
2、创建键盘录入对象
3、用变量x接收键盘录入的int类型的数据
4、if语句判断执行不同的路径
5、输出
//导包
import java.util.Scanner;
public class IfTest1 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//键盘录入数据
System.out.println("请输入x的值:");
int number = sc.nextInt();
int y = 0;
if (number >= 3) {
y = 2 * number + 1;
} else if (number >= -1 & number < 3) {
y = 2 * number;
} else if (number <= -1) {
y = 2 * number - 1;
} else {
System.out.println("输入的数据有误");
}
System.out.println("y的值为:" + y);
}
}
if语句的嵌套:
示例
需求:获取三个数据中的最大值
键盘录入改进
//导包
import java.util.Scanner;
public class IfTest3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数据:");
int a = sc.nextInt();
System.out.println("请输入第二个数据:");
int b = sc.nextInt();
System.out.println("请输入第三个数据:");
int c = sc.nextInt();
if(b > c){
if(b > a){
System.out.println("最大值是b:"+b);
}else {
System.out.println("最大值是a:"+a);
}
}else {
if(c > a){
System.out.println("最大值是c:"+c);
}else {
System.out.println("最大值是a:"+a);
}
}
}
}
** if 语句的第三种格式可以省略else,但是不建议省略。(省略了就不属于上面的三种格式了)
程序示例:
import java.util.Scanner;
public class IfDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数:");
int x1 = sc.nextInt();
System.out.println("请输入第二个数:");
int x2 = sc.nextInt();
if (x1 > x2) {
System.out.println("x1是较大的数,值为:" + x1);
} else if (x2 > x1) {
System.out.println("x2是较大的数,值为:" + x2);
}
}
选择结构(switch语句)
switch语句格式:
switch(表达式) {
case 常量1:
语句体1;
break;
case 常量2:
语句体2;
break;
…
case 常量n:
语句体n;
break;
default:
语句体n+1;
break;
}
解释分析结构:
1、switch表达式的结果可以是哪些数据类型?(面试题)
表达式的结果可以是:byte,short,int,char。
在JDK1.5以后可以是枚举类型。
在JDK1.7以后可以是String。
名词解释:
case: 后面跟的是要和表达式的结果进行比较的值(常量),如果说匹配到了对应的case的值,
那么就执行相对应的语句体,而且这个语句的部分可以是一条语句,也可以是多条语句。
break: 表示中断的意思,结束的意思,可以结束switch语句。
default: 表示默认的意思,当表达式的结果与所有的case的常量都不匹配的时候,
最后才执行。(与default处在switch语句体的位置无关)
执行流程:
1、计算表达式的值。
2、拿着这个计算好的值与case相对应的值(常量)按照顺序从上往下依次进行比较,如果有相同的值,就开始执行此位置的case中的语句体内容。
3、当语句体的内容执行完毕后,会紧接执行break语句,执行break语句就代表着咱们这个
switch选择结构的结束。(跳出switch选择)
4、当第二步从上往下去匹配case的值的时候,如果没有匹配到相应的值,就会执行default语句中语句体内容,最后跳出switch语句。
注意事项:
1、case后面的值不能有重复的。(重复会报错)
2、default语句可以进行省略,一般情况下,不建议删除。
3、case 后面紧跟着的只能是常量,或者常量之间的运算,不能是变量。
4、break语句可以省略,代码也不会报错,一般情况下,不建议省略,
如果你省略了,结果可能不是你想要的结果。
当匹配到break语句省略的那个case的时候,首先会执行对应的语句体,然后从匹配
到的case一直运行到有break语句为止。
5、default语句可以放在任意地方吗?
可以,因为我们的switch语句执行流程是严格按照先在所有的case中进行匹配,当所有
的case都不匹配的时候,最后再去执行default语句,这和你default语句写的顺序没有关系。
switch语句与if语句嵌套使用:
程序示例
import java.util.Scanner;
public class SwitchIfDemo1 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//可乐 3, 旺仔牛奶 5, 红牛 6, 农夫山泉 2, 脉动 4
//键盘录入数据表示身上有多少钱
System.out.println("请输入您身上带了多少钱:");
int money = sc.nextInt();
//switch语句与if语句嵌套使用
if(money>=2 & money<100){
System.out.println("欢迎光临!!!");
switch (money){
case 2:
System.out.println("购买农夫山泉");
break;
case 3:
System.out.println("购买可乐");
break;
case 4:
System.out.println("购买脉动");
break;
case 5:
System.out.println("购买旺仔牛奶");
break;
case 6:
System.out.println("购买红牛");
break;
default:
System.out.println("没有你想要的饮料");
break;
}
}else if(0
System.out.println("您带的钱太少了,下次带多一点");
}else if(money >=100){
System.out.println("随便挑");
}else {
System.out.println("你是个穷鬼,下次再来吧");
}
}
}
例题
模拟做单项选择题,根据你的选择,给出对应的答案。(表达式是字符的情况)
import java.util.Scanner;
public class SwitchTest1 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("题目:你学的怎么样?");
System.out.println("请输入你选择的选项(A/B/C/D)其中一个");
String s = sc.next();
switch (s){
case "A":
System.out.println("A选项:非常好");
break;
case "B":
System.out.println("B选项:很好");
break;
case "C":
System.out.println("C选项:优秀");
break;
case "D":
System.out.println("D选项:无与伦比");
break;
default:
System.out.println("您输入的选项有误");
break;
}
}
}
看程序写结果
public class SwitchTest3 {
public static void main(String[] args) {
int x = 2;
int y = 3;
switch (x) {
default:
y++;
break;
case 3:
y++;
case 4:
y++;
}
System.out.println("y=" + y);
}
}
请问输出的y=??
答案:y=4
程序运行步骤(原因)
1.首先输入的x的值与case后面的值做比较,没有符合的。
2.运行default的语句体y++,然后运行break。跳出switch语句。
看程序写结果2
public class SwitchTest4 {
public static void main(String[] args) {
int x = 2;
int y = 3;
switch(x){
default:
y++;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y);
}
}
请问输出的y=??
答案:y=6
程序运行步骤(原因)
1.首先输入的x的值与case后面的值做比较,没有符合的。
2.运行default的语句体y++,然后因为没有break。所以没有跳出switch语句。
但是程序穿透运行,按照顺序结构继续执行下面的两个y++。
循环结构:for循环、while循环、do---while循环。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环
体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,
否则循环将一直执行下去,形成死循环。
循环语句的组成
初始化语句:
一条或者多条语句,这些语句完成一些初始化操作。
判断条件语句:
这是一个boolean 表达式,这个表达式能决定是否执行循环体。
循环体语句:
这个部分是循环体语句,也就是我们要多次做的事情。
控制条件语句:
这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。
循环结构(for循环语句)
for循环语句格式:
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
执行流程
A:执行初始化语句
B:执行判断条件语句,看其结果是true还是false 如果是false,循环结束。 如果是true,继续执行。
C:执行循环体语句
D:执行控制条件语句
E:回到B继续
程序示例
public class ForDemo1 {
public static void main(String[] args) {
//打印10行HelloWorld
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("==================用for循环改进==================");
// int i=1; 初始化值的作用:因为我们要打印10句HelloWorld,从第一次开始,所以
// 我们需要定义一个变量int类型的变量去开始计数,表示第几次循环。
// i<=10; 条件判断语句,这个语句使用控制是否进入循环的条件。
// i++ 控制循环体中的条件的变化,在这里表示的是,每循环一次,i++
for(int i=1;i<=10;i++){
System.out.println("HelloWorld");
}
}
}
使用for循环的注意事项
1、条件判断语句只能是boolean类型
2、当循环体的语句只有一条的时候,可以省略大括号,
如果循环体的语句有多条的时候,这时候需要添加大括号,如果不添加
循环语句只针对第一条语句有效。(建议,永远不要省略大括号)
3、如果在小括号后加分号,默认有一个空语句体,后面的代码为正常的代码块,不参与循环。
4、初始化语句可以不在for循环中的小括号中体现,但是必须在使用之前定义好。
5、条件判断语句可以删除,但是删除之后,就没有了控制循环结束的条件,就变成了死循环。
6、控制条件语句删除之后,也变成了死循环,你可以删除,但是初始化的变量的值一定
要在循环体中发生变化。
死循环示例:
for( ; ; ){ 。。。}
示例
public class ForDemo2 {
public static void main(String[] args) {
int i = 1; //初始化语句可以不在for循环中的小括号中体现,但是必须在使用之前定义好。
for (; i <= 10; ) { //如果在小括号后加分号,默认有一个空语句体,后面的代码为正常的代码块,不参与循环。
System.out.println("数加");
i++; //控制条件语句删除之后,也变成了死循环,你可以删除,但是初始化的变量的值一定要在循环体中发生变化。
}
}
}
例题
/*
求出1-10之间数据之和
*/
public class ForTest2 {
public static void main(String[] args) {
//定义一个变量接收和,初始值我们随便给,这里就给0,建议不到在后面再赋值,以免忘记,程序报错。
int sum = 0;
for (int i = 1; i <= 10; i++) {
// System.out.println(i);
sum = sum + i;
}
System.out.println("从1-10的和为:" + sum);
}
}
例题
/*
偶数:能被2整除的数,叫做偶数
奇数:不能被2整除的数,叫奇数
需求1:求出1-100之间偶数和
需求2:求出1-100之间奇数和
*/
public class ForTest3 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
// System.out.println(i);
//判断是否是偶数,与2进行取模,看看余数是不是等于0
if (i % 2 == 0) {
sum = sum + i;
}
}
System.out.println("1-100的偶数之和为:" + sum);
sum = 0;
for (int i = 1; i <= 100; i++) {
//判断是否是奇数,与2进行取模,看看余数是不是等于1
if (i % 2 == 1) {
sum = sum + i;
}
}
System.out.println("1-100的奇数之和为:" + sum);
}
}
例题
请在控制台输出满足如下条件的五位数
个位等于万位
十位等于千位
个位+十位+千位+万位=百位
分析:
1、获取10000-99999的数据
2、获取获取个位,十位,百位,千位,万位
3、&&连接三个条件
12345 % 10 == 5 12345/10 = 1234
1234 % 10 == 4 12345/10/10 = 123
123 % 10 == 3 12345/10/10/10 = 12
12 % 10 == 2 12345/10/10/10/10 = 1
1 % 10 == 1
public class ForTest5 {
public static void main(String[] args) {
for(int i=10000;i<=99999;i++){
// System.out.println(i);
//获取个位
int geWei = i%10;
//获取十位
int shiWei = i/10%10;
//获取百位
int baiWei = i/10/10%10;
//获取千位
int qianWei = i/10/10/10%10;
//获取万位
int wanWei = i/10/10/10/10%10;
if(geWei==wanWei && shiWei==qianWei && geWei+shiWei+qianWei+wanWei==baiWei){
System.out.println(i);
}
}
}
}
循环结构(while循环语句)
while循环语句格式:
基本格式
while(判断条件语句) {
循环体语句;
}
完整格式
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
执行流程
1、先执行初始化语句。
2、判断关系表达式的结果,
如果是true,进入while循环,执行循环体内容。
如果是false,就不进入while循环,不执行循环体内容。
3、如果进入循环体内容,执行循环体代码和控制条件语句。
4、直到关系表达式的结果为false,终止while循环。
死循环示例:
while(true){。。。}
public class WhileDemo1 {
public static void main(String[] args) {
//需求:打印10遍HelloWorld
System.out.println("===============用for循环实现===============");
for(int i=1;i<=10;i++){
System.out.println("HelloWorld");
}
System.out.println("===============用while循环实现===============");
int i=1;
while (i<=10){
System.out.println("HelloWorld");
i++;
}
System.out.println("=============死循环================");
int i1 = 0;
while (true){
System.out.println("这是死循环"+i1);
i1++;
}
}
}
for循环语句和while循环语句可以等价转换,但还是有些小区别的。
while循环与for循环的区别
1、使用区别:for循环结束后,在for循环中定义的初始化变量在外部无法使用。
while循环结束后,由于初始化值变量是在while循环外部定义的,所以
在while循环外部可以访问到。
2、场景区别: for循环适合针对一个范围判断进行操作。
while循环适合判断次数不明确操作。
示例:场景区别
每分钟监控某网页登录用户的情况,直到有非法用户登录,统计在此之前的次数
boolean flag = true;
while(flag){
if(非法用户登录){
flag = false;
}
}
循环结构(do…while循环语句)
do…while循环语句格式:
基本格式
do {
循环体语句;
}while(判断条件语句);
扩展格式 //(开发中使用扩展格式)
初始化语句;
do {
循环体语句; 控制条件语句;
} while(判断条件语句);
程序示例:
public class DoWhileDemo1 {
public static void main(String[] args) {
//统计1-10之和
int sum = 0;
int i = 1;
do {
sum = sum + i;
i++;
} while (i <= 10);
System.out.println("1-10之和为:" + sum);
}
}
三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:
do…while循环至少会执行一次循环体。
for循环和while循环只有在条件成立的时候才会去执行循环体。
注意事项:
写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。
示例:
public class DoWhileDemo3 {
public static void main(String[] args) {
int i = 0;
while (i>0){
System.out.println(i);
i--;
}
System.out.println("============do...while循环============");
do{
System.out.println(i);
i--;
}while (i>0);
}
}