1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 第四章 程序流程控制 一、 顺序结构和选择结构 任何一门编程语言都离不开流程控制, Java语言也不例外, 一般流程控制有三种结构: 顺序结构、 选择结构和循环结构。本节将主要介绍顺序结构和选择结构。 1.1 顺序语句 其实所有的编程语言, 发给计算机的命令都是按顺序一条条地执行的。比如生活中的取钱任务一般按六步操作顺序完成。这六步操作分别是: ①带上存折或银行卡去银行; ②取号排队; ③将存折或银行卡递给银行职员并告知取款数额; ④输入密码; ⑤银行职员办理取款事宜; ⑥拿到钱并离开银行。下面的程序Sequentia
2、lStatement.java就是按顺序一步一步地完成取钱任务的。 public class SequentialStatement { /** * 顺序结构语句的示例 */ public static void main(String[] args) { System.out.println("第1步: 带上存折或银行卡去银行"); System.out.println("第2步: 取号排队"); System.out.println("第3步: 将存折或银行卡递给银行职员并告知取款数额");
3、 System.out.println("第4步: 输入密码"); System.out.println("第5步: 银行职员办理取款事宜"); System.out.println("第6步: 拿到钱并离开银行"); } } 上面的代码就是根据一定的顺序从main方法的{(左括号)开始到}(右括号)结束, 来一行行地发送命令给计算机完成取钱的任务。 1.2 选择条件语句 if条件语句是根据条件判断之后再做处理, if分支结构主要有以下几种。 l if(条件语句){…}。 l if (条件语句){…}else
4、{…}。 l if (条件语句){…}else if(条件语句){…}else{…}。 l 嵌套if条件结构。 1. if结构 1. if结构 If(boolean类型表示式) 语句A; 功能: 当表示式值为true时, 执行语句A, 否则跳过语句A。 流程图如图3.5所示。 图1.5 单条件IF结构流程图 生活中有这样类似的问题, 如果我中了500万, 我就买车、 买房、 娶媳妇, 那么经过Java程序如何处理这样的呢? 下面的程序If.java是经过if结构来处理上述问题的。 import java.util.*; //
5、表示所有, 它包含import java.util.Scanner public class If{ public static void main(String[] args) { int jiangjin=500; //规定的奖金数目是500万 Scanner input=new Scanner(System.in); System.out.println("请您输入奖金猜是否与规定的数目符合: "); int in=input.nextInt(); //条件结构
6、 if(in==jiangjin){ System.out.println("恭喜您中500万! "); System.out.println("买车"); System.out.println("买房"); System.out.println("娶媳妇"); } } } 输出结果为: 请您输入奖金猜是否与规定的数目符合: 500 恭喜您中500万! 买车 买房 娶媳妇 2. if…else结构 If(boolean类
7、型表示式) 语句A; else 语句B; 功能: 当表示式值为true时, 执行语句A; 当表示式值为false时, 执行语句B。 流程图如图3.6所示。 图1.6 双重条件IF结构流程图 如果没有中500万, 那么又如何处理呢? 能够经过if…else结构进行处理。程序IfElse.java就是如果我们没有中奖的处理方式。 import java.util.Scanner; public class IfElse { public static void main(String[] args) {
8、 int jiangjin=500; //规定的奖金数目是500万 Scanner input=new Scanner(System.in); System.out.println("请您输入奖金猜是否与规定的数目符合: "); int in=input.nextInt(); //条件结构 if(in==jiangjin){ System.out.println("恭喜您中500万! "); System.out.println("买车")
9、 System.out.println("买房"); System.out.println("娶媳妇"); }else{ System.out.println("谢谢惠顾! "); System.out.println("您得继续吃方便面"); System.out.println("革命尚未成功, 同志仍需努力! ! ! "); } } } 输出结果为: 请您输入奖金猜是否与规定的数目符合:
10、400 谢谢惠顾! 您得继续吃方便面 革命尚未成功, 同志仍需努力! ! ! 3. 多重if结构 if (boolean类型表示式) { //语句 A } 能够有多个 else if (boolean类型表示式) { //语句 B } 能够省略 else { //语句 C } 功能: 当表示式值为true时, 执行语句A; 在else部分再判断其它表示式的值, 如果均不符合, 则是执行语句C。 流程图如图3.7所示。 图1.7 多重条件IF结构流程图 在学生时代, 父母为了激励孩子努力
11、学习, 一般会对孩子讲”如果你考了什么分数, 我将给你一个什么奖励…”。小明的父母也是这么给她一个期许的。如果把生活中的这种情形用程序来演绎, 前面两种做法显然是解决不了的, 要处理这样的问题就需要用多重if结构。 程序IfElseIfTest.java能够实现此类分级评级, 代码如下: import java.util.*; public class IfElseIfTest { /** * 输入小明的考试成绩, 显示所获奖励 * 成绩==100分, 爸爸给她买辆车 * 成绩>=90分, 妈妈给她买MP4 * 90分>成
12、绩>=60分, 妈妈给她买本参考书 * 成绩<60分, 什么都不买 */ public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请您输入小明的考试成绩: "); int chengji=input.nextInt(); if(chengji==100){ System.out.println("爸爸给她买辆车");
13、 }else if(chengji>=90&&chengji<100){ System.out.println("妈妈给她买MP4"); }else if(chengji>=60&&chengji<90){ System.out.println("妈妈给她买本参考书"); }else if(chengji<60){ System.out.println("什么都不买"); } } } 输出结果为: 请您输入小明的考试成绩: 67
14、妈妈给她买本参考书 4. 嵌套if结构 if (boolean类型表示式) { if(boolean类型表示式){ //语句 A }else{ //语句 B } }else if (boolean类型表示式){ if(boolean类型表示式){ //语句 C }else{ //语句 D } }else{ } 功能: 当表示式值为true时, 进入执行语句A; 在else部分再判断其它表示式的值, 如果均不符合, 则是执行语句C。 流程图如图3.8所示。 图1.8 嵌套if结构图 小朱的男朋友答应她
15、 如果她发了的奖金高于 块, 就出去庆祝一下( 如果周末天气好, 就去郊游, 否则就带她去商场买购物) ; 如果只发的奖金高于1000元, 就简单表示一下( 天气好就去公园转转, 否则就去书店看书) ; 如果发的奖金低于1000元, 则就呆在家里看电视。要处理这个语句就需要用到嵌套if语句。程序NestIFDemo.java能够实现小朱男友的计划, 代码如下: import java.util.Scanner; public class NestIFDemo { public static void main(String[] args) { Scanner
16、 input = new Scanner(System.in); System.out.println("请输入奖金数目( 整数) "); int bonus =input.nextInt(); System.out.println("请输入天气状况(1代表好, 0代表差)"); int datenum =input.nextInt(); boolean flag = (datenum==1?true:false); if (bonus > ) {
17、 if (flag) { System.out.println("我们去郊游"); } else { System.out.println("我们去购物"); } } else if (bonus > 1000) { if (flag) { System.out.println("我们去公园"); } else { System.
18、out.println("我们去书店"); } } else { System.out.println("在家看电视"); } } } 输出结果为: 请输入奖金数目( 整数) 3000 请输入天气状况(1代表好, 0代表差) 0 我们去购物 . if与else的配对 了解几种常见的条件语句用法之后, 请读者朋友想一想, 如果有多个不带else子句的if, 会是怎么一个结果呢? 【示例4】IfelseIfTest2.java 比如, 提供1至9个数据, 判断数据是奇数还是
19、偶数, 然后对其分别求和, 最后显示出奇数和偶数的和。 public class IfelseIfTest2{ public static void main(String[] args) { int oddsum = 0; int bothsum = 0; if (args.length>1) { for (int i = 0; i < 10; i++) if (i % 2 != 0) oddsum += i;
20、 else bothsum += i; } System.out.println("奇数的和为: " + oddsum + " 偶数的和为: " + bothsum); } } 上面的else看起来与数组长度的判断绑定在一块儿了, 但这只是缩进造成的假象, 在这里这个缩进应该被忽略掉。实际上它应该和是否被2整除的条件相互绑定的。上面main方法的代码实际上应该为: public static void main(String[] args) { int oddsum = 0;
21、 int bothsum = 0; if (args.length>1) { for (int i = 0; i < 10; i++) if (i % 2 != 0) oddsum += i; else bothsum += i; } System.out.println("奇数的和为: " + oddsum + " 偶数的和为: " + bothsum);
22、 } else子句应该和离它最近的那个没有else子句的if语句绑定。 1.3 switch结构 除了多重if结构外, Java语言中还有一类多分支选择结构, 如有下面一个问题要经过多分支选择结构来解决。 问题描述: 令狐冲参加比武大会, 如果获得第一名, 将出任武林盟主; 如果获得第二名, 将出任武当掌门; 如果获得第三名, 将出任峨嵋掌门; 否则, 将被逐出师门。 上面的问题能够经过多重if结构实现, 但Java语言中提供了更好的解决此类问题的方法——switch结构。 1. 什么是switch结构 switch结构也是一种类似于处理多分支选择的一种程序结构。 s
23、witch(表示式){ //计算表示式 case 取值1: 语句块1; break; //如果表示式的值等于常量1, 则执行语句块1 case 取值n: 语句块n; break; //如果表示式的值等于常量n, 则执行语句块n default: 语句块n+1; break; //如果前面的常量都不等于, 则执行default语句块 } switch结构有如下规则。 (1) 表示式的返回值必须是下述几种类型之一: char、 byte、 short、 int, 而且必须是确定的结果。 (2) case子句中的取值必须是常量, 且所有case子句中的取值应该是
24、不同的。 (3) default子句是可选的。 (4) break语句用来在执行完一个case分支后, 使程序跳出switch语句块; 如果case后面没有写break, 则直接往下面执行。 (5) case后面的执行体可写{ }, 也能够不写。 switch表示式必须是整数类型( char、 byte、 short、 int或它们对应的包装器类) 或者枚举类型。在后面的章节中会再作阐述。 2. 如何使用switch结构 下面经过switch结构来描述令狐冲比武的结果。 【示例6】SwitchTestPro.java 解决比武大会问题。 public class Switch
25、TestPro { public static void main(String args[]){ int mingCi = 1; switch (mingCi){ case 1: System.out.println("出任武林盟主"); break; case 2: System.out.println("出任武当掌门");
26、 break; case 3: System.out.println("出任峨嵋掌门"); break; default: System.out.println("被逐出师门"); } } } 输出结果为: 出任武林盟主 把类型改为char, 经过上例来测试switch块对char类型的支持。 publi
27、c class SwitchTestPro { public static void main(String args[]){ char mingCi = ‘a’; switch (mingCi){ case ‘a’: System.out.println("出任武林盟主"); break; case ‘b’: System.out.pr
28、intln("出任武当掌门"); break; case ‘c’: System.out.println("出任峨嵋掌门"); break; default: System.out.println("被逐出师门"); } } } 因为字符能够直接向int转型, 所又上述代码是完全正确的。 case或d
29、efault标号不会让控制流跳出switch, 它们也没有暗含要结束语句执行的意思。如果要在switch块中结束语句的执行, 必须显式地将控制流转出switch块。前面是经过break来做到这一点的。当然使用return语句也能够实现退出switch块的效果。 【示例7】SwitchTest.java 如果要想设计一个一星期的减肥计划, 能够经过switch结构来实现, 下面代码就是一个很好的示例。 import java.util.Scanner; /** * 下面是一个膳食减肥计划 */ public class SwitchTest { public stat
30、ic void main(String[] args) { //用switch结构来实现一个减肥计划 System.out.println("请您输入星期数字: "); Scanner input=new Scanner(System.in); int num=input.nextInt(); switch(num){ case 1: { System.out.println("小白菜");
31、 return; } case 2: System.out.println("大白菜"); return; case 3: System.out.println("方便面"); return; case 4: System.out.println("猪肉"); return; case 5:
32、 System.out.println("牛肉"); return; case 6: System.out.println("燕窝!鲍鱼"); break; default: System.out.println("什么也不吃"); return; } } } return语句会终止一个方法的执行并返回它的调用者。如果方法不需要返回值, 使用简单的
33、return语句即可。如果方法有返回类型, 则return语句必须包括属于某种类型的表示式, 这种类型能够赋值给返回类型。 输出结果为: 请您输入星期数字: 6 燕窝!鲍鱼 在某些环境下, 还需要实现多种情况下执行同一个动作的效果, 亦即多个case标号对应一条语句。 【示例8】SwitchTest1.java 比如遇上经济危机, 要节省过日子, 对上面的减把计划进行修改, 代码如下所示。 import java.util.Scanner; /** * 下面是一个膳食减肥计划 */ public class SwitchTest1 { public s
34、tatic void main(String[] args) { //用switch结构来实现一个减肥计划 System.out.println("请您输入星期数字: "); Scanner input=new Scanner(System.in); int num=input.nextInt(); switch(num){ case 1:case 2: System.out.println("小白菜"); break;
35、 case 3:case 4: System.out.println("方便面"); break; case 5:case 6: System.out.println("牛肉"); break; default: System.out.println("什么也不吃"); break; } } } 输出结果: 请您输入星期数字
36、 6 牛肉 switch语句中最多只能有一个default标号。 1.4 经验之谈——switch结构常见错误的分析与处理 编程初学者使用switch结构时经常会出现的一些错误, 下面将常见的一些错误提出来供读者参考。 常见错误1: 缺少break语句 错误代码片段如下: int mingCi = 1; switch (mingCi){ case 1: System.out.println("出任武林盟主"); case 2: System.out.println("出任武当掌门"); case 3: System.out.prin
37、tln("出任峨嵋掌门"); default: System.out.println("被逐出师门"); } 输出结果为: 出任武林盟主 出任武当掌门 出任峨嵋掌门 被逐出师门 错误分析: 在switch结构中, 每一个case语句块后面如果不写break语句, switch就会直接往下面的case语句块运行, 直到遇到break语句为止。上面的代码应该在每个case语句后面都加上break语句。 常见错误2: case语句后面常量相同 错误代码片段如下: int mingCi = 1; switch (mingCi){ case 1: Sys
38、tem.out.println("出任武林盟主"); case 2: System.out.println("出任武当掌门"); case 2: // 代码错误, case语句后面的常量值不能相同 System.out.println("出任峨嵋掌门"); default: System.out.println("被逐出师门"); } 上面的代码有两个case2, 当计算机选择分支的时候不能判定是哪一个, 因而要将它们后面的常量改成不重复的数。 常见错误3: case语句后接常量错误 错误代码片段如下: String day = "星期一";
39、 switch (day){ case "星期一": System.out.println("星期一: 青菜 "); break; case "星期二": System.out.println("星期二: 鱼 "); break; default: } 上面代码中, case语句后面接的常量值只能是byte、 short、 int、 char类型的值, 不能是其它类型的值。 1.5 switch和多重if结构比较 switch和多重if结构有很多相同之处, 也有不同之处。 (1) 相同点: 都能够实现多分支结构。 (2) 不同点:
40、 switch结构只能处理等值的条件判断, 且条件是整型变量或字符变量的等值判断, 一般适合分支多于5个以上的情况; 多重if结构特别适合某个变量处于某个区间时的情况, 如a>60&&a<=80。 二、 循环语句 循 环 语 句 循环语句的功能是在循环条件满足的情况下, 重复执行特定代码。循环语句分类主要有while循环、 do…while循环和for循环三类。 Java中循环结构需满足以下三个条件。 l 要初始化循环变量, 如int i=0。 l 要有判断循环体是否结束的条件表示式, 如: i<=100。 l 要有改变判断条件表示式值的语句, 如: ”i++;”。
41、 读者只要记住这三个条件的三个关键字, 理解并学会运用, 循环语句就很容易掌握了。这三个关键字是”初”、 ”判”、 ”变”, 分别对应上面的三个条件。 1. 为什么需要循环 如果有这样一个问题需要经过程序来解决, 有一天你的女朋友要你对她说一百遍”我喜欢你”, 如果按照以往的程序只能在main方法中写入下面的代码片段。 System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.printl
42、n("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); 这样写一百遍是很麻烦的事情。 2. 什么是循环 生活中的循环有很多, 如图3.9所示。 生活中的循环一般是经过循环条件来执行循环操作的。例如打印机打印50份试卷就是循环条件。Java语言是怎么处理循环这样的问题的呢? 下面将做详细讲解。 (a) 打印50份试卷 (b) 10000米赛跑 (c) 旋转的车轮 图3.9 生活中的循环 2.1 while循环 1. 什么是while循环 while
43、即当……的时候, 也就是当满足条件时就循环执行指定的代码。 2. while循环的语法 while (expression) { 语句; } 其中expression也只能是boolean或Boolean类型的, 它的值将首先被计算机出来, 若值为true, 则执行其后面的语句, 一旦语句执行完毕, expression的值将会被重新计算, 如果还是为true, 语句将会再次执行, 这样一直重复下去, 直至expression的值为false为止。 下面的程序While.java经过while循环解决了说一百遍”我喜欢你”的问题。代码如下: public class W
44、hile{ /** * 经过while循环来解决你女朋友要你对她说一百遍"我喜欢你" */ public static void main(String[] args) { int i=1;//1.初始化 while (i <= 100) {// 2.判断条件 System.out.println("我喜欢你我已经说了" + i + "遍"); i++;// 3.更改变量值 } } } 输出结果为: 我喜欢你我已经说了1遍
45、我喜欢你我已经说了2遍 我喜欢你我已经说了3遍 我喜欢你我已经说了4遍 我喜欢你我已经说了5遍 我喜欢你我已经说了6遍 我喜欢你我已经说了7遍 我喜欢你我已经说了8遍 我喜欢你我已经说了9遍 …… 我喜欢你我已经说了100遍 while循环的特点是: 先判断, 再执行。其具体执行流程如图3.10所示。 图1.10 while循环的流程图 3. 怎么使用while循环 简单的while循环用法就如上例所示, 经过变量的自增或自减来更新值。其实循环条件除了预先设定之外, 还能够由输入者自行控制, 从而形成良好的人机互动效果。 【示例13】WhileTest2.ja
46、va Java编程要经常练习才能获得较好的学习效果。下面是老师监督学生加强编程练习, 学生经过询问老师, 老师看结果后判断学生练习好了没有。这也是循环的一种方式。 import java.util.*; public class WhileTest2 { /** * 老师要学生加强练习, 经过询问老师, 让老师看结果后判断练习好了没有。 */ public static void main(String[] args) { Scanner input = new Scanner(System.in); Sy
47、stem.out.println("老师, 我练得怎么样? Y/N"); String result; result = input.next();// 由老师来输入Y(Yes)或N(No) //1.初始化变量 while (!result.equalsIgnoreCase("Y")) {// 2.判断变量 System.out.println("继续练程序"); System.out.println("老师, 我练得怎么样? 您回答一下: Y/N"); res
48、ult = input.next();// 3.更新变量值 } System.out.println("练习结束! "); } } String字符串对象的equalsIgnoreCase方法表示忽略比较对象的大小写。有关String的相关用法在后面的章节有详细的讲解。 输出结果为: 老师, 我练得怎么样? Y/N N 继续练程序 老师, 我练得怎么样? 您回答一下: Y/N N 继续练程序 老师, 我练得怎么样? 您回答一下: Y/N Y 练习结束! 2.2 经验之谈——while循环的常见错误 常见错误1:
49、 缺少改变循环体判断条件表示式值的语句 错误代码片段如下: public class Test { /* 打印4次"欢迎----学员" */ public static void main(String [ ] args){ int i = 0; while (i < 4 ){ System.out.println("欢迎----学员"); } } } 永远输出: 欢迎----学员 欢迎----学员 欢迎----学员 欢迎----学员 欢迎----学员
50、 M 上面代码将形成死循环, 应该在while执行体中加入改变判断条件表示式值的语句, 如”i++;”。 永远都不会退出的循环称为死循环。如果不小心形成了死循环, 请用”CTRL+C”退出。 常见错误2: 丢失等号 错误代码片段如下: public class Test1 { /* 打印4次"欢迎----学员" */ public static void main(String [ ] args){ int i= 1; while (i < 4){// 题意要求循环4次, 判断表示式只循环3次, 应该改为i<=4






