1、计数器循环控制法

用计数器控制的循环结构,非常适合于在循环执行之前就知道要重复执行次数的那些情况。下面我们用一个示例程序来加以说明。
我们的程序要求用户输入10个整数,每次输入一个数字,之后求出其平均值并输出结果。由于使用计数器来控制输入循环,所以必须有一个变量来充当计数器,在这里是变量counter,我们用它来控制输入语句的执行次数。一旦计数器超过10,便停止循环。此外,我们还需要一个变量来累计输入的整数的值,这里是变量total,我们将其初始化为0。代码如下所示:

# -*- coding: cp936 -*-
#让用户输入十个整数,然后计算并输出其平均值

#定义并初始化变量
total = 0
counter = 1

现在,我们需要让用户输入十个整数。我们这里用一个while语句让raw_input)函数循环执行十次。这里循环语句中的表达式为:counter <= 10,因为counter的初始值为1,而循环体中使循环趋向于结束的语句是:counter = counter + 1,所以循环体将执行十次。

每轮循环中,raw_input)函数会输出“请输入一个整数:”,提示用户进行输入。当用户输入后,int)函数马上将输入的内容转换为一个整数,并累加到变量total中。我们注意到,这三个动作我们是用一条语句完成的。代码如下所示:

#让用户输入10个整数,并将其累加

while counter <= 10:
    total = total + int(raw_input('请输入一个整数:'))  #该语句执行了三个动作
    counter = counter + 1

该程序的最后部分是计算并打印计算结果。我们首先将累加的结果转换为浮点数,然后除以10,并用打印语句进行输出。代码如下所示:

#计算并输出平均数
   print "您输入的十个整数的平均值是:", float(total)/10

注意,有时候初学者喜欢用计数器counter来除以累加值total来计算平均值,这是不对的。因为当用户输入第十个整数时,counter的值为10,表达式值为真,所以循环体继续执行。当执行了循环体的最后一条语句,即

counter = counter + 1

之后,counter的值会变成11,再次判断表达式,这时表达式的值为假,所以退出循环。也就是说,当循环退出时,counter的值是11,而不是10。所以,用它来求10个整数的平均值显然是错误的。

当我们在IDEL中运行该程序时,结果如下所示:

Python

图4 : 计数器循环控制法示例程序运行结果

2、信号值循环控制法

上面介绍的计数器循环控制法,非常适合于事先知道循环次数的情况,但是很多时候我们无法事先知道具体的循环次数,这时该怎么办呢?这就要用到下面介绍的信号值循环控制法了。下面举例说明。

假设我们要设计一个小程序来计算公司各科室工作人员的平均年龄。我们依旧用一个循环语句来录入各人员的年龄,但是各科室人员数不一,因而计数器循环控制法显然是不合适的,所以我们要使用一种更加灵活的循环控制方法:信号值循环控制法。所谓信号值,就是一个特殊值,它用来指示循环结束。就本例而言,我们可以不断的输入科室人员的年龄,直到输入完毕,这时就可以输入我们的信号值,告诉程序我们的输入工作结束了。

因为信号值跟正常的数据一起输入,所以选择信号值时一定要仔细,以防止与正常的值相混淆。不过就本例而言,因为政府禁止企事业雇佣童工,所以科室人员的年龄肯定大于等于18岁,为保险起见,我们选择1作为我们的信号值,这绝对不会跟正常的科室人员的年龄相混淆。

代码如下所示:

# -*- coding: cp936 -*-
#计算科室人员平均年龄

#定义并初始化变量
  total = 0    #年龄之和
  counter = 0    #人员数量

#让用户输入年龄,并将用户输入内容转换为整数
  age = int(raw_input('请输入科室人员的年龄,1表示输入结束:'))

#遇到1表示输入结束
  while age != 1:
      total = total + age
      counter = counter + 1
      age = int(raw_input('请输入科室人员的年龄,1表示输入结束:'))

#计算并输出平均数
  if counter != 0:
      print "科室人员的平均年龄是:", float(total)/counter
  else:
      print "没有输入任何科室人员的年龄!"

现在我们对程序代码作相应的解释。首先我们定义了两个变量,其中变量total用于存放年龄累加值;变量counter用于存放已经录入的人员数。很明显,在输入人员的年龄之前,这两个变量都应该初始化为0。代码如下所示:

#定义并初始化变量
  total = 0    #年龄之和
  counter = 0    #人员数量

接下来,在进入循环之前,程序要求用户输入一个职员的年龄,如下所示:

#让用户输入年龄,并将用户输入内容转换为整数
age = int(raw_input('请输入科室人员的年龄,1表示输入结束:'))

而这个年龄决定了是否进入循环结构。如果用户的第一个输入是个信号值的话,while语句中的表达式的值为假,那么程序会跳过这个循环结构,直接执行循环语句后面的结构。而在循环结构之后,正好是一个选择结构:

#计算并输出平均数
if counter != 0:
    print "科室人员的平均年龄是:", float(total)/counter
else:
    print "没有输入任何科室人员的年龄!"

因为我们尚未输入任何人员的年龄,所以此时conuter变量的值为0,那么肯定会执行上述选择结构中else子句的内嵌语句,即打印“没有输入任何科室人员的年龄!”。

如果我们的第一条输入语句得到的不是信号值,那么程序就会进入循环:

#遇到1表示输入结束
while age != 1:
    total = total + age
    counter = counter + 1
    age = int(raw_input('请输入科室人员的年龄,1表示输入结束:'))

在循环体中,将输入的年龄累加到变量total中,并将计数器加1,接着执行循环体中的最后一条语句:要求用户再次输入一个人的年龄。需要注意的是,我们是在对while结构的条件进行判断之前来请求下一个值,这样就能先判断刚才输入的值是否是信号值,再对该值进行处理。当循环体中的语句执行一遍后,程序会重新检测while语句的条件表达式,以决定是否再次执行while结构的循环体。换句话说,如果刚才输入的值是信号值,则退出循环结构;否则,继续重复执行循环体。

只要循环体执行一次,那么当退出循环后,计数人员数量的变量counter的值肯定大于0,所以这时就会执行最后面的选择结构中的if子句内嵌的语句体,即计算平均年龄并打印输出。

当我们在IDEL中运行该程序时,结果如下所示:

Python

图5  :信号值循环控制法示例程序运行结果


评论关闭