《第4章程序设计中的流程控制.pdf》由会员分享,可在线阅读,更多相关《第4章程序设计中的流程控制.pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 45第 4 章 程序设计中的流程控制 什么是流程控制呢?流程就是做一件事情的顺序,或者说是次序。在程序设计中,流程就是要完成一个功能,而流程控制则是指如何在程序设计中,控制完成某种功能的次序。本章将通过大量的实例,为读者讲述如何在程序中设计好流程控制。4.1 编程风格 本章开始接触到编写程序代码,有一点必须强调,那就是编程风格的问题,虽然其不影响程序代码段的运行,但对于程序的可读性起着重要的作用。自己编出的程序要让别人看懂,首先在排版方面要非常注意,下面将探讨编程风格的问题。其实每个人的编程风格、每个软件开发公司的编程风格都不一样。一个人编写的程序代码,就应该能让别人看懂,甚至是过了很长时间
2、,自己也要看的懂,否则这个程序就成了一个死程序。编程风格是指编程时的格式,让程序看上去就很有层次感。下面通过一些例子,说明编程风格的重要性,先来看第一个例子。public class math public static void main(String args)int x=12;double y=12.3d;void print()char a=a;System.out.println(a);System.out.println(x+y);上面程序段的整个排版看起来是否很舒服,并且层次感很强?是否一眼看上去就知道整个程序架构?这里的关键在于缩排,缩排也可以称为跳格。上一个程序段采用的跳格形
3、式:“public class math”是顶格的,接着主运行程序前跳 4个空格,在主运行程序内的运行代码段一律跳 8 个空格,而在主运行程序方法内的代码前,再跳 4 个空格。这样整个程序的所属关系就很明显了。主运行程序从属于“math”类,其余的都属于主运行程序,而在主运行程序方法内的代码段又属于此方法。规律就是空格多的代码从属于空格少的代码。除了空格外,还有一个很有必要,就是空行。为什么要空行呢?先看下列程序代码,再来仔细分析。public class math public static void main(String args)46 int x=12;int y=23;void pr
4、int().void view().下面仔细分析上面的程序段:在“print”方法与“view”方法之间有个空行,使用空行区分不同功能的模块。“print”方法所完成的功能与“view”所完成的功能不一样,所以使用空行将它们分开,这样更增加了程序的可读性。另外,需要注意的是方法或属性的命名。这些名字应该有含义,最好有规律。不要只使用“a”、“b”这种通用变量,适当可以根据变量或函数的功能为其命名。上面的“print”,其他程序员一看就知道这个方法,是有关打印或输出的函数。再如:变量名“name”,一看就知道是有关名字的变量。所以,一定要命名的有意义,否则程序的可读性不强。还有一点是有关注释的。
5、在每个方法的方法名旁边,应该添加一些注释,同时在一段程序完成之后,也要对程序的功能及如何操作,做个简单的描述。只要做到以上几点,这个程序他人来读就很容易。即使自己在很长时间后,再来读程序也会一目了然。4.2 条件语句 在现实生活中,经常听人说:如果某人发财了,某人会做什么。其实这就是程序设计中所说的条件语句。像“如果.”、“就.”,“否则”,当然这只是很简单的条件语句,在真正的程序设计中,使用的条件语句要比这复杂的多。4.2.1 条件语句的种类 在程序设计中,条件语句的标准格式如下:if(条件)目的一;else 目的二;掌握格式后,先看一个简单的程序段。/将整型变量 a,b 的大小比较得出的布
6、尔型变量作为条件语句的条件/通过条件语句来得出不同的输出结果 public class control 47 public static void main(String args)int a=20;int b=30;if(ab)System.out.println(很幸运!);else System.out.println(很开心);运行结果 很开心 分析上面的程序段,因为“a=20”而“b=30”,所以“ab”,就输出“很幸运”,如果“ab”是真,就输出“很幸运”,否则输出“很开心”。在条件语句的程序设计中,有一种最简单的条件语句,如下所示:if(条件)目的;如果有很多的目的,也可以采取下
7、列的形式:if(条件)目的一;目的二;目的三;目的四;下面看一个有关这种条件语句的例子。public class control1 public static void main(String args)int salary=10000;if(salary500)System.out.println(要想请吃饭!);System.out.println(想请唱歌!);System.out.println(想请喝酒!);运行结果 想请吃饭!想请唱歌!想请喝酒!48分析上面的程序段:条件语句中判断“salary500”是否为真,如果是真就输出“想请吃饭!想请唱歌!想请喝酒”,如果是假,就什么都不做
8、。在程序中“salary10000”,满足“salary500”,条件为真,所以输出以上的三句话。注意:在多个目的的程序段中,一般按顺序执行,即先目的一,再目的二,再目的三,依次执行下去。如果出现多种不同的条件,应该如何处理呢?可以使用条件语句中的复杂型,其结构就是:if(条件 1)目的 1;else if(条件 2)目的 2;else if(条件 3)目的 4;else 不满足以上所有条件,如何办;根据以上的结构,学习有关这种复杂条件语句的实例,代码如下所示。/当 achievement 等于 100,就奖励一台笔记本电脑/当 achievement 大于 90 小于 100,就奖励一个 M
9、P4/当 achievement 大于 80 小于 90,就奖励一块网卡/当 achievement 大于 60 小于 80,不给予奖励/当 achievement 小于 60,放假回学校补习 public class control2 public static void main(String args)int achievement=85;if(achievement=100)System.out.println(奖励一台笔记本电脑);else if(achievement=90)&(achievement=80)&(achievement=60)&(achievement806090)
10、&(Avg80)&(Avg70)&(Avg60)&(Avg0;n-,x+)System.out.println(x);运行结果 1 2 3 4 5 6 7 8 9 10 在这个程序段里,用 4 句代码完成了前面程序段里 12 句代码所解决的事情,如果前面的程序段中,需要连续加 1 加 100 次,参考下面的程序段。public class control6 public static void main(String args)int x;int n=100;for(x=1;n0;n-,x+)System.out.println(x);53在这个程序段里,使用 4 句代码解决了前面程序段中 1
11、02 句代码所解决的问题,这就是循环语句的优势。下面详细的解释 For 循环语句中各个子项的意义。?初始化表达式:初始化表达式的意义,在于定义循环之前变量的值是多少,如果没有这一项,就不知道该从哪个值开始循环。?判断表达式:判断表达式的作用在于规定循环的终点。如果没有判断表达式,那么此循环就成了死循环。?递增(递减)表达式:这一项规定每执行一次程序,变量以多少增量或减量进行变化。其实也可以利用在条件判断语句中提到的流程图来编写程序,在流程图中可以看出程序运行的顺序,如图 4.4 所示。下面再看一个九九乘法表的程序段。先来绘制流程图,如图 4.5 所示。初始化表达式是否满足判断表达式执行循环体中
12、的语句执行递增或递减条件否是循环体开始 x=1x是否大于10y=1y是否大于10 x*y是否否是执行循环体外的语句 图 4.4 循环语句流程图 图 4.5 九九乘法表流程图 根据流程图,使用循环语句编写一个乘法口诀表。/这是一个多重 for 循环语句 public class control7 public static void main(String args)for(int x=2;x10;x+)for(int y=1;y0)x=x+1;y-;sum+=x;System.out.println(sum);运行结果 5050 这个程序段是将数字从 1 一直加到 100,条件是只要“y”大于
13、 0,就会执行大括号里的语句。“y”初始值是 100,满足条件,所以执行大括号的表达式。先将“x+1”赋给“x”,因为 x 的初始值是 0,所以 x 从 1 开始计数,然后,将“y”自减 1,此时“y”变成了 99,55将“sum”加上“x”赋给“sum”。此时,执行语句结束了,又会回到小括号的条件,最后再比较“y=99”是否大于 0,如果大于 0,再继续执行大括号里的语句。一旦“y”自减到小于 0,则将结束执行大括号里的语句,开始执行大括号外的语句。在上面的程序段中,y 就相当于一个计数器。同样,在编写 while 语句,要先绘制流程图,根据流程图再来编写程序段,整个思路就会很清晰了,下面先
14、看 while 的流程图,如图 4.6 所示。其实 while 语句很简单,根据这个流程图,就可以思路很清晰的编写程序段,下面针对上面的程序段来绘制流程图,如图 4.7 所示。判断是否满足while后小括号的条件将执行大括号内的执行语句执行while条件外的语句是否 判断y值是否大于0先执行x+执行while条件外的语句是否再执行y-最后将 sum+X的值赋给sum 图 4.6 循环语句流程图 图 4.7 一个循环语句实例的流程图 看了这个流程图,会发现按照流程图来编写程序简单多了。为了巩固以上所说,再看一个例子。试编写程序实现输出 1100 间的整数,并且此整数必须满足:它是 3 的倍数,但
15、不是 5 的倍数,也不是 9 的倍数。针对这个例子,先来绘制一个流程图,如图 4.8 所示。:,条件 是3的倍数 但不是5和9的倍数并且在1100之间打印输出这些数字,走出循环 执行循环以外的语句 图 4.8 输出特殊数字的循环流程图 根据流程图,现在来编写程序段。/通过判断是否在一百以内,并且是 3 的倍数/然后在判断这些数是否不是 5 的倍数/最后判断这些数是否不是 9 的倍数 public class control9 public static void main(String args)int x=1;while(3*x1)&(3*x1)&(3*x100);运行结果 3 6 12 2
16、1 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 语句的输出一样。其实在实际程序开发中,不经常使用
17、do/while 循环语句。因为这种语句是先执行循环体再检测条件,所以会有一些危险数据不经检测,就会被执行。建议使用 while 语句或者 For循环语句来编写代码。4.4 中断与继续 在实际编程中,可能会出现中断某个程序,或从一个程序点开始,继续执行程序的特殊情况。对于这种特殊情况,Java 会使用中断与继续功能来解决。584.4.1 中断控制语句 在 Java 程序开发中,使用关键字“break”来表示中断控制。中断控制语句用来强行退出程序的循环体部分。为了能熟悉中断控制语句,下面看一个简单的程序段,通过这个例子,可以看到中断控制语句在实际开发中的用处。/通过将 system.out 语句
18、可以将数据打印出来 public class control11 public static void main(String args)int i=1;while(i5)break;运行结果 1 2 3 4 5 上述代码中,没有中断语句时的测试代码如下所示。/通过将 system.out 语句的位置放置在,中断语句之前,则会循环到最后 public class control12 public static void main(String args)int i=1;while(i5”,执行中断语句,直接退出程序的循环体部分。由以上程序段可以总结一个规律:中断语句一般来说和条件语句结合使用,
19、当满足条件语句中的条件时,就会执行中断语句,下面再看一个有关中断语句的例子。/通过将 system.out 语句的位置放置在,中断语句之前,则会循环一次,再退出循环 public class control13 public static void main(String args)for(int i=2;i10;i+)System.out.println(i);if(i%2=0)break;System.out.println(退出来了);运行结果 2 退出来了 从上面的程序段看出:当“i”是偶数的时候,直接中断循环体。由于“System.out.println()”方法属于循环体中的方法,
20、所以不会执行它。/通过将 system.out 语句的位置放置在,中断语句之后,则直接退出循环 public class control14 public static void main(String args)for(int i=2;i10;i+)if(i%2=0)break;System.out.println(i);System.out.println(退出来了);运行结果 退出来了 跟前面的程序段一样,会直接跳出循环体程序,“System.out.println(退出来了)”方法在循环体外,所以得以执行,由此,可以总结出中断语句的使用方法如下:一般和条件判断语句结合使用,中断语句是中
21、断整个循环体。跳出循环体后,直接执行循环体以外的语句。4.4.2 继续语句 在 Java 程序设计中,继续语句使用关键字“continue”表示。继续语句同中断语句一样,用在循环体中,继续语句是用于终止当前循环体,返回到循环开始处,接着开始新的循环。下面先看一个有关继续语句的实例。60/继续语句则是根据只在奇数时,才输出,偶数时,会退出本次循环 public class control15 public static void main(String args)for(int i=1;i10;i+)if(i%2=0)continue;System.out.println(i);System.o
22、ut.println(退出来了);运行结果 1 3 5 7 9 推出来了 仔细分析以上的程序段,如果使用“break”语句,那么运行结果中只有一个“1”,而用了继续语句,则输出了 10 以内的奇数。在程序中,如果“i”是偶数,遇到继续语句,就终止“System.out.println(i)”这个语句,又跳到循环开始,重新循环。所以,只要遇到偶数就会终止程序,遇到奇数程序就会继续运行。4.5 分支语句 在讲述条件判断语句时,曾经提到当判断条件过多时,可以使用分支语句来编写。分支语句的基本机构是:switch(整数因子)case 整数值 1:语句;break;case 整数值 2:语句;break
23、;case 整数值 3:语句;break;case 整数值 4:语句;break;case 整数值 5:语句;break;.default:语句;同样,先看看分支语句的流程图,如图 4.9 所示。61是否等于case1的值是否等于case2的值是否等于case4的值是否等于case3的值不等于上面所有值执行语句一执行语句五执行语句四执行语句三执行语句二是否是是是是否否否 图 4.9 分支语句流程图 如果仍然使用条件判断语句,整个程序段会显得层次过多,程序显得过于复杂,不易阅读,下面通过实际程序段,来了解条件判断语句和分支语句的区别所在。public class control16 public
24、 static void main(String args)int i=8;if(i=1)System.out.println(是一月份);if(i=2)System.out.println(是二月份);if(i=3)System.out.println(是三月份);if(i=4)System.out.println(是四月份);if(i=5)System.out.println(是五月份);if(i=6)System.out.println(是六月份);if(i=7)System.out.println(是七月份);if(i=8)System.out.println(是八月份);if(i=9
25、)System.out.println(是九月份);if(i=10)System.out.println(是十月份);if(i=11)System.out.println(是十一月份);if(i=12)System.out.println(是十二月份);if(i1)System.out.println(是十二月份);62 运行结果 是八月份 这个程序段看得不是很舒服,并且有点杂乱,下面再看看使用分支语句编写的程序段是什么样子。先来绘制一下流程图,如图 4.10 所示。是否等于case1的值1是否等于case2的值2是否等于case3的值3是否等于case4的值4我是1月份我是2月份我是3月份我
26、是4月份是否等于case5的值5我是5月份是我是6月份是否等于case6的值6否是否是否是否是否是 图 4.10 输出一年月份程序流程图 为了便于浏览,以上的图只绘制了 1 月份到 6 月份的流程。下面是这个程序的具体代码。public class control17 public static void main(String args)int i=8;switch(i)case 1:System.out.println(是一月份);break;case 2:System.out.println(是二月份);break;case 3:System.out.println(是三月份);brea
27、k;case 4:System.out.println(是四月份);break;case 5:System.out.println(是五月份);break;case 6:System.out.println(是六月份);break;case 7:System.out.println(是七月份);break;case 8:System.out.println(是八月份);break;case 9:System.out.println(是九月份);break;case 10:System.out.println(是十月份);break;case 11:System.out.println(是十一月
28、份);break;63 case 12:System.out.println(是十二月份);break;default:System.out.println(fault);运行结果 是八月份 通过观察上面的程序段,会发现使用分支语句,整个程序显得更容易阅读。4.6 返回语句 返回语句就是在执行程序的过程中,跳转到另一个程序。一般返回语句用在子程序或程序中的函数方法中。返回语句使用关键字“return”来表示。下面通过一个简单实例,了解返回语句的用法。public void set(int a,int b)i=a*b return;以上是一个小程序段,在程序中出现了 return 关键字,说明这
29、个小程序结束了,返回到主运行程序中去。还有一种情况,先看看下面的例子。public int set()return i=a*b 这种情况不但要返回到主运行程序,而且还要将“i=a*b”的值带回到主运行程序中,将其值赋给主运行程序中的“i”。4.7 常见疑难解答 4.7.1 普通循环是使用 For 语句还是 while 语句 答:根据情况不同而定,For 循环语句主要针对有限循环而言,也就是说当循环有上限的时候,一般使用 For 循环。while 循环语句则针对那些无限循环的代码而言,当循环没有明确上限,上限只是根据程序中的条件而定的。4.7.2 一般的程序可否用分支语句来代替条件语句 答:这个要视具体情况而定,如果条件在三重之内,最好使用条件语句。如果超过了三重,最好使用分支语句。