Java程序设计与实践教程(第2版)
上QQ阅读APP看书,第一时间看更新

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