Java:流程控制语句

在这里插入图片描述

流程控制语句

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以我们要通过控制语句的执行顺序来实现我们要完成的功能。

顺序结构

是程序中最简单最基本的流程控制语句,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
总的来说:写在前面的先执行,写在后面的后执行

System.out.println("第一步执行");
System.out.println("第二步执行");
System.out.println("第三步执行");
/*
运行结果:
第一步执行
第二步执行
第三步执行
*/
//在顺序结构语句中,会根据代码的顺序来运行。
选择结构

选择结构也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个(true和false),所以产生选择,按照不同的选择执行不同的代码。

if语句

几种格式:

//1
if(比较表达式或boolean类型的值)
{
	语句体;
}
/*
执行流程:
先计算比较表达式的值,看其返回值是true还是false。
如果是true,就执行语句体;
如果是false,就不执行语句体;
*/
//示例
if(10>2)
{
	System.out.println("执行");
}
/*
首先会对if里的表达式进行判断,10>2为ture,所以执行{}中的代码。
运行结果:
执行
*/
//2
if(比较表达式) 
{
	语句体1;
}
else 
{
	语句体2;
}
/*
执行流程:
首先计算比较表达式的值,看其返回值是true还是false。
如果是true,就执行语句体1;
如果是false,就执行语句体2;
*/
//示例:
if(10==2)
{
	System.out.println("执行if{}");
}
else
{
	System.out.println("执行else{}");
}
/*
首先对if括号中的表达式进行判断,10==2为false,所以跳过if{}中的语句,执行else{}中的代码。
运行结果:
执行else{}
*/
//3
if(比较表达式1)
{
	语句体1;
}
else if(比较表达式2) 
{
	语句体2;
}
else if(比较表达式3) 
{
	语句体3;
}
...
else 
{
	语句体n+1;
}
/*
执行流程:
首先计算比较表达式1看其返回值是true还是false,
如果是true,就执行语句体1,if语句结束。
如果是false,接着计算比较表达式2看其返回值是true还是false,
如果是true,就执行语句体2,else if语句结束。
如果是false,接着计算比较表达式3看其返回值是true还是false,
	...
	
如果都是false,就执行else大括号中的语句体n+1。
*/
//示例
if(10==2)
{
	System.out.println("执行if{}");
}
else if(10>2)
{
	System.out.ptintln("执行else if{1}");
}
else if(10<2)
{
	System.out.println("执行else if{2}");
}
else
{
	System.out.println("执行else{}");
}
/*
首先判断if后括号里的表达式,10==2为false,所以跳过if{}中的语句。
再判断else if后括号里的表达式,10>2为true,所以执行else if{}中的语句。
然后跳出选择语句的结构体,不再判断下面的10<2,也不执行下面的else if{}和else{}中的语句
运行结果:
执行else if{1}
*/

注意事项:
1.比较表达式无论简单还是复杂,结果必须是boolean类型。
2.if语句控制的语句体如果是一条语句,{}可以省略。建议慎用。

//例题
boolean b = true;
if(b=false)  
	System.out.println("a");//if只控制这一条语句,{}可以省略。
else if(b)
	System.out.println("b");
else if(!b)
	System.out.println("c");
else
	System.out.println("d");
/*
分析:
首先定义一个布尔类型的变量b,值为true
按照顺序先判断if()中的b=false。但这个表达式不是boolean类型的结果,是个赋值语句。
!!所以不执行if{}中的语句,但是把false赋给了b。
然后进行下面的语句,第二个else if()中!b为true,所以输出c,结束整个选择语句结构体。
运行结果:
c
*/

if与三元运算符的转换问题
注意:三元运算符能够实现的,都可以用if语句实现,反之不成立。
如:当if控制的语句是一个输出语句时,就不能转换为三元运算符。
因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。

if嵌套使用

//示例
/*
先判断userName(用户名)是否是"123"
如果是再判断passwor(密码)是否是"321"
如果是,输出"正确"
*/
if(userName=="123")
{
	if(password=="321")
	{
		System.out.println("输入正确");
	}
}
//在使用if嵌套时,无论if控制的语句有多少句,都将其用{}括起来
//这样可以提高代码的可读性
switch语句

格式:

switch(表达式)
{
	case1:
		语句体1;
		break;
	case2:
		语句体2;
		break;
	case3:
		语句体3;
		break;
	....
	default:	
		语句体n+1;
		break;
}
/*
格式解释:
1.switch表示这是switch语句
  表达式的取值:byte,short,int,char
			  JDK5以后可以是枚举(什么是枚举,以后再讲) 
			  JDK7以后可以是String
2.case后跟的是要和表达式进行比较的值
3.语句体部分可以是一条或多条语句
4.break表示中断,结束的意思,结束switch语句
5.default语句表示所有情况都不匹配时,就执行该处的内容,和if语句中的else相似
*/
/*
执行流程:
依次判断表达式的值与哪一个case后面的值相同。
如果有相同值,执行该case后的语句,最后break;跳出选择语句结构体。
如果没有相同值,执行default中的语句,然后break;跳出选择语句结构体。
*/

面试题:
1.byte可以作为switch的表达式吗?可以
2.long可以作为switch的表达式吗?不可以
3.String可以作为switch的表达式吗?JDK1.7之后可以
注意事项:
1.case后面只能是常量,不能是变量,而且多个case后面不能出现相同的值。
2.default可以省略,但是不建议,如果case后面没有匹配项,他能对这种情况给出提示
3.break可以省略,但会出现case穿透现象,有时可以利用这种情况
4.default可以放在switch结构体中的任意位置,但是建议放在最后
5.switch遇到break或者执行到末尾就结束了

//注意以下两个程序的区别
//1
int x = 2;
int y = 3;
switch(x)
{
	default:
		y++;
		break;
	case 3:
		y++;
	case 4:
		y++;
}
System.out.println("y="+y);
/*
分析:
没有与x相匹配的case值,此时虽然在switch的末尾,但是还有default没有执行
执行default,y=4,break结束结构体
运行结果:
y=4
*/
//2
int x = 2;
int y = 3;
switch(x){
	default:
		y++;
		
	case 3:
		y++;
	case 4:
		y++;
}
System.out.println("y="+y); 
/*
分析:
没有与x相匹配的case值,执行default,y=4
注意:default中无break,此时并不在switch结构的末尾,要继续往下执行
但不再判断是否与case后面的值相匹配,发生case穿透
执行两次y++,最后y=6
运行结果:
y=6
*/

case穿透现象的应用

//根据月份,输出对应的季节
int month=6;
switch(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("month的值非法");
		break;
}
/*
如果month的值为3,因为case穿透现象,会直接执行case 5:后面的输出语句,然后break;退出循环体
这样做可以简化代码
*/
循环结构

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环
for循环
格式:

//			1			   2			3	
for(初始化表达式语句;判断条件语句;控制条件语句)
{//		4
	循环体语句;
}
/*
执行流程:
1.执行初始化表达式语句
2.执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
3.执行循环体语句;
4.执行控制条件语句
5.回到第二步继续。
注意:初始化表达语句只执行一次
执行顺序为1–>2–>4–>3–>2–>3–>4...	直到2中的条件判断为false为止	
*/
//示例:输出1~10之间的数字之和
int sum=0;//存储1~10之间的和
for(int i=1;i<=10;i++)
{
	sum=sum+i;
}
System.out.println(sum);
/*
执行流程:
1.先定义一个变量i,并将其初始化,初始化值为1
2.判断i<=10,结果为true
3.执行循环体中的语句,将sum+i赋值给sum
4.执行i++,i=2
5.再继续判断i<=10
……
直到i<=10为false
运行结果:
55
*/

for循环的计数思想

/*
统计水仙花数有多少个
水仙花数:个位数字的三次方+十位数字的三次方+百位数字的三次方=该数本身
*/
/*
问题分析:
水仙花数都是三位数,出现水仙花数的范围是100~999
范围过大,我们需要遍历这个范围,就要用到循环
初始化表达语句:int i=100
判断条件语句:i<=999
控制条件语句:i++
在循环体中,我们需要判断一个数各位数字的立方和是否等于该数本身
问题在于如何求出一个三位数的个位数字、十位数字和百位数字
再判断出一个数是水仙花数的时候,我们还要统计水仙花数的数量
*/
int count=0;
for(int i=100;i<=999;i++)
{
	int g=i%10;		//个位数字
	int s=i/10%10;	//十位数字
	int b=i/100%10;	//百位数字
	if(g*g*g+s*s*s+b*b*b==i)
		count++;
}
System.out.println(count);
/*
在这个问题中,我们定义了一个变量count来统计水仙花数的个数
只要该数字满足条件,就让count自增
在统计的问题中,我们可以定义这样一个记录个数的变量,一旦符合条件,使其自增1
对于取出各位上的数字,可以用上述方法,对于四位数、五位数等也同样适用
*/

for循环嵌套

/*
请输出一个4行5列的星星(*)图案(每次只能输出一个*)。
如图:
	*****
	*****
	*****
	*****
问题分析,如果要输出5颗星要循环5次
现在要在输出4次5颗星。在5次循环的基础上再循环4次
*/
for(int i=0;i<4;i++)
{
	for(int j=0;j<5;j++)
	{
		System.out.print(*);//注意print(不换行)和println的区别
	}
	System.out.println();//每输出5个*进行换行
}
//外循环控制行数,内循环控制列数
while循环

格式:

初始化条件语句;
while(判断条件语句)
 {
	循环体语句;
	控制条件语句;
}
/*
执行流程:
1.执行初始化条件语句;
2.执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
3.执行循环体语句;
4.执行控制条件语句
5.回到第二步继续。
*/
//示例:输出1~10之间的数字之和
int sum=0;
int i=1;	//要有初始化条件语句
while(i<=10)
{
	sum=sum+i;
	i++;	//如果没有控制条件语句,会陷入死循环
}
System.out.println(sum);
/*
运行结果:
55
*/
do…while循环

格式:

初始化条件语句;
do {
	循环体语句;
	控制条件语句;
}while(判断条件语句);
/*
执行流程:
1.执行初始化条件语句;
2.执行循环体语句;
3.执行控制条件语句;
4.执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
5.回到b继续。
注意:无论判断条件是否成立,循环都会执行1次,即先执行再判断
*/
//示例:输出1~10之间的数字之和
int sum=0;
int i=1;
do{
	sum=sum+i;
	i++
}while(i<=10)
/*
运行结果:
55
*/

注意:一定要注意控制条件语句的变量,不要弄丢了,不然就会造成死循环!
三种循环的区别:
1.do…while循环至少执行一次循环体,而for,while循环必须先判断条件是否成立,然后决定是否执行 循环体语句
2.如果你想在循环结束后,继续使用控制条件的变量(上述的i),用while循环,否则用for循环。
for循环可以使控制条件的变量及早的从内存中消失,提高内存的使用效率
3.如果明确循环次数使用for循环,如果不明确循环次数使用while循环
4.优先考虑for循环,然后是while循环,最后是do…while循环

键盘录入

优点:
1.能够使程序的数据更符合开发的数据
2.让程序更加灵活一点
步骤:

1.导包
import java.util.Scanner;		//位置:在class上面
2.创建键盘录入对象
Scanner input=new Scanner(System.in);
3.通过对象获取数据
int x=input.nextInt();		//要接收的数据类型是什么,next后就跟什么类型,如:nextDouble()
//示例:由键盘输入两个数,求两数之和
import java.util.Scanner;
class Demo
{
	public static void main(String[] args)
	{
		Scanner input=new Scanner(System.in);
		System.out.println(“请输入第一个数字”)int num1=input.nextInt();
		System.out.println(“请输入第二个数字”)int num2=input.nextInt();
		int sum=num1+num2;
		System.out.ptintln(sum);
	}
}

控制跳转语句之break、continue

比如说,我们想在某个循环执行到某一步的时候就结束,现在就做不了这件事情。
为了弥补这个缺陷,Java就提供了break,continue和return(后面讲)来实现控制语句的跳转和中断。

break(中断)

使用场景:
1.在选择结构switch语句中
2.在循环语句中
注意:离开使用场景的存在是没有意义的
作用:
1.退出单层循环
2.退出多层循环(实现这个效果,要使用带标签的语句)
3.退出switch结构体

tag1:for( ; ; )
{
	循环体语句
	tag2:for( ; ; )
	{
		循环体语句
		break tag1;//退出外循环
		break tag2;//退出内循环
		break;	//退出当前循环,即内循环
	}
	break;		//退出当前循环,即外循环
}
//退出多层循环不常用
continue(继续)

使用场景:在循环语句中
注意:离开使用场景的存在是没有意义的
作用:跳出一次循环,执行下一步操作

//练习题
for(int x=1;x<10;x++)
{
	if(x%3==0)
	{
		//在此处填写代码
	}
	System.out.println(“Java”);
}
/*
需求:
1.在控制台输出2次“Java”	
2.在控制台输出7次“Java”
3.在控制台输出13次“Java”
在提示处填写代码
1.break;
2.continue;
3.System.out.println(“Java”);	
*/
发布了26 篇原创文章 · 获赞 1 · 访问量 377

猜你喜欢

转载自blog.csdn.net/weixin_45919908/article/details/103342526