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