摘要
通过本章的学习,读者应该能够使用if-then-else语句、while语句、for语句、switch语句控制Java程序的流程,能够在最合适使用的时候,使用它们。并且知道它们与其它程序设计语言的流程控制之间的不同。
--------------------------------------------------------------------------------
本章目标:
通过本章的学习,读者应该能够使用if-then-else语句、while语句、for语句、switch语句控制Java程序的流程,能够在最合适使用的时候,使用它们。并且知道它们与其它程序设计语言的流程控制之间的不同。
7.1 分支结构
实例说明
1.首先,我们使用文字编辑软件输入下源程序。
源程序:testBranch1.java
public class testBranch1
{
public static void main(String args[])
{
int myScore=96;
if (myScore >= 90)
System.out.println("Very Good!”);
if (myScore < 90)
System.out.println(“make great efforts!”);
}
}
注重:
假如在编译过程中,出现了错误,请检查if(myScore>=90)和if(MyScore<90)两个表达式后面是否多加了分号,假如多加上,就将其删掉。在此不答应加上分号。
2.使用javac编译这个程序,假如正确完成编译,将在当前目录下生成一个名为testBranch1.class的文件;
3.最后输入以下命令,运行这个程序:
c:javastudy> java testBranch1
执行这个程序,将输出一些信息,如下图所示:
图7-1 程序testBranch1.java的输出
传授新知
我们先试着阅读一下这个程序:这个程序可以分为三段:
1)
int myScore=96;
int myScore=96:
定义一个变量,名为myScore(应该代表“我的成绩”),值为96。哦,就是说我的成绩是96分;
2)
if (myScore >= 90)
System.out.println("Very Good!”);
这种格式的语句,我们在前面并没有碰到过,在此,我们就试着读一读。if,就是假如的意思。也就是说if(myScore>=90)的意思“假如myScore大于或等于90”。
那么当myScope大于或等于90就如何呢?System.out.println(“Very Good!”);做出了回答,向屏幕输出“Very Good!”这一祝贺语。
这也就是为什么在if(myScore>=90)的后面不能加上分号的原因?由于分号代表一个语句的结束,而说到if(myScore>=90)时,并没有说完呀。
一些提示:
在上面的程序段中System.out.println(“Very Good!”);向内缩格,是为了大家一眼就看出,它从属于上面的if语句。这是一种良好的编码习惯,但在语法是却并不是主要的。
这两句程序最终实现了,当“我的成绩”高于90分时,就夸奖我“Very Good!”。
3)
if (myScore < 90)
System.out.println(“make great efforts!”);
通过对上一条语句的分析,我想大家都应该能够十分轻易地知道这条语句就是要表达:假如“我的成绩”小于90分,就鼓励我“make great efforts!”(加油,继续努力!)。
好,我们现在来分析一下程序的输出结果:只输出了“Very Good!”,也就是说System.out.println(“make great efforts!”);并没有执行!为什么没有执行呀?因为myScope比90大呀(这样表达式myScore < 90的值就是false了)。
到此为止,我们就算摸清了if语句的脾气了,如下图所示:
图7-2 基本if语句控制流示意图
1) 首先判定if语句中的逻辑表达式(这个逻辑表达式的值是boolean型);
2) 假如是true,则执行if语句后部分的语句,完成某些操作;
3) 而假如是false,就不执行if语句后部分的语句,继续执行if语句后面的程序。
if语句就是Java语言中提供的分支结构的流程控制语句。基本if语句的格式为:
if (逻辑表达式) 语句;
在本例中,当逻辑表达式的值为true时要执行的语句只有一条,假如有多条时,应该使用“{}”把它们围起来:
if (逻辑表达式)
{
语句1;
语句2;
……
}
有时,在我们的程序中,会需要使用到如下图所示的流程控制:
图7-3 更复杂的分支结构流程控制语句
实例说明
假如使用后一种结构的if语句,会使得程序的流程更加清楚:
1.首先,我们使用文字编辑软件输入下源程序。
源程序:testBranch2.java
public class testBranch2
{
public static void main(String args[])
{
int myScore=96;
if (myScore >= 90)
{
System.out.println("Very Good!”);
}
else
{
System.out.println(“make great efforts!”);
}
}
}
2.使用javac编译这个程序,并运行这个程序。我们将发现这个程序的输出是与上一个程序testBranch1的输出完全一样的:
图7-4 程序testBranch2.java的输出
传授新知
大家可以看到,这个程序就可读了,假如myScore(“我的成绩”)大于或等于90,那么就打印“Very Good!”,否则(也就是说myScore不大于或等于90,即小于90)就打印“make great efforts!”。
从这个例子中,我们可以总结出if-then-else结构的if语句格式:
if (逻辑表达式)
{
语句;
}
else
{
语句;
}
在本节中,我们学习了流程控制中最基本的一种:分支结构。在Java语言中,是使用if语句来实现的。
自测练习
1) 使用if-then-else语句,_______使用缩排。
a.不能 b.建议 c.必须 d.有时必须
2) 阅读以下程序,回答问题:
if (myScore >= 90)
System.out.println("Congratulate to you!”);
System.out.println("You score is very good!”);
if (myScore < 90)
System.out.println(“make great efforts!”);
假如myScore=96,则程序将输出什么?
____________________________________________________________________
____________________________________________________________________
假如mySore=50,则程序将输出什么?
____________________________________________________________________
____________________________________________________________________
你认为这符合逻辑吗,假如不合逻辑该如何修改?
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
3)写一个程序段,判定成绩(myScope),若小于60,则输出bad;若大于60,则输出middle;若大于80,就输出good;若大于90时,输出better。
练习答案
1)b 采用缩排能够使程序结构更加清楚,但这只是一个建议。
2)§ 假如myScope=96,程序将输出:
Congratulate to you!
You score is very good!
§ 假如myScope=50,程序将输出:
You score is very good!
make great efforts!
§ 当成绩为50分时,程序还说“you score is very good!”,这说明这个程序不符合逻辑。应该改为:
if (myScore >= 90)
{
System.out.println("Congratulate to you!”);
System.out.println("You score is very good!”);
}
if (myScore < 90)
System.out.println(“make great efforts!”);
这是因为,if(myScore>=90)这个语句假如是真的话,应该执行两个语句,而假如不使用“{}”将它们围起来,则第2个语句就不属于if(myScore>=90)了。这样,程序就不管在什么情况下都会执行这一句。
3)这个程序有多种写法,下面列出了其中的一种:
if (myScore >= 90)
System.out.println(“better”);
if ((myScore >= 80)&&(myScore<90)
System.out.println(“good”);
if ((myScore >= 60)&&(myScore<80)
{
System.out.println(“middle”);
}
else
{
System.out.println(“bad”);
}
7.2 循环结构
7.2.1 while循环
实例说明
1.首先,我们使用文字编辑软件输入下源程序。
源程序:testLoop1.java
public class testLoop1
{
public static void main(String args[])
{
int counterLoop=8;
while (counterLoop > 0)
{
System.out.println(counterLoop);
CounterLoop - = 1;
}
}
}
2.使用javac编译这个程序,并运行这个程序。我们将得到如下的输出结果:
图7-5 程序testLoop1.java的输出
传授新知
按惯例,我们先试着阅读一下程序:
1)
int counterLoop=8;
int counterLoop=8:
定义一个变量,名为counterLoop(应该代表“循环的次数”),值为8。
2)
while (counterLoop > 0)
{
System.out.println(counterLoop);
counterLoop - = 1;
}
在这里,我们碰到了一个前面没有碰到过的语句:while,我们就试着分析一下:
while这个英语单词表示的意思是“当…时候”,在这里,应该就是表示“当counterLoop大于0的时候”。当它大于0时,怎么样呢?我们发现在while语句后跟着用“{}”围起来的语句。对,就是说当counterLoop大于0时,就执行后面用“{}”围起来的语句。
那么我们再看一下“{}”围起来的语句完成了什么工作:
1) 首先将counterLoop的值输出到屏幕上;
2) 然后将counterLoop的值减去1。
一些提示:
想想为什么要将counterLoop的值减去1呢?其实很简单,假如没有在循环中修改counterLoop的值,那么表达式“counterLoop>0”的值就将永远为真,循环也就不会结束。
下图形象深刻地说明了while循环的执行流程:
图7-6 while循环控制流程示意图
1) 首先判定while语句中的逻辑表达式(这个逻辑表达式的值是boolean型);
2) 假如是false,则不执行用“{}”围起来的循环体,直接执行后面的程序;
3) 假如是true,则执行用“{}”围起来的循环体语句,然后再回到第一步。
while语句是Java语言中提供的一种循环结构的流程控制语句。它的语法格式为:
while (逻辑表达式)
{
语句1;
语句2;
……
}
7.2.2 for循环
实例说明
1.与前面的例子一样,我们首先使用文字编辑软件输入下源程序。
源程序:testLoop2.java
public class testLoop2
{
public static void main(String args[])
{
for (int counterLoop=8;counterLoop > 0;counterLoop--)
{
System.out.println(counterLoop);
}
}
}
2.使用javac编译这个程序,并运行这个程序。我们将得到如下的输出结果:
图7-7 程序testLoop2.java的输出
传授新知
我们发现这个程序与上一个程序的输出完全相同。其实,这个程序就是使用另一个循环语句来实现相同功能的程序。
现在,我们来看一下这个程序中主体部分:
for (int counterLoop=8;counterLoop > 0;counterLoop--)
{
System.out.println(counterLoop);
}
for,为了?因为?至于?我们一直现用的通过英文单词的中文含义来理解程序的方法在这里不那么管用了!
一些提示:
其实还是有一个近似的解释,那就是“适合于”,也就是说,满足了括号里面给出的条件。
而for后面括弧内的内容则更是令人费解。因此我们还是参阅相关手册,再理解它吧:
for语句是Java语言中提供的另一种循环语句,它的语法结构如下:
for (循环初始值;循环结束条件表达式;修改表达式)
{
循环体语句;
……
}
也就是说,for语句中将循环变量初始的定义、循环变量的修改,以及循环结束条件都收集在一起,放在一块了。按惯例,我们还是对它进行图解:
图7-8 for循环语句控制流程示意图
结合这个控制流程,我们一起来分析一下这个程序过程:
1) 首先,定义了一个名为counterLoop的整型变量,值为0;
2) 然后检查counterLoop的值是否大于0(循环结束条件)?
3) 假如为false,则跳出循环,接着执行后面的程序(在本程序中,后面没有程序段,因此就退出了程序);
4) 假如为true,则执行循环体(在本程序中为打印出counterLoop的值);
5) 执行完循环体后,执行修改表达式,修改循环变量counterLoop的值,再转到第二步,检查counterLoop的值是否大于0。
自测练习
1) 以下不是循环语句的是_____________。
a. while b.if c.for
2) 在有循环结构的程序中,应该注重:___________。
a.循环体中的程序不应太长 b.避免条件表达式永远为真值
c.能够使用while循环,尽量使用while循环。
阅读以下代码,回答问题3)、4)、5):
int x=250;
int y=0;
while (x>0)
{
y++;
x-=5;
}
3) 完成了这个循环语句后,y的值将变成:_________。
a.0 b.250 c.50 d.51
4) 完成了这个循环语句后,x的值将变成:_________。
a.0 b.250 c.50 d.51
5) 在这个循环中,循环体内的语句共执行了________次,循环判定了_____次。
a.0 b.250 c.50 d.51
阅读以下代码,回答问题6)、7):
for (int x=10;x>0;x--)
{
System.out.println(i);
}
6)在这段代码中,每一次循环时,首先执行___________语句。
a.int x=10 b. x>0 c.x-- d.System.out.println(i)
7)那么每一次循环中最后执行的是______________语句。
a.int x=10 b. x>0 c.x-- d.System.out.println(i)
8)假如将testLoop1.java程序中的“counterLoop-=1;”这一行程序改为:
CounterLoop+=1;
那么这个程序将产生什么输出呢?
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
9)现有一个如下的数组:
String weeks[ ] = {“Monday”,”Tuesday”,”Wednesday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
请分别使用while循环和for循环,写一个程序将它们的值打印到屏幕上。
a.使用While语句:
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
b.使用for语句:
_____________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
10)在下列程序片段中,你认为变量condition是________型的。你认为这个程序存在什么问题?
a.int型 b.boolean型 c.float型 d.String型
while (condition)
{
y++;
x-=5;
}
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
11)判定以下命题是否正确,假如不正确,请举例说明。
for循环都能够改写成while循环……………………………………………()
while循环都能够改写成for循环……………………………………………()
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
练习答案
1)b if语句是Java语言中的分支结构流控制语句。
2)b 假如循环语句中,控制循环结构的条件表达式永远为真值的话,整个程序将陷入死循环。这是最重要的问题。
3)c x每减一次5,y就累加1,x从250减到0,得减50次,因此y最终值为50。
4)a 只要x大于0,循环就不会结束, 250每次减去5,当x不大于0时,值为0。
5)c d 循环体与y的值相等,50次;而要确定不执行循环体时,还要做一次判定,所以,共判定了51次。
6) b 每一次循环,都是以执行循环条件表达式开始的,因此是x>0
7) c 在for循环结束的最后一句,应该执行修改表达式,修改循环变量的值。
8) 按这样的修改后,程序就会从8开始打印,9、10、11……,直到231-1。为什么会这样呢?这是因为:
§ counterLoop的初值是8,大于0,因此执行循环体;
§ 在循环体中,又将counterLoop加上了1,得到了9;
§ 这样9显然也是大于0,再次执行循环体。
这样,counterLoop的值越来越大,也就再次运行循环体。
那么,为什么到了231-1就结束了呢?这是因为,int的最大值是231-1,超过这个数以后,就溢出,而溢出就小于0,循环结束。
这个程序就算是死循环了,循环能够结束,只是因为数字溢出。
9) 使用while循环:
public class whileLianxi
{
String weeks[ ] = {“Monday”,”Tuesday”,”Wednsday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
int x=0;
public static void main(String args[])
{
while(x<7)
{
System.out.println(weeks[x]);
x++;
}
}
}
而假如使用for语句来实现的话,就是:
public class forLianxi
{
String weeks[ ] = {“Monday”,”Tuesday”,”Wednsday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
int x;
public static void main(String args[])
{
for(x=0;x<7;x++)
{
System.out.println(weeks[x]);
}
}
}
10)b 能够做为条件表达式的变量,只能是boolean型的。
在这个程序中,循环体内并未改变condition的值。假如condition是true的话,则这个循环将永远不会结束;而假如condition是fasle的话,还好,只是不执行这个循环体。
11)for循环都能够改写成while循环……………………………………………(对)
while循环都能够改写成for循环……………………………………………(错)
例如,上一题中的while循环就无法改写成为for循环。
while (condition)
{
y++;
x-=5;
}
7.3 多分支结构
实例说明
在前面的章节中,我们学习过了使用if语句的分支结构,那么多分支结构又有什么作用呢?下面,我们思考一下如何完成这样一个任务:
我们要构造一个程序,让它判定我的成绩myScope,假如:
1) 假如大于90分,打印“Excellent”(优秀);
2) 假如大于80分,小于90分,打印“Good”(很好);
3) 假如大于70分,小于80分,打印“Average”(一般);
4) 假如大于60分,小于70分,打印“Pool”(差);
5) 假如小于60分,打印“Failure”(极差)。
假如要使用学习过的if语句来完成,将会十分费劲,程序也十分难懂。下面我们做一个实践:
1.首先,我们使用文字编辑软件输入下源程序。
源程序:multiCass.java
public class multiCase
{
public static void main(String args[])
{
int myScope=89;
int grade=myScope/10;
switch(grade)
{
case 10:
case 9:
System.out.println(“Excellent!”);
break;
case 8:
System.out.println(“Good!”);
break;
case 7:
System.out.println(“Average!”);
break;
case 6:
System.out.println(“Pool”);
break;
default:
System.out.println(“Failure!”);
}
}
}
2.使用javac编译这个程序,并运行这个程序。我们将得到如下的输出结果:
图7-9 程序multiCass.java的输出
传授新知
这个程序比较长,不过还是很好理解的,它可以分成两个逻辑块:
int myScope=89;
int grade=myScope/10;
首先,定义了变量myScope,用来存放我的成绩;然后定义了一个整型变量grade,它的值是myScope的十分之一。
一些提示:
在这里涉及了一个编程的技巧,我们将grade赋值为myScope/10,这样,我们就可以得到myScope的十位上的数(由于是整型变量,所以不会有小数),通过这个十位上的数就可以简单地得到它们的分数段。
接下来,就是本节的主角,多分支结构控制语句switch-case:
switch(grade)
{
case 10:
case 9:
System.out.println(“Excellent!”);
break;
case 8:
System.out.println(“Good!”);
break;
case 7:
System.out.println(“Average!”);
break;
case 6:
System.out.println(“Pool”);
break;
default:
System.out.println(“Failure!”);
}
switch,开关,我们定义了一个grade开关,然后根据它的状态来决定执行什么语句:
1) 当(case)开关值为10和9时,则执行语句:
System.out.println(“Excellent!”);
2) 而当开关值为8时,则执行语句:
System.out.println(“Good!”);
3) 而当开关值为7时,则执行语句:
System.out.println(“Average!”);
4) 当开关值为6时,则执行语句:
System.out.println(“Pool!”);
5) 假如开关值为其它的话,就视为default,执行语句:
System.out.println(“Failure!”);
注重,在每种case之间,都使用了break语句,break,在英文中是中断的意思,也就是说,执行到这里中断多分支结构,跳出switch-case语句。
而在本程序中,由于mySope=89,由此计算出grade值为8,因此执行case 8:后面的语句:System.out.println(”Good!”);这样就在屏幕上打印出了“Good!”。接着执行到break语句,跳出了switch语句。
Switch-case多分支结构的控制流程如下图所示:
图7-10 switch-case多分支结构控制流程示意图
Switch-case的语法结构如下(在[]内的表示是可选代码):
switch(选择变量)
{
case c1:
[语句]
[break]
case c2:
[语句]
[break]
……
case c1:
[语句]
[break]
[default:]
[语句]
}
在Java语言的多分支结构中,选择变量可以是int型,也可以是char型。而case后面的c1、c2…cn必须是与int型或char型的常量,而不能是变量。Default语句是可选的。
注重,switch语句应使用“{}”围起来。
注重:
假如switch语句找不到匹配的标专而且没有default块,将会产生一个错误。
自测练习
1) switch语句的选择变量可以_______、_________类型的。
a. int b.boolean c.char d.float
2) 用来区别每一个switch分支的保留字是__________。
a.choice b.condition c.case d.break
3) 假如switch语句的选择变量的值与每一个case语句中都不匹配,将使用________选择。
a.any b.default c.none d.other
4) 在switch语句中是可选的语句是___________。
a.switch b.default c.other d.case
5) 根据以下要求,使用switch语句编写程序。
某校使用“A”、“B”、“C”、“D”、“E”来为学生打成绩,请编写一个程序,当:
成绩为A时,打印出“Excellent!”;
成绩为B时,打印出“Good!”;
成绩为C时,打印出“Average!”;
成绩为D时,打印出“Pool!”;
成绩为E时,打印出“Failure!”。
假设本程序用来打印学生甲的成绩情况,而学生甲的成绩“B”存放在变量myScope。
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
练习答案
1)a、c 在Java语言的switch-case语句中,可以使用int或char型变量做选择变量。
2)c 每一个分支,使用case标记出来。
3)b 不匹配时,将查找default。
4)b 在switch-case语句中,switch与case都是必选项,other并不存在于swithc-case语句中,而只有default语句是可选的。
5)程序如下:
public class switchLianxi
{
public static void main(String args[])
{
char myScope=’B’;
switch(myScope)
{
case ‘A’:
System.out.println(“Excellent!”);
break;
case ‘B’:
System.out.println(“Good!”);
break;
case ‘C’:
System.out.println(“Average!”);
break;
case ‘D’:
System.out.println(“Pool”);
break;
case ‘E’:
System.out.println(“Failure”);
}
}
}