
3.3 循环结构

视频讲解
在程序设计中,有时需要反复执行一段相同的代码,直到满足一定条件为止。为简化程序结构,与其他任何计算机语言一样,Java也提供了循环结构。一个循环结构一般包含4部分内容。
(1)初始化部分(initialization):用来设置循环控制的一些初始条件,如设置计数器等。
(2)循环体部分(body):这是反复执行的一段代码,可以是单一的一条语句,也可以是复合语句(代码块)。
(3)迭代部分(iteration):用来修改循环控制条件,常常在本次循环结束,下一次循环开始前执行,例如,使计数器递增或递减。
(4)判断部分(termination):也称终止部分。是一个关系表达式或布尔逻辑表达式,其值用来判断是否满足循环终止条件。每执行一次循环都要对该表达式求值。
Java中提供了3种循环结构:for循环、while循环和do-while循环。
3.3.1 for语句
当事先知道循环会被重复执行多少次时,可以选择for循环结构。for循环的一般语法格式如下:
for (初始化;条件;变化的步长) { 语句; }
for循环结构的流程如图3-5所示。

图3-5 for循环结构流程图
具体说明如下:
(1)for循环执行时,首先执行初始化操作,然后判断条件是否为真,如果满足,则执行循环体中的语句,最后执行改变步长部分。完成一次循环后,重新判断条件。
(2)可以在for循环的初始化部分声明一个变量,它的作用域为整个for循环。
(3)for循环通常用于循环次数确定的情况,但也可以根据循环条件用于循环次数不确定的情况。
(4)在初始化部分和步长部分可以使用逗号语句来进行多个操作,逗号语句是用逗号分隔的语句序列。例如:
for (a=1, b=4; a<b; a++, b--) { System.out.println("a="+a); System.out.println("b="+b); }
知识提示 在C/C++中,逗号是一个运算符,能在任何有效的表达式中使用。但是在Java中,逗号仅仅是一个分隔符,只适用于for循环。
(5)初始化、终止以及步长部分都可以为空语句(但分号不能省),三者均为空的时候,相当于一个无限循环。
【例3-6】 for循环举例。
//文件名:ForTick.java public class ForTick { public static void main(String args[]){ int n; for (n=10; n>0; n--) System.out.println("tick"+n); } }
3.3.2 案例分析:计算平均成绩1
1.案例描述
编写程序实现以下功能,以学生的各科成绩为输入,利用for循环计算其平均成绩。
2.案例分析
根据案例描述中的信息,本案例创建一个程序,求学生各科的平均成绩。不妨假设,需计算5个科目的平均成绩,利用for循环实现,每次循环输入一个数值,先计算成绩总和,最后除以科目数5,得到各科平均成绩。
3.案例实现
本例的代码如下:
//文件名:AverageGrade.java import java.io.*; public class AverageGrade { public static void main(String args[]) throws IOException{ int score, sum; float avg; sum=0; InputStreamReader ir; BufferedReader in; for (int i=0; i<5; i++) { //下面7行语句的作用是从键盘输入score的值 ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input score is:"); String s=in.readLine(); score=Integer.parseInt(s); sum=sum+score; } avg=sum/5; System.out.println("Average="+avg); } }
4.归纳与提高
本例中,应掌握for循环的定义的形式和方法。在使用for循环时,通常循环次数已知。
3.3.3 while语句
当不清楚循环会被重复执行多少次时,可以选择while循环和do-while循环。
while语句首先测试一个表达式,如果表达式的值为真,则会重复执行下面的语句体,直到表达式的值为假。其一般语法格式如下:
while(表达式) { 语句体; }
表达式可以是任何表达式。如果语句体内只有一条语句,花括号可省略。
while循环首先计算表达式的值,当值为真时才去执行循环体中的语句;若首次表达式的值为假,则语句体一次都不会被执行。
while循环结构的流程图如图3-6所示。

图3-6 while循环结构流程图
【例3-7】 求自然数1~10之和。
//文件名:NumAdd.java public class NumAdd { static final int MAX_INDEX=10; //定义静态常量 public static void main(String args[]) { int n=MAX_INDEX; int sum=0; while (n>0) { //n>0时,累加求和;否则结束循环 sum+=n; //将自然数n的值加到sum中 n--; //n的值减1成为下一个自然数 } System.out.println("1+2+...+10="+sum); //输出和 } }
程序的运行结果如下:
1+2+...+10=55
3.3.4 案例分析:计算平均成绩2
1.案例描述
创建一个程序,实现计算学生各科成绩的平均成绩。要求利用while循环实现此案例。
2.案例分析
根据案例描述中的信息,本案例需利用while循环实现,当前学生的科目总数未知,即循环输入数据的次数未知,故需设定一个循环的结束条件,即在输入最后一科成绩后,输入一个特殊字符$,以此作为输入数据的结束符。同时,须在循环内设定一个计数器count,每输入一科成绩,计数器值加1。结束循环后,各科成绩的总分存放在sum变量中,科目总数存放在计数器count中,利用sum/count即可计算出学生的平均成绩。
3.案例实现
本例的代码如下:
//文件名:AverageGrade2.java import java.io.*; public class AverageGrade2{ public static void main(String args[]) throws IOException{ int score=0, sum, count=0; String score =null; float avg; sum=0; InputStreamReader ir; BufferedReader in; ir=newInputStreamReader(System.in); in=newBufferedReader(ir); System.out.println("Input score is:"); score =in.readLine(); while (! score.equals('$')){ //下面7行语句的作用是从键盘输入score的值 score=Integer.parseInt(score); sum=sum+score; count++; System.out.println("Input score is:"); score =in.readLine(); } if(count! =0){ avg=sum/count; System.out.println("Average="+avg); }else System.out.println("No numbers here"); } }
4.归纳与提高
本例中,应掌握while循环的定义形式和方法。在使用while循环时,由于循环次数未知,我们需在while循环的条件处设置退出循环的条件,在这一点上与for循环是不同的。在此例中,需要熟悉两种循环语句使用上的区别。
3.3.5 do-while语句
while循环从顶部开始测试,因此,若初始条件为假,则循环体中的代码永远也得不到执行。如果想让循环体至少执行一次,则需要在循环结构底部进行循环条件测试。do-while语句可以实现“直到型”循环,其一般语法格式如下:
do { 语句体; } while (表达式);
do-while循环结构的流程如图3-7所示。关于do-while循环结构有以下几点说明:

图3-7 do-while循环结构的流程示意图
(1)do-while结构首先执行循环体,然后终止条件,若结果为true,则循环执行花括号中的语句或代码块,直到布尔表达式的结果为false。
(2)与while结构不同的是,do-while结构的循环体至少被执行一次,这是“直到型”循环的特点。
【例3-8】 输入一个正整数,将各位数字反转后输出。
分析:将一正整数反转输出,即先输出个位,然后输出十位、百位……可采用不断除以10取余数的方法,直到商数等于0为止,是一个循环过程。由于无论整数是几,至少要输出一个个位数,因此可以使用do-while循环结构。
//文件名:IntTurn.java import java.io.*; public class IntTurn{ public static void main(String args[]) throws IOException { int x; //x用来存放由键盘键入的正整数 //下面7行语句的作用是从键盘输入x的值 InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input x is:"); String s=in.readLine(); x=Integer.parseInt(s); //下面用do-while循环结构进行反转输出 do{ System.out.print(x%10); //除以10取余数输出 x/=10; //将x刷新为除以10的商 }while (x! =0); //如x(商数)为0则结束循环 System.out.print("\n"); } }
程序的运行结果如下:
Input x is: 1893 3981