面向对象的程序设计-Java张白一第三版第3章.ppt_第1页
面向对象的程序设计-Java张白一第三版第3章.ppt_第2页
面向对象的程序设计-Java张白一第三版第3章.ppt_第3页
面向对象的程序设计-Java张白一第三版第3章.ppt_第4页
面向对象的程序设计-Java张白一第三版第3章.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 程序流程控制 第3章 程序流程控制 3.1 选择结构程序设计 3.2 循环结构程序设计 3.3 break和continue语句 第3章 程序流程控制 3.1 选择结构程序设计 Java语言提供了两条基本的分支选择语句:if语句和 switch语句。用这两条语句可以形成以下三种形式的选择结 构: (1) 双分支选择结构。由if/else语句构成,用来判定一个 条件(布尔表达式),当条件为真(true)时执行一个操作,当条 件为假(false)时执行另一个操作。 第3章 程序流程控制 (2) 单分支选择结构。由省略了else的if语句构成,在条 件为真时执行一个操作,在条件为假时则跳过该操作。 (3) 多分支选择结构。由switch语句构成,根据表达式 的值来决定执行许多不同操作中的某一个操作。当然,使用 嵌套的if语句也可以实现多分支选择结构。 第3章 程序流程控制 3.1.1 if语句 if语句是构造分支选择结构程序的基本语句。使用if语 句的基本形式,可构造双分支选择结构程序;使用省略了 else的if语句可构造单分支选择结构程序;使用嵌套的if语句 可构造多分支选择结构程序。下面分别讲述这几种形式。 第3章 程序流程控制 1if语句的基本形式 if语句的基本形式如下: if(布尔表达式) 语句区块1 else 语句区块2 其执行流程如图3.1所示。 第3章 程序流程控制 图3.1 if语句的基本形式 第3章 程序流程控制 说明: (1) 这里的“布尔表达式”为关系表达式或逻辑表达式(下 同)。 (2) “语句区块”是指一条语句或多条语句。当为多条语 句时,一定要用一对花括号(“”和“”)将其括起,使之成为 一条复合语句。例如,在下面程序的if语句中,关系表达式 grade=60为true时,执行“语句区块1”,它由两条语句构成 ,所以使用了一对花括号使其构成一条复合语句,否则,编 译时会指出语法错误;而当关系表达式grade=60为false时 ,执行“语句区块2”,它只有一条语句,所以可以省去花括 号。 第3章 程序流程控制 【示例程序C3_1.java】 判断给出的一个成绩,输出“通 过”或“不及格”。 public class C3_1 public static void main(String args) int grade; grade=86; /读者在调试时也可赋一个小于60的成绩试 试看 /* 此处最好使用一个数据输入语句。但Java从键盘读取 整数或浮点数时要使用类、对象、 方法等知识。限于我们目前所学,此处用了一个赋值语句 ,待读者学习了第4章后,可 对该程序进行相应的修改,使其适用于各种情况 */ 第3章 程序流程控制 if(grade=60) System.out.print(“通过,成绩是:”); System.out.println(grade); else System.out.println(“不及格”); 该程序的运行结果如下: 通过,成绩是:86 第3章 程序流程控制 请注意该程序的缩进格式。这种缩进格式虽然不是必须 的,但由于它突出了程序的结构,大大提高了程序的清晰度 和可读性,故国际上提倡和推荐这种程序书写风格。 【示例程序C3_2.java】 比较两个数的大小。 import java.applet.Applet; import java.awt.Graphics; public class C3_2 extends Applet public void paint(Graphics g) double d1=43.4; 第3章 程序流程控制 double d2=85.3; if(d1=d2) g.drawString(d1+“ = ”+d2,25,25); else g.drawString(d1+“ =90)System.out.println(“成绩:优”); else if(grade=80)System.out.println(“成绩:良”); else if(grade=70)System.out.println(“成绩:中等“); 第3章 程序流程控制 else if(grade=60)System.out.println(“成绩:及格”); else System.out.println(“成绩:不及格”); 该程序的运行结果如下: 成绩: 中等 第3章 程序流程控制 4. 使用if嵌套时的注意事项 (1) Java编译器将else与离它最近的if组合在一起,除非 用花括号“ ”才能指定不同的匹配方式。例如,某编程者 的意图是当x和y都大于6时,输出“设备正常”的信息;而当x 不大于6时,输出“设备出错”的信息。为此,他写出了如下 所示的程序。 【示例程序C3_5.java】 if嵌套的使用。 public class C3_5 public static void main(String args) int x,y; 第3章 程序流程控制 x=3;y=14; if(x6) if(y6) System.out.println(“设备正常”); else System.out.println(“设备出错”); 该程序在执行时,只有当x6且y6时才输出“设备出错”的信息, 而当x不大于6时什么信息也不输出。这是因为该程序中有两个if而只有 一个else,这时,这个else将与离它最近的if配对,而与书写中的对齐方 式无关。实际上,该程序的if嵌套结构图如图3.4所示,且由于x=3,故 程序运行后没有输出,与编程者的意图相悖。如果希望if嵌套按编程者 的意图执行,则必须用花括号将内嵌的if结构括起来,即写为 第3章 程序流程控制 if(x6) if(y6) System.out.println(“设备正常”); else System.out.println(“设备出错“); 这样的if嵌套结构图如图3.5所示。用花括号将第二个if 结构括起,即可向编译器表明它是一个省略了else的if语句 ,而程序中的else与第一个if结构相对应。 第3章 程序流程控制 图3.4 程序C3_5的if嵌套结构图 第3章 程序流程控制 图3.5 程序C3_5改写后的if嵌套结构图 第3章 程序流程控制 (2) 在嵌套的if语句中,同样要注意每个“语句区块”只能 是“一个语句或一个复合语句”,当“语句区块”中包含多条语 句时,必须用花括号将这些语句括起来,使其构成一条复合 语句,否则会导致语法错误或输出错误。例如,下面两个程 序片段中左侧的嵌套if语句在x6时,不论y的值如何,总会 执行第二条输出语句;而右侧的嵌套if语句只有当x和y都大 于6时,才执行两条输出语句,否则,一条输出语句也不执 行。这两个程序片段的if嵌套结构如图3.6所示。 第3章 程序流程控制 if(x6) if(x6) if(y6) if(y6) System.out.print(“x=“+x); System.out.print(“x=“+x); System.out.print(“y=“+y); System.out.print(“y=“+y); 第3章 程序流程控制 图3.6 上述两个程序片段的if嵌套结构 第3章 程序流程控制 3.1.2 switch语句 当要从多个分支中选择一个分支去执行时,虽然可用if 嵌套语句来解决,但当嵌套层数较多时,程序的可读性大大 降低。Java提供的switch语句可清楚地处理多分支选择问题 。switch语句根据表达式的值来执行多个操作中的一个,其 格式如下: switch(表达式) case 值1:语句区块1;break; /分支1 case 值2:语句区块2;break; /分支2 case 值n:语句区块n;break; /分支n default : 语句区块n+1; /分支n+1 switch语句的执行流程如图3.7所示。 第3章 程序流程控制 图3.7 switch语句的执行流程 第3章 程序流程控制 说明: (1) switch后面表达式的类型可以是byte、char、short和 int(不允许是浮点数类型和long型)。 (2) case后面的值1、值2、值n是与表达式类型相同 的常量,但它们之间的值应各不相同,否则就会出现相互矛 盾的情况。case后面的语句块可以不用花括号括起。 (3) default语句可以省去不要。 (4) 当表达式的值与某个case后面的常量值相等时,就 执行此case后面的语句块。 (5) 若去掉break语句,则执行完第一个匹配case后的语 句块后,会继续执行其余case后的语句块,而不管这些语句 块前的case值是否匹配。 第3章 程序流程控制 【示例程序C3_6.java】 判断成绩等级。 import java.applet.Applet; import java.awt.Graphics; public class C3_6 extends Applet public void paint(Graphics g) int k; int grade=86; k=grade/10; switch(k) case 10: case 9: g.drawString(“成绩:优“,25,25); break; 第3章 程序流程控制 case 8: case 7: g.drawString(“成绩:良”,25,25); break; case 6: g.drawString(“成绩:及格。”,25,25); break; default: g.drawString(“成绩:不及格。”,25,25); 该程序的运行结果如下: 成绩:良 第3章 程序流程控制 3.1.3 条件运算符 对于一些简单的if/else语句,可用条件运算符来替代。 例如,若有以下if语句: if (xy) m=x; else m=y; 则可用下面的条件运算符来替代: m=(xy)?x :y 其中,“?:”被称为条件运算符;“(xy)?x :y”被称为条 件表达式。条件表达式的语义是:若(xy)条件为true,则表 达式的值取x的值,否则表达式的值取y的值。条件表达式的 一般形式为: 布尔表达式1?表达式2 :表达式3 第3章 程序流程控制 在条件表达式中: (1) 表达式2和表达式3的类型必须相同。 (2) 条件运算符的执行顺序是:先求解表达式1,若值为 true则执行表达式2,此时表达式2的值将作为整个条件表达 式的值;否则求解表达式3,此时表达式3的值将作为整个条 件表达式的值。 在实际应用中,常常将条件运算符与赋值运算符结合起 来,构成赋值表达式,以替代比较简单的if/else语句。条件 运算符的优先级高于赋值运算符,因此,其结合方向为“自 右至左”。 第3章 程序流程控制 【示例程序C3_7.java】 条件运算符的使用。 public class C3_7 public static void main(String args ) int x,y,z,a,b; a=1; b=2; x=(ab) ? a : b; y=(a!=b) ? a : b; z=(a10) break; /布尔表达式写在了循环体内的if语句中 System.out.println(“sum=“+sum); 第3章 程序流程控制 该程序的运行结果如下: sum=55 此外,在for语句头的构件中,“初值表达式”和“循环过 程表达式”中还可以使用逗号运算符。这也是Java中唯一使 用逗号运算符的地方。 第3章 程序流程控制 【示例程序C3_13.java】 在for循环的初值表达式中使用 逗号运算符。 public class C3_13 public static void main(String args) int i,sum; for(i=1,sum=0;i10)break; /循环体改成了判定跳转语句 System.out.println(“sum=“+sum); 该程序的运行结果如下: sum=65 第3章 程序流程控制 3.2.5 循环语句比较 前面通过示例程序讲述了三种循环语句的用法。一般情 况下,Java系统提供的三种循环语句是可以相互替代的,尤 其是对于那些确切地知道所需执行次数的循环。然而,由于 for语句头中包含了控制循环所需要的各个构件,因此,对 于同样的问题,使用for循环编写的程序最简洁清晰。如果 读者将求自然数110之和的问题分别用三种循环结构写出 ,就可以清楚地看到这一事实。对于那些只知道某些语句要 反复执行多次(至少执行一次),但不知道确切执行次数的问 题,使用do-while循环会使程序更清晰。对于那种某些语句 可能要反复执行多次,也可能一次都不执行的问题,使用 while循环当然是最好了。 第3章 程序流程控制 3.2.6 循环控制要点 进行循环控制主要有两种办法,一种是用计数器控制循 环,另一种是用标记控制循环。大多数循环结构程序是利用 计数器的原理来控制的。设计计数器控制循环的程序,需要 把握下面几个要点: (1) 循环控制变量(或循环计数器)的名字,即循环变量 名。 (2) 循环控制变量的初始值。 (3) 每执行一次循环,循环控制变量的增量(或减量)。 (4) 测试循环控制变量的终值条件(即是否继续进行循环 )。 第3章 程序流程控制 通过仔细分析前面的示例程序可以看出,用三种不同的 循环语句编写的程序都具有上述四个方面的内容,其中以 for语句最为典型,它把所有这些构件都放在了for语句头中 ,图3.11明确地指出了这些方面。 第3章 程序流程控制 图3.11 一个典型for语句头的组成构件 第3章 程序流程控制 用标记控制循环主要适用于那些事先无法知道循环次数 的事务处理。例如统计选票就是这样一类问题,只知道有许 多人参加投票,但不能确切地知道选票数。在这种情况下可 以使用一个叫做标记值的特殊值作为“数据输入结束”的标志 ,当用户将所有合法的数据都输入之后,可以输入这个标记 值,表示最后一个数据已经输入完了。循环控制语句得到这 个标记值后,结束循环。标记控制循环通常也称做不确定循 环,因为在循环开始执行之前并不知道循环的次数。下面的 程序使用“#”作为循环控制标记。 第3章 程序流程控制 【示例程序C3_15.java】 设有李、王、张三人竞选领导 ,由群众投票表决,试设计一个统计选票的程序。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class C3_15 public static void main(String args) throws IOException BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in); /上面一条语句是有关键盘输入数据流的处理,字符在各对 象之间的流动过程如图3.12所示 第3章 程序流程控制 int Ltotal=0,Wtotal=0,Ztotal=0; char name; String c1; System.out.print(“enter letter L or W or Z name, # to end:”); c1=keyin.readLine( ); /从键盘上读取一个字符串赋给c1 name=c1.charAt(0);/ charAt(0)是从一个字符串中截取第0 个字符的方法 while(name!=#) switch(name) case L: 第3章 程序流程控制 case l: /李姓人的得票,列出两个case分别处 理大、小写字母 Ltotal=Ltotal+1; break; case W: case w:/王姓人的得票 Wtotal=Wtotal+1; break; case Z: case z: /张姓人的得票 Ztotal=Ztotal+1; break; / switch语句结束 System.out.print(“enter letter L or W or Z name ,# to end:”); c1=keyin.readLine( ); name=c1.charAt(0); / while循环结束 第3章 程序流程控制 System.out.println(“ Ltotal=”+Ltotal); System.out.println(“ Wtotal=”+Wtotal); System.out.println(“ Ztotal=”+Ztotal); 该程序运行时,可在NetBeans IDE的“输出”窗口中通过 键盘输入数据,输入过程及运行结果如图3.12所示。 第3章 程序流程控制 图3.12 程序C3_15的运行结果 第3章 程序流程控制 图3.13显示了从键盘输入直到最后一个对象得到一个字 符,字符在4个对象之间的流动过程。这4个对象是System.in 、InputStreamReader的对象(无名对象)、keyin和c1。除了对 象c1,其他3个对象都被画成了一个管道的形状,它们在系 统中负责传递字节和字符。这些对象被称做流对象, 数据 在它们当中按照一定的顺序流动。InputStreamReader的对象 (无名对象)负责从键盘读入字节数据,这里读入了4个字节 。对象keyin把无名对象的每个字节都转换成char类型的值。 对象keyin的readLine( )方法把换行符(/n)以前的所有字符都 拷贝到c1字符串对象中,最后,对象c1的成员方法charAt( ) 从字符串中取出第一个字符赋给name变量。 第3章 程序流程控制 图3.13 字符在各对象之间的流动过程 第3章 程序流程控制 3.2.7 循环嵌套 循环嵌套是指在循环体内包含有循环语句的情形。Java 语言提供的三种循环结构可以自身嵌套,也可以相互嵌套。 循环嵌套时应该注意的是:无论哪种嵌套关系都必须保证每 一个循环结构的完整性,不能出现交叉。 下面几种循环嵌套都是合法的形式。 第3章 程序流程控制 第3章 程序流程控制 第3章 程序流程控制 【示例程序C3_16.java】 编程打印三角形数字图案。 public class C3_16 public static void main(String args) for(int i=1;i=10) System.out.print(+i+“ ”); else System.out.print(+i+“ ”); /并列的内嵌for循环结束 System.out.println(“ ”); /外层for循环结束 第3章 程序流程控制 该程序的运行结果如下: 第3章 程序流程控制 【示例程序C3_17.java】 编写求解 (即 1! + 2! + 3! + + 7! + 8!)的程序。 public class C3_17 public static void main(String args) int n=1,m,s,k=0; while(n=m+1) if(n%6=0)System.out.println(“n”); /换行控制 System.out.print(i+“ ”); n+; 第3章 程序流程控制 /外层循环结束 该程序的运行结果如下: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 第3章 程序流程控制 【示例程序C3_19.java】 求自然数150间的素数。 解此题可改写示例程序C3_18.java,外循环控制仍是1100,但当 外循环执行到第51次时,在内循环中利用带标号的break语句使其终止。 publ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论