什么是流程控制呢?流程就是做一件事情的顺序,或者说是次序。在程序设计中,流程就是要完成一个功能,而流程控制则是指如何在程序设计中,控制完成某种功能的次序。
语句是程序的控制成分,它具有特定的语法规则和严格的表达方法,用来控制程序的运行,因此语句也是一些具有结构化的控制结构。这些控制结构可以归为三类:顺序结构、选择结构和循环结构。实现这些控制结构的语句可分为5类:表达式语句、复合语句、分支语句、循环语句和跳转语句。本节将逐一介绍这些语句。
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Java提供了3种形式的if语句:有单if语句、if-else语句和if-else-if语句。
1.if语句
一个if控制语句由关键字if、布尔表达式及位于其后的语句组成。其基本形式为:
if (布尔表达式) 语句1;
语句2;
若布尔表达式的返回结果为true,则执行语句1并继续处理其后的下一条语句(语句2);若为false,则跳过语句1并继续处理紧跟着整个if语句的语句2。if语句的执行流程图为图6.1所示。
if语句的执行流程图
2.if-else语句
如果说if语句是单路选择结构,if-else语句就是双路选择结构。它的且成结构与if语句一样,其基本形式为:
if (布尔表达式) {
语句1;
}else{
语句2;
}
当布尔表达式为true时,执行语句1;当布尔表达式为false时,则执行语句2,if-else语句的执行流程图为图6.2所示。
if-else语句的执行流程图
3.if-else-if语句
在Java中可以类使用嵌套,那么if语句同样也可以使用嵌套,if-else-if语句就结合了if语句的嵌套,其基本形式为:
if (布尔表达式1){
语句1;
}else if (布尔表达式2){
语句2;
}else{
语句3;
}
当布尔表达式1为true时,执行语句1;当布尔表达式1为false时,则继续执行下面if语句;当布尔表达式2为true时,执行语句2;当布尔表达式2为false时,则执行语句3,其流程图如图6.3所示。
if-else-if语句的执行流程图
【代码剖析】这是一个根据随机产生的分数,来判断级别的程序,是通过if控制语句来实现的,具体代码如下:
/**
* 如果是大于90小于100则是优秀 //注释说明进行判断的依据
* 如果是大于80小于90则是良好
* 如果是大于70小于80则是良
* 如果是大于60小于70则是合格
* 如果小于60则是不合格
*/
public class Random {
public static void main(String[] args) {
int num;
num = (int) (Math.random() * 100);//随机产生一个0~100之间的正整数
//if控制语句的使用
if (num < 60) {
System.out.println(num + ":一个不合格的分数,要十分努力才行!");
} else if (num > 60 && num <= 70) {
System.out.println(num + ":一个刚刚合格的分数,还需在努力哦!");
} else if (num > 70 && num <= 80) {
System.out.println(num + ":一个评为良的分数,还要加把劲啊!");
} else if (num > 80 && num <= 90) {
System.out.println(num + ":一个评为良好的分数,加油啊!");
} else {
System.out.println(num + ":一个优秀分数,你好棒啊!");
}
}
}
运行结果如下:
80:一个评为良的分数,还要加把劲啊!
【解释说明】利用Math类的random()方法随机产生了一个整数80,然后就进入了if控制语句的控制领域,进行第一个布尔表达式的判断:num < 60返回false,不执行其方法体而转向第二个布尔表达式的判断:(num > 60 && num <= 70返回false,不执行其方法体而转向第二个布尔表达式的判断:num > 70 && num <= 80符合条件返回true,则值行其方法体“System.out.println(num + ":一个评为良的分数,还要加把劲啊!");”。其实if控制语句并不是很难的,只要掌握语句的执行流程就可以了。
switch控制语句
多路选择语句switch-case语句是Java专门提供的用来处理“多中择其一”的情况语句,故又称之为开关语句。switch语句和if-else-if语句十分相似,但是在处理复杂的判断语句时,使用switch语句写出的程序往往比使用if-else语句写的程序更简洁,清晰,且不易出错。
switch控制语句结构包含一个表达式、若干个case子句(关键字case后加一个常量或完全由常量组成的表达式及冒号构成)和一个default子句。switch语句的一般格式为:
switch (表达式)
{
case 值1:语句1;
break:
case值2: 语句2;
break;
case值3: 语句3;
break;
default: 语句4;
}
执行switch语句时,首先执行表达式,求出表达式的值,然后将该值同每个case关键字后面的值进行比较,如果相等,就执行该值后面的语句,然后在执行break语句,结束switch控制语句,如果没有任何一个值与该表达式的值相等时,就会去执行default关键字后面的语句。switch控制语句流程图如图所示。
switch控制语句流程图
【代码剖析】
由于switch语句和if控制语句十分的相似,所以,下面我们就将上面的if语句的实例转变成switch实例,具体的代码如下:
/**
* 如果是大于90小于100则是优秀
* 如果是大于80小于90则是良好
* 如果是大于70小于80则是良
* 如果是大于60小于70则是合格
* 如果小于60则是不合格
*/
public class SwitchRandom {
public static void main(String[] args) {
int num;
num = (int) (Math.random() * 100);
switch (num / 10) {
case 6:
System.out.println(num + ":一个刚刚合格的分数,还需在努力哦!");
break;
case 7:
System.out.println(num + ":一个评为良的分数,还要加把劲啊!");
break;
case 8:
System.out.println(num + ":一个评为良好的分数,加油啊!");
break;
case 9:
System.out.println(num + ":一个优秀分数,你好棒啊!");
default:
System.out.println(num + ":一个不合格的分数,要十分努力才行!");
break;
}
}
}
运行结果如下:
37:一个不合格的分数,要十分努力才行!
【解释说明】由于num是个随机产生的0~100之间的整数,这样用来标记case值太麻烦,我们可以缩小10倍变成0~10之间,这样标记起来就方便了好多。系统随机产生了一个数字37,37/10取整所以switch表达式的值为3。接下来,就用3和每个case后面的值进行比较,但是没有符合条件的,所以就执行最下面的default语句,故打印出上面的运行结果。执行case子句的的顺序可以自由安排,default子句不一定是要放在最下面的,但是通常都是放在最后面的,使得switch语句最后执行default子句。
循环控制语句
循环语句的作用是使某一段程序根据需要重复执行多次。循环语句是由循环体和循环条件两部分组成的。循环体主要是重复执行语句,循环条件决定循环的开始。
循环语句的使用方式
Java中的循环语句主要包括:for语句、while语句和do-while语句。下面主要学习这些循环语句的使用和它们之间的配套使用。
1.for语句
for循环是一个功能强大且形式灵活的结构,不仅可以用于循环次数已经确定的情况,也可以用于循环次数不确定而只给出循环条件结束的情况,for循环的基本表现形式为:
for([表达式1]; [表达式2]; [表达式3]){
//循环体(由若干个语句组成)
}
其中表达式1是循环初值表达式;表达式2是一个关系或逻辑表达式,返回true或错false;表达式3是指每次循环时所进行的对表达式1中值的修改。
在执行for语句时,先执行表达式1,而且只执行一次,接着判断表达式2的值是否是true,如果是false则退出循环,反之则执行循环体,然后执行表达式3,接着在判断表达式2,重复执行直到表达式2返回false,结束循环。其流程图如图所示。
for语句流程图while语句
while语句是Java中另一种循环语句。while翻释成中文就是“当”的意思,while语句也可以理解为当满足某种条件时,就去执行某种任务。while语句是由while关键字后面的循环条件和循环体组成。它的基本表现形式为:
while (循环条件)
{
//循环体
}
其中循环条件可以是任意合法的关系表达式或逻辑表达式,也可以是布尔变量或常量。Java在执行while语句时,首先对循环条件进行检查,看其结果值是否是true,如果是false则跳出循环,是true则执行循环体,然后再执行循环条件,重复执行,直到循环条件为false结束循环。其流程图如图所示。
while语句流程图
do~while语句
前面介绍的两种循环语句都是执行循环条件在先,执行循环体在后,那么有没有一种与其执行流程相反的循环的语句呢?do~while语句就是这种操作流程。其语法表现形式为:
do
…循环体
while(循环条件);
其中循环体和循环条件与while语句的一样,这里就不在重述了。Java在执行do-while语句时,不管是否满足循环条件,都先将循环体执行一遍,然后再判断循环条件。如果是false结束循环,反之则继续执行循环体,重复操作直到循环条件的结果为false结束循环为止。其流程图如图所示。
do-while语句流程图
循环间的嵌套
如果任何一种循环语句外面又是一个循环语句或者是又包含一个循环语句,则称这个循环结构是二层循环结构。如此类推,可能出现三层、四层乃至更多层循环结构。这种循环语句的循环体中又套有另一个循环语句的现象就叫做循环的嵌套,也称多重循环。外面的循环语句称为“外层循环”,外层循环体中的循环称为“内循环”。
在Java中for、while、do-while这3种循环语句可以互相嵌套自由组合。但要注意的是,各循环必须完整,不得出现彼此内,外层相互交叉。例如下面几种都是合法的形式。
(1)while(循环条件){//外层循环
…
while(循环条件){//内层循环
…
}
}
(2)do{//外层循环
…
for([表达式1];[表达式2];[表达式3]){//内层循环
…
}
}while(循环条件);
(3)for([表达式1];[表达式2];[表达式3]){//外层循环
…
for([表达式1];[表达式2];[表达式3]){//内层循环
…
}
}
以下是代码演示
public static void main(String[] args) {
int x = 0;
System.out.println("3~100之间的所有素数:");
for(int i=3;i<100;i++){//外层循环
int n = (int)Math.sqrt(i);
boolean flag = true;
for(int j=2;j<=n;j++){//内层循环
if(i%j==0)flag=false;
}
if(flag){
System.out.print(i+" ");
x++;
if(x%5==0)System.out.println();//控制每行打印5个素数
}
}
System.out.println();
}
跳转控制语句
在6.2节中学习switch语句时,我们已经接触到跳转控制语句,例如:break语句,在case子句执行完后,通过break语句使控制立即跳出switch结构。 在循环结构中,有时我们需要在循环体中提前跳出循环或提前进入下一轮循环,此时,就需要使用跳转控制语句。
break跳转语句
在前面的switch语句中我们使用过break语句,其作用是终止一个语句。break语句不仅能在switch语句中使用,还能在循环控制语句中使用,其作用是表示退出当前循环。break语句有两种形式分别为无标号退出循环和有标号退出循环。其表现形式为:
break[标号];
1.无标号break语句
在循环结构中,有时我们需要在循环体中提前跳出循环。这时我们就会考虑使用无标号break语句直接退出循环。不必考虑循环体中的其他没有执行完的语句,只要在循环体中碰到break语句后,循环被终止,程序接着执行循环体外面的语句。其的表现形式为:
break;
【代码剖析】这是一个令程序提前结束的实例,具体代码如下:
public class BreakDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 4)
break;
System.out.print(i + " ");
}
}
}
运行结果如下:
0 1 2 3
【解释说明】这个程序的原意是将打印出0~9这10个数字,但是从上面的运行结果中,我们可以清楚的看到数字打印到3就结束了,原因是我们在for循环体中加入了if (i == 4)break;其作用是告诉程序在变量i是4的时候,就结束循环。
continue跳转语句
continue语句只能用在循环中,它的功能是强制一个循环体提前中止,即跳过该循环体中continue语句后面尚未执行的所有语句,但不结束整个循环,而是继续进行下一轮循环。和break语句一样,continue也有两种形式:带符号的和不带符号的。
1.不带符号的continue语句
它的基本表现形式是:
continue;
continue语句只能出现在循环体中,当Java执行到该语句时,则返回到该循环的循环条件的表达式进行判断看是否满足下一轮的循环。例如:continue语句在while和do-while语句中直接使流程返回到循环条件的判断上,而for语句比较特殊,则直接进行表达式3的计算,然后再去执行表达式2,根据表达式2的值决定是否继绪下一轮的循环。图6.8演示了包含continue语句的do-while语句的执行流程。
图6.8 包含continue语句的do-while语句的执行流程。
【代码剖析】这是一个求1~100之间奇数的实例,注意代码中continue语句的使用,具体代码如下:
public class ContinueClass {
public static void main(String[] args) {
int rows = 0; //用于控制记录奇数的个数
System.out.println("1~100之间的奇数为:");
for(int i=1;i<=100;i++){
if(i%2==0){ //是偶数就结束当前这轮循环
continue;
}else{
rows++;
System.out.print(i+" ");
if(rows%5==0)System.out.println(); //每5个奇数一换行
}
}
}
}
运行结果如下:
1~100之间的奇数为:
1 3 5 7 9
11 13 15 17 19
21 23 25 27 29
31 33 35 37 39
41 43 45 47 49
51 53 55 57 59
61 63 65 67 69
71 73 75 77 79
81 83 85 87 89
91 93 95 97 99
return返回语句
return语句用来从当前的方法中退出,返回调用该方法的语句中。一般返回语句用在子程序或程序中的方法中。返回语句使用关键字“return”来表示。return语句的表现形式为:
return [表达式];
return语句是在方法中使用的,方法名前面的类型决定了return语句的不同的作用,当用void定义了一个方法时,方法体中不一定非要有return语句,因为程序执行完,会自然返回的。例如:
public void call(){
System.out.println();
return;
}
若要从程序中某处强制返回到某方法时,就必须用使用return语句,而且是方法的返回值类型不是void的才可以。例如:
public class ReturnDemo{
public static void main(String[] args){
int num = new Demo().getValue(8,9);//在main方法中,当程序运行当此语句时,就返回到了public int getValue(int x,int y)这个方法中
}
public int getValue(int x,int y){
if(x>y)return x;
else retunrn y;
}
}