第4章 程序设计中的流程控制
任何一门语言都需要基本的流程控制语句,其思想也符合人类判断问题或做事的逻辑过程。什么是流程控制呢?流程就是做一件事情的顺序,或者说是次序。在程序设计中,流程就是要完成一个功能,而流程控制则是指如何在程序设计中控制完成某种功能的次序。本章将通过大量的实例,为读者讲解如何在程序中设计好流程控制。
本章重点:
□ Java语言的编程风格。
□ 条件语句、分支语句和循环语句。
□ 中断、继续、返回语句。
4.1 编程风格
本章开始接触到编写Java程序代码,有一点必须强调,那就是编程风格的问题,虽然其不影响程序代码段的运行,但对于程序的可读性起着重要的作用。自己编出的程序要让别人看懂,首先在排版方面要非常注意,下面将探讨编程风格的问题。
其实每个人、每个软件开发公司的编程风格都不一样。一个人编写的程序代码就应该能让别人看懂,甚至是过了很长时间,自己也要看得懂,否则这个程序就成了一个没法扩展的程序。编程风格是指编程时的格式,让程序看上去就很有层次感。下面通过一些例子说明编程风格的重要性。
【实例4-1】先来看第一个例子。
01 public class math 02 { 03 public static void main(String[] args) 04 { 05 int x=12; 06 double y=12.3d; //定义double类型 07 void print() //关于打印方法 08 { 09 char a='a'; 10 System.out.println(a); 11 } 12 System.out.println(x+y); //关于输出方法 13 } 14 }
【代码说明】上面程序段的整个排版看起来是否很舒服,并且层次感很强?是否一眼看上去就知道整个程序架构?这里的关键在于缩排,缩排也称为跳格。
上面程序段采用的是跳格形式:“public class math”是顶格的,接着主运行程序前跳4个空格,在主运行程序内的运行代码段一律跳8个空格,而在主运行程序方法内的代码前,再跳4个空格。这样整个程序的所属关系就很明显了。主运行程序从属于math类,其余的都属于主运行程序,而在主运行程序方法内的代码段又属于此方法。规律就是空格多的代码从属于空格少的代码。
【实例4-2】除了空格外,空行也是必要的。为什么要空行呢?先看下面的程序代码,再来仔细分析。
01 public class math { 02 public static void main(String[] args) 03 { 04 int x=12; 05 int y=23; 06 void print() //打印方法 07 { 08 … 09 } 10 11 void view() //显示方法 12 { 13 … 14 } 15 } 16 }
【代码说明】在print方法与view方法之间有个空行(第10行),使用空行区分不同功能的模块。print方法所完成的功能与view所完成的功能不一样,所以使用空行将它们分开,这样更增加了程序的可读性。
另外,需要注意的是方法或属性的命名。这些名字应该有含义,最好有规律。不要只使用“a”、“b”这种通用变量,可以适当根据变量或函数的功能为其命名。上面的“print”,其他程序员一看就知道这个方法是有关打印或输出的函数。再如变量名“name”,一看就知道是有关名字的变量。所以命名要有意义,否则程序的可读性不强。
还有一点是有关注释的。在每个方法的方法名旁边,应该添加一些注释,同时在一段程序完成之后,也要对程序的功能及如何操作做简单的描述。
只要做到以上几点,这个程序就是易读的。即使经过很长时间后再来读程序也会一目了然。
4.2 条件语句
在现实生活中,经常听人说:如果某人发财了,某人就会做什么。其实这就是程序设计中所说的条件语句。例如“如果……就……”、“否则……”,当然这只是很简单的条件语句,在真正的程序设计中,使用的条件语句要比这复杂得多。
4.2.1 简单条件语句
在程序设计中,条件语句的标准格式如下:
if(条件) { 目的一; } else { 目的二; }
【实例4-3】掌握格式后,先看一个简单的程序段。
01 public class control { 02 public static void main(String[] args) { 03 int a = 20; 04 int b = 30; 05 if (a > b) { //将整型变量a,b的大小比较得出的布尔型变量作为条件语句的条件 06 System.out.println("很幸运!"); 07 } else { 08 System.out.println("很开心"); 09 } 10 } 11 }
【代码说明】因为“a=20”而“b=30”,所以“a<b”。在条件语句中,程序代码的意思是,如果“a>b”,就输出“很幸运!”,如果“a<b”,就输出“很开心”,所以程序的输出结果就是“很开心!”。
【运行效果】
很开心!
注意
条件表达式是一个关系表达式,其结果是布尔型数据。换句话解释上面的程序段:如果“a>b”是真,就输出“很幸运!”,否则输出“很开心!”。
4.2.2 最简单的条件语句
在条件语句的程序设计中,有一种最简单的条件语句,如下所示:
if(条件) 目的;
如果有很多的目的,也可以采取下面的形式:
if(条件) { 目的一; 目的二; 目的三; 目的四; }
【实例4-4】下面看一个有关这种类型条件语句的例子。
01 public class control1
02 {
03 public static void main(String[] args)
04 {
05 int salary=10000; //变量初始化
06 if (salary>500) //条件判断
07 {
08 System.out.println("想请吃饭!");
09 System.out.println("想请唱歌!");
10 System.out.println("想请喝酒!");
11 }
12
13 }
14 }
【代码说明】条件语句中判断“salary>500”是否为真,如果是真就输出“想请吃饭!想请唱歌!想请喝酒!”,如果是假,就什么都不做。在程序中“salary=10000”,满足“salary>500”,条件为真,所以输出以上三句话。
【运行效果】
想请吃饭! 想请唱歌! 想请喝酒!
注意
在有多个目的的程序段中,一般按顺序执行,即先执行目的一,再执行目的二,最后执行目的三,依次执行。
4.2.3 适应多条件的条件语句
如果出现多种不同的条件,应该如何处理呢?可以使用条件语句中的复杂型,其结构如下:
if (条件1) { 目的1; } else if (条件2) { 目的2; } else if (条件3) { 目的4; } else { 不满足以上所有条件,如何办; }
【实例4-5】根据以上结构,学习有关这种复杂条件语句的实例,代码如下所示:
01 public class control2 { 02 public static void main(String[] args) { 03 int achievement = 85; 04 //当achievement等于100,就奖励一台笔记本电脑 05 if (achievement == 100) { 06 System.out.println("奖励一台笔记本电脑"); 07 } else if ((achievement >= 90) && (achievement < 100)) { 08 //当achievement大于90小于100,就奖励一个MP4 09 System.out.println("奖励一个MP4"); 10 } else if ((achievement >= 80) && (achievement < 90)) { 11 //当achievement大于80小于90,就奖励一块网卡 12 System.out.println("奖励一块网卡"); 13 } else if ((achievement >= 60) && (achievement < 80)) { 14 //当achievement大于60小于80,不给予奖励 15 System.out.println("不给予任何奖励"); 16 } else { 17 //当achievement小于60,放假回学校补习 18 System.out.println("放假回学校补习"); 19 } 20 } 21 }
【代码说明】从上述代码可以看出,当有多个不同的条件存在时,处理的结果就不一样。成绩在大于80分小于90分之内,就可以奖励一块网卡;而成绩大于90分小于100分,则奖励一个MP4。在此程序中,初始成绩是85分,所以处理的结果就是奖励一块网卡。
【运行效果】
奖励一块网卡
条件语句已经基本介绍完毕,很重要的一点就是,在程序设计的时候,思路一定要清晰,如何才能有很清晰的思路呢?那就是绘制流程图。流程图就是:在程序开发前,为了能够使思路更加清晰,而将整个程序执行的顺序流程绘制出来。图4-1为一个有关条件语句的通用流程图。
图4-1 if条件语句流程图
将上面的程序段作为一个实例,绘制其基本的流程图,如图4-2所示。鉴于页面的版面,这里只给出了4种条件,并没有完全体现出上面案例的5种条件,读者可自己画一个完整的流程图。
图4-2 实例4-5的条件流程图
针对最复杂的条件语句,在程序设计中,有一种分支语句可以代替复杂条件语句。在实际程序开发过程中,使用条件语句类型比较多的是标准型,而复杂型的一般用分支语句来代替。当然也可以使用复杂型的条件语句。为了与实战结合,下面以一个稍微复杂的程序段为例。
【实例4-6】条件:设计一个程序,用于计算语文(90)、英语(75)、数学(90)、艺术(85)四门功课的平均分,并对此学生进行评价。
在编写程序之前要先绘制流程图,这样编程的思路就会非常清晰,本例流程图如图4-3所示。
图4-3 实例4-6的条件流程图
根据以上的流程图编写程序,程序代码段如下:
01 public class control3 { 02 public static void main(String[] args) { 03 //创建成员变量 04 int Chinese = 90; 05 int English = 75; 06 int Math = 90; 07 int Art = 85; 08 //获取平均值 09 double Avg = (Chinese + English + Math + Art) / 4; 10 if ((Avg > 90) && (Avg <= 100)) { 11 //如果是大于90小于等于100则是优秀 12 System.out.println("这个学生的所有功课的平均分是:" + Avg); 13 System.out.println("这个学生的成绩应得A,是优秀"); 14 } else if ((Avg > 80) && (Avg <= 90)) { 15 //如果是大于80小于等于90则是良好 16 System.out.println("这个学生的所有功课的平均分是:" + Avg); 17 System.out.println("这个学生的成绩应得B,是良好"); 18 } else if ((Avg > 70) && (Avg <= 80)) { 19 //如果是大于70小于等于80则是良 20 System.out.println("这个学生的所有功课的平均分是:" + Avg); 21 System.out.println("这个学生的成绩应得C,是良"); 22 } else if ((Avg > 60) && (Avg <= 70)) { 23 //如果是大于60小于等于70则是合格 24 System.out.println("这个学生的所有功课的平均分是:" + Avg); 25 System.out.println("这个学生的成绩应得D,是合格"); 26 } else { 27 //如果小于60则是不合格 28 System.out.println("这个学生的所有功课的平均分是:" + Avg); 29 System.out.println("这个学生的成绩应得E,是不合格"); 30 } 31 } 32 }
【代码说明】第10~32行是复杂型的条件语句,判断了5种情况下不同的输出结果。第9行定义的是double变量,表示计算后的平均值。
【运行效果】
这个学生的所有功课的平均分是:85.0 这个学生的成绩应得B,是良好
4.2.4 嵌套条件语句
if嵌套语句也是经常使用的多分支判断语句,在一次判断之后又有新一层的判断,接着又有一层判断,逐渐深入,达到实现复杂判断的目的,这种多层次判断相当于多条件判断,在满足几个条件后再执行适当的语句。if嵌套语句的格式是:
if(条件1) if(条件2) if(条件3) 执行语句1;
在if(条件1)成立的情况下继续判断直到if(条件3)也成立,再执行语句1。如果其中有一个条件不满足,则跳出该if嵌套语句,继续执行嵌套语句之外的代码。
4.2.5 如何使用条件语句
使用条件语句需要注意以下几点。
1)应该绘制流程图,使编程时的思路更加清晰。
2)编程时,在最简单形式的条件语句中,可以不使用大括号,因为它不会产生混淆。但建议无论是哪种形式的条件语句,都应该使用大括号。
4.3 循环语句
循环语句在程序设计中有什么作用呢?本节将通过一个具体功能(计算数字1连加10次1后的结果)来演示。
【实例4-7】下面先看一段简单的程序段,再来看看使用循环语句编写程序的好处在哪里。
01 ///将x连续加1加10次 02 public class control4 03 { 04 public static void main(String[] args) 05 { //连续自加10次 06 int x=1; //x初始化为1 07 x=x+1; 08 x=x+1; 09 x=x+1; 10 x=x+1; 11 x=x+1; 12 x=x+1; 13 x=x+1; 14 x=x+1; 15 x=x+1; 16 x=x+1; 17 System.out.println(x); //l输出x最终的结果 18 } 19 }
【代码说明】代码的含义是让变量“x”连续加1共加10次。如果想要实现加1加100次,那要让“x=x+1”这个表达式重复100次。
【运行效果】
11
这样庞大的程序段所要完成的功能,不过是一个很简单的相加功能。为了解决这类问题,程序设计中引入了循环语句。循环语句共有3种常见的形式:for语句、while语句和do…while语句。下面将逐个详细介绍。
4.3.1 for循环语句
让初始值为1的变量“x”连续加1共加10次,可以直接编写10次“x=x+1;”语句,但是如果要加100呢?这时肯定不能编写100次“x=x+1;”语句。为了解决该问题,可以使用for循环语句。
for循环语句的基本结构如下:
for(初始化表达式;判断表达式;递增(递减)表达式) { 执行语句 }
下面详细解释for循环语句中各个子项的意义。
1)初始化表达式:初始化表达式的意义在于定义循环之前变量的值是多少,如果没有这一项,就不知道应该从哪个值开始循环。
2)判断表达式:判断表达式的作用在于规定循环的终点。如果没有判断表达式,那么此循环就成了死循环。
3)递增(递减)表达式:这一项规定每执行一次程序,变量以多少增量或减量进行变化。
注意
一定要注意递增(递减)表达式中可以有多个表达式,它们以逗号间隔,而不是分号。
【实例4-8】使用for语句,来修改上一小节的程序段。
01 public class control5 02 { 03 public static void main(String[] args) 04 { 05 int x; 06 int n=10; //定义了循环的次数 07 for( x=1;n>0;n--,x++) //通过循环实现连续加1共10次 08 {System.out.println(x);} 09 } 10 }
【代码说明】上述代码中,第5~8行共4句代码完成了前面程序段里12句代码所实现的事情。
【运行效果】
1 2 3 4 5 6 7 8 9 10
【实例4-9】如果前面的程序段需要连续加1加100次,则参考下面的程序段。
01 public class control6 02 { 03 public static void main(String[] args) 04 { 05 int x; 06 int n=100; //定义了循环的次数 07 for(x=1;n>0;n--,x++) //实现循环 08 System.out.println(x); 09 } 10 }
【代码说明】在这个程序段里,使用第5~8行共4句代码可以解决程序段中102句代码所实现的问题,这就是循环语句的优势。
【运行效果】
1 2 3 … 100
其实也可以利用在条件判断语句中提到的流程图来编写程序,在流程图中可以看出程序执行的顺序,如图4-4所示。
图4-4 for循环语句流程图
【实例4-10】下面再看一个九九乘法表的程序段。先来绘制流程图,如图4-5所示。
图4-5 九九乘法表流程图
根据流程图,使用循环语句实现乘法口诀表。
01 ///这是一个二重for循环语句 02 public class control7 03 { 04 public static void main(String[] args) 05 { 06 for(int x=2;x<10;x++) //输出8行 07 { 08 for(int y=1;y<10;y++) //输出9列 09 { 10 System.out.print(x+"*"+y+"="+(x*y)); 11 System.out.print(""); 12 } 13 System.out.println(""); 14 } 15 } 16 }
【代码说明】第6~14行是外围的for循环,第8~12行是一个嵌入在外围循环中的循环,这样的形式我们称之为嵌套循环。为什么要使用二重循环呢?因为它涉及两个变化的量。在一个程序里,有多少个不同的变量,就要使用多少个for循环,当然也不是非常绝对的。
【运行效果】
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 4*9=36 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
在上面的程序段中,使用了2层嵌套的for语句。其实真正复杂的程序段中,可能会出现4层嵌套的for语句,这要在实践中慢慢体会。
通过上面的内容,可以发现循环流程关键字for的语法比较复杂。为了改变该现象,便出现了关于for循环的另一种语法(增强版for循环),该方式可以简化for循环的书写。
增强版for循环的基本格式如下:
for(type 变量名:集合变量名){ }
在上述基本格式中,迭代变量必须在方法体中定义,集合变量除了可以是数组,还可以是实现了Iterable接口的集合类。
下面将通过修改VariableArgument.java类来演示增强版的for,具体内容如下所示:
01 public class VariableArgument { 02 public static int add(int... xs) { 03 int sum = 0; 04 for (int x : xs) { //增强版for循环 05 sum = sum + x; 06 } 07 return sum; //返回变量sum 08 } 09 }
【代码说明】上述代码中通过for(int x : xs)语句代替了for (int x = 0; x < xs.length; x++)语句,实现了相应的循序迭代功能,即运行VariableArgumentTest.java类,会显示出正确的信息。
4.3.2 while循环
在英文中“while”这个词的意思是“当”,而在Java程序设计中,也可以将其理解为“当”。其语法结构如下。
while (条件) { 目的一; 目的二; … }
当满足某种条件,就执行“目的一”、“目的二”等,while语句的循环体在{}中。
【实例4-11】下面看一段程序段,通过分析它,让读者更加清楚while循环语句。
01 //通过判断y是否大于0 02 //如果y大于0的话则将计费次数减1,x加1 03 public class control8 04 { 05 public static void main(String[] args) { 06 int x=0; 07 int y=100; 08 int sum=0; 09 while(y>0) //while循环 10 { 11 x=x+1; 12 y--; //值自减 13 sum+=x; 14 } 15 System.out.println(sum); //输出和 16 } 17 }
【代码说明】这个程序段是将数字从1一直加到100,条件是只要y大于0,就会执行大括号里的语句。y初始值是100,满足条件,所以执行大括号的表达式。先将x+1赋给x,因为x的初始值是0,所以x从1开始计数,然后,将y自减1,此时y变成了99,将sum加上x赋给sum。此时,执行语句结束了,又会回到小括号的条件,最后再比较y=99是否大于0,如果大于0,再继续执行大括号里的语句。
一旦y自减到小于等于0,则将结束执行大括号里的语句,开始执行大括号外的语句。在上面的程序段中,y就相当于一个计数器。
【运行效果】
5050
同样,在编写while语句时,要先绘制流程图,根据流程图再来编写程序段,整个思路就会很清晰了。下面先看while的流程图,如图4-6所示。
图4-6 while循环语句流程图
其实while语句很简单,根据这个流程图,就可以思路清晰地编写程序段。下面针对上面的程序段来绘制流程图,如图4-7所示。
图4-7 实例4-11的循环流程图
看了这个流程图,会发现按照流程图来编写程序简单多了。为了巩固以上所述,再看一个例子。
【实例4-12】试编写程序实现输出1~100间的整数,并且此整数必须满足:它是3的倍数,但不是5的倍数,也不是9的倍数。针对这个例子,先来绘制一个流程图,如图4-8所示。
图4-8 输出特殊数字的循环流程图
根据流程图,现在来编写程序段。
01 public class control9 { 02 public static void main(String[] args) { 03 int x = 1; 04 //判断是否在100以内,并且是3的倍数 05 while (((3 * x > 1) && (3 * x < 100))) { 06 if ((3 * x) % 5 != 0) { //然后再判断这些数是否不是5的倍数 07 if ((3 * x) % 9 != 0) { //最后判断这些数是否不是9的倍数 08 System.out.println(3 * x); 09 } 10 } 11 x++; 12 } 13 }
14 }
【代码说明】第5行是一个循环判断条件,判断是否在100以内,并且是3的倍数。第6行是一个条件语句,判断这些数是否不是5的倍数。第7行也是一个条件语句,判断这些数是否不是9的倍数。
【运行效果】
3 6 12 21 24 33 39 42 48 51 57 66 69 78 84 87 93 96
按照先绘制流程图,后编写程序的步骤,会显得思路更清晰。其实从上面的程序段中,可以总结一点:当由多个条件形成循环条件时,可以选择其中一个作为循环条件,而剩下的条件可以在循环体中作为条件语句。
4.3.3 do…while语句
在学习do…while语句之前,先清楚while语句是如何工作的。while语句是先进行条件判断,再执行大括号内的循环体。do…while语句与while语句不同的是,它先执行大括号内的循环体,再判断条件,如果条件不满足,下次不再执行循环体。也就是说,在判断条件之前,就已经执行大括号内的循环体。
do…while循环语句格式为:
do 执行代码; while(布尔表达式)
【实例4-13】下面先看一个程序段。
01 public class control10 { 02 public static void main(String[] args) { 03 int x = 1; 04 do { 05 //首先判断这个数是否是3的倍数,并且是否不是5的倍数 06 if ((3 * x) % 5 != 0) { 07 if ((3 * x) % 9 != 0) { //再判断是否不是9的倍数 08 System.out.println(3 * x); 09 } 10 } 11 x++; 12 } while (((3 * x > 1) && (3 * x < 100))); //最后判断是否在100以内 13 } 14 }
【运行效果】
3 6 12 21 24 33 39 42 48 51 57 66 69 78 84 87 93 96
【代码说明】从上面的程序段输出结果可以看出,与使用while语句的输出结果是一样的,为什么会是一样的呢?下面来分析。
当“x=33”时,先不会检验“3*33=99”是否小于100,而是先执行大括号内的循环体。当检测到99是9的倍数时,条件是“false”,于是就会退出条件语句,继续执行“x”自加1表达式,于是“x”变成了34,由于“34*3=102”大于100,所以结束循环体。因此程序执行到“x=32”后就无输出了,最后输出的结果当然和while语句的输出一样。
其实在实际程序开发中,不经常使用do…while循环语句。因为这种语句是先执行循环体再检测条件,所以会有一些危险数据不经检测,就会被执行。建议使用while语句或者for循环语句来编写代码。
4.4 中断与继续语句
在实际编程中,可能会出现中断某个程序;或从一个程序点开始,继续执行程序的特殊情况。对于这些特殊情况,Java会使用中断与继续功能来解决。
4.4.1 中断控制语句
在Java程序开发中,使用关键字break来表示中断控制。中断控制语句用来强行退出程序的循环体部分或分支语句(如switch语句)。在switch分支语句中,已经使用过break语句,一旦执行该跳转语句,程序就退出switch语句。
【实例4-14】为了能熟悉中断控制语句,下面看一个简单的程序段,通过这个例子,可以看到中断控制语句在实际开发中的用处。
01 //通过system.out语句可以将数据打印出来 02 public class control11 03 { 04 public static void main(String[] args) 05 { 06 int i=1; 07 while(i<=10) //循环 08 { 09 System.out.println(i); 10 i++; //值自加 11 if(i>5) 12 {break;} //退出 13 } 14 } 15 }
【代码说明】第11行添加了一个条件语句,当变量i大于5时,使用break语句退出while循环体。
【运行效果】
1 2 3 4 5
【实例4-15】如果上述代码中,没有中断语句强行退出,则代码如下所示:
01 //如果没有中断语句,则会循环到最后
02 public class control12
03 {
04 public static void main(String[] args)
05 {
06 int i=1;
07 while(i<=10) //循环
08 {
09 System.out.println(i); //输出值
10 i++;
11 }
12 }
13 }
【代码说明】第7~11行是while循环体,这里没有使用中断语句,所以符合条件的变量i值全部输出。
【运行效果】
1 2 3 4 5 6 7 8 9 10
从上面两个实例的程序段运行结果可以看出:当使用了break语句后,程序执行到“x=6”时,根据条件判断“x>5”,执行中断语句,直接退出程序的循环体部分。
说明
由以上程序段可以总结出一个规律:中断语句一般会与条件语句结合使用,当满足条件语句中的条件时,就会执行中断语句。
【实例4-16】下面再看一个有关中断语句的例子。
01 //将system.out语句放置在中断语句之前,则会循环一次,再退出循环 02 public class control13 03 { 04 public static void main(String[] args) 05 { 06 for(int i=2;i<10;i++) 07 { 08 System.out.println(i); //输出语句 09 if(i%2==0) 10 {break;} //退出 11 } 12 System.out.println("退出来了"); //输出提示 13 } 14 }
【代码说明】第9~10行是条件语句和中断语句的集合,在符合条件的时候,退出for循环体。当“i”是偶数的时候,直接中断循环体。由于第8行的输出方法属于循环体中的方法,所以不会执行它。
【运行效果】
2 退出来了
【实例4-17】将输出方法的位置进行调整,再看下面的代码。
01 //将system.out语句的位置放置在中断语句之后,则直接退出循环
02 public class control14
03 {
04 public static void main(String[] args)
05 {
06 for(int i=2;i<10;i++) //for循环
07 {
08 if(i%2==0)
09 {break;} //退出
10 System.out.println(i); //输出值
11 }
12 System.out.println("退出来了"); //输出提示
13 }
14 }
【代码说明】与前面的程序段一样,代码会直接跳出循环体程序,第12行的输出方法在循环体外,所以得以执行。
【运行效果】
退出来了
通过上述几个实例,可以总结出中断语句的使用方法:一般和条件判断语句结合使用,中断语句是中断整个循环体。跳出循环体后,直接执行循环体以外的语句。
4.4.2 继续语句
在Java程序设计中,继续语句使用关键字continue表示。当执行continue语句时,程序从循环体的开始处执行,而不考虑循环体中已经执行了多少轮循环,在for循环语句中,执行到continue语句时,不再执行循环体中其他代码,而是直接跳转到增量表达式,再开始下一轮的for循环。在while和do…while语句中,运行到continue语句时则跳转到相应的条件表达式,再开始下一轮的循环。
【实例4-18】下面先看一个有关继续语句的实例。
01 //只在奇数时,才输出,偶数时,会退出本次循环
02 public class control15
03 {
04 public static void main(String[] args)
05 {
06 for(int i=1;i<10;i++) //for循环
07 {
08 if(i%2==0)
09 {continue;} //继续语句
10 System.out.println(i); //输出值
11 }
12 System.out.println("退出来了"); //输出提示
13 }
14 }
【代码说明】仔细分析以上的程序段,如果使用break语句,那么运行结果中只有一个“1”,而用了继续语句,则输出了10以内的奇数。在程序中,如果i是偶数,遇到继续语句,就终止“System.out.println(i)”这条语句,又跳到循环开始,重新循环。所以,只要遇到偶数就会终止程序,遇到奇数程序就会继续运行。
【运行效果】
1 3 5 7 9 退出来了
注意
一定要注意break和continue的区别,break是直接跳出循环,而continue只是中断当次循环。如果后面的条件满足要求,还会继续执行。
4.5 分支语句
在讲述条件判断语句时,曾经提到当判断条件过多时,可以使用分支语句来编写。之所以使用分支语句而不是if/else条件语句,是因为当需要判断的条件过多时,后者实现时会显得很烦琐,为了解决该问题,可以利用分支语句。
分支语句的基本结构是:
switch(整数因子) { case 整数值1:语句;break; case 整数值2:语句;break; case 整数值3:语句;break; case 整数值4:语句;break; case 整数值5:语句;break; … default:语句; }
同样,先看看分支语句的流程图,如图4-9所示。
图4-9 分支语句流程图
如果仍然使用条件判断语句,整个程序段会显得层次过多,程序显得过于复杂,不易阅读。
【实例4-19】下面通过实际程序段,来了解条件判断语句和分支语句的区别。
01 public class control16 02 { 03 public static void main(String[] args) 04 { 05 int i=8; //定义变量i 06 if(i==1) //当变量i为1时 07 {System.out.println("是一月份");} 08 if(i==2) //当变量i为2时 09 {System.out.println("是二月份");} 10 if(i==3) //当变量i为3时 11 {System.out.println("是三月份");} 12 if(i==4) //当变量i为4时 13 {System.out.println("是四月份");} 14 if(i==5) //当变量i为5时 15 {System.out.println("是五月份");} 16 if(i==6) //当变量i为6时 17 {System.out.println("是六月份");} 18 if(i==7) //当变量i为7时 19 {System.out.println("是七月份");} 20 if(i==8) //当变量i为8时 21 {System.out.println("是八月份");} 22 if(i==9) //当变量i为9时 23 {System.out.println("是九月份");} 24 if(i==10) //当变量i为10时 25 {System.out.println("是十月份");} 26 if(i==11) //当变量i为11时 27 {System.out.println("是十一月份");} 28 if(i==12) //当变量i为12时 29 {System.out.println("是十二月份");} 30 } 31 }
【代码说明】第6~29行是12个if条件语句。这是判断月份,如果要判断的条件更多,是不是需要写更多的if语句呢?这说明判断条件非常多时,使用if语句显得层次有些混乱。
【运行效果】
是八月份
这个程序段看着不是很舒服,并且有点杂乱,下面再看看使用分支语句编写的程序段是什么样子。先来绘制一下流程图,如图4-10所示。
图4-10 输出一年月份程序流程图
【实例4-20】为了便于浏览,图4-10只绘制了1~6月份的流程。下面是这个程序的具体代码。
01 public class control17 02 { 03 public static void main(String[] args) 04 { 05 int i=8; 06 switch(i) //选择语句 07 { 08 case 1: System.out.println("是一月份");break; //退出语句 09 case 2: System.out.println("是二月份");break; 10 case 3: System.out.println("是三月份");break; 11 case 4: System.out.println("是四月份");break; 12 case 5: System.out.println("是五月份");break; 13 case 6: System.out.println("是六月份");break; 14 case 7: System.out.println("是七月份");break; 15 case 8: System.out.println("是八月份");break; 16 case 9: System.out.println("是九月份");break; 17 case 10: System.out.println("是十月份");break; 18 case 11: System.out.println("是十一月份");break; 19 case 12: System.out.println("是十二月份");break; 20 default: System.out.println("fault"); //默认语句 21 } 22 } 23 }
【代码说明】第6~21行是完整的分支语句,每个条件通过case来设置,条件执行完后,通过break语句来中断。第20行的default表示上述条件都不满足时,则执行它设置的输出。
【运行效果】
是八月份
说明
通过观察上面的程序段,会发现使用分支语句,整个程序更容易阅读。
4.6 返回语句
返回语句就是在执行程序的过程中,跳转到另一个程序。一般返回语句用在子程序或程序的函数方法中。返回语句使用关键字return来表示。下面通过一个简单的实例,了解返回语句的用法。
01 public void set(int a,int b)
02 {
03 i=a*b
04 return; //返回语句
05 }
以上是一个小程序段,在程序中出现了return关键字,说明这个程序段结束了,返回到主运行程序中。还有一种情况,先看看下面的例子。
01 public int set()
02 {
03 return i=a*b //返回值
04 }
这种情况不但要返回到主运行程序,而且还要将“i=a*b”的值带回主运行程序中,将其值赋给主运行程序中的“i”。返回语句牵扯到不同方法之间的调用问题,我们会在讲解了类的方法之后再详细了解其应用环境。
4.7 常见疑难解答
4.7.1 普通循环是使用for语句还是while语句
根据情况不同而定,for循环语句主要针对有限循环而言,也就是说,当循环有上限的时候,一般使用for循环。while循环语句则针对那些无限循环的代码而言,当循环没有明确上限,上限只是根据程序中的条件而定。
4.7.2 一般的程序可否用分支语句来代替条件语句
这个要视具体情况而定,如果条件在三重之内,最好使用条件语句。如果超过了三重,最好使用分支语句。
4.8 小结
本章讲解的是Java程序设计中的流程控制,这是每种开发语言的基础,如果你学习过C语言,则本章内容并不复杂。流程控制主要通过条件判断、循环、中断、执行等一系列语句来完成,每个语句实现的功能不同,或者说技巧也不同。建议读者对本章中的每个例子都能亲自动手实现,如果出现了问题,还要多注意如何解决问题,这样就能知道更多的知识和技巧。
4.9 习题
一、填空题
1.循环语句总共有3种常见的形式:3.输入一个正整数,输出该数的阶乘。__________、__________和__________。
2.在Java程序开发中,使用关键字__________来表示中断控制。
3.__________就是在执行程序的过程中,跳转到另一个程序。
二、上机实践
1.通过程序实现求1~100之间不能被3整除的数之和。
【提示】关键代码如下:
for(int i=0;i<=100;i++){ if(i%3!=0){ sum=sum+i; } }
2.通过程序实现求整数1~100的累加值,但要求跳过所有个位为3的数。
【提示】关键代码如下:
for(int i=0;i<=100;i++){ // 判断个位数字是否为3 if(i%10==3){ continue; } sum=sum+i; }
3.输入一个正整数,输出该数的阶乘。
【提示】整数n的阶乘公式为:n!=1×2×…×n。(n!表示n的阶乘)。
4.输入一个正整数n,判断该数是不是质数,如果是质数输出“n是一个质数”,否则输出“n不是质数”。
【提示】质数的含义:除了1和它本身不能被任何数整除。