第4章 循环结构 程序设计 本章主讲 赵家刚、李俊萩 计算机编程导论
程序设计的3种基本结构 (1)顺序结构(2)选择结构(3)循环结构 顺序结构 —— 是指程序流程按先后顺序执行,只有执行 了前一步,才能执行后一步。例如火车在轨道上行驶,只 有过了上一站点才能到达下一站点。 选择结构 —— 又称分支结构,是指程序流程可以分几条 路径执行。例如在一个十字路口处,可以选择向东、南、 西、北几个方向行走。 循环结构 —— 又称重复结构,是指程序流程重复执行某 一段代码。例如万米跑,围着足球场跑道不停地跑,直到 满足条件时(25圈)才停下来。 计算机编程导论
3种基本结构的流程图 顺序结构 选择结构 循环结构 流程图 流程图 流程图 假 假 真 真 语句A 条件判断 语句A 条件判断 语句B 循环体 真 语句B 顺序结构 流程图 选择结构 流程图 循环结构 流程图 计算机编程导论
4.1循环结构设计问题 【问题4-1】用户输入一个列表,求出列表中所有正偶数之和。 分析:由于不知道用户输入的具体数据及个数,因此需要在循环结构中进行判断和累加。 计算机编程导论
#ques4_1.py li=input('请输入一个列表:') sum=0 for x in li: if x>0 and x%2==0: sum+=x print 'sum=',sum 程序输入及运行结果: 请输入一个列表:[2, 3, 4, -5, 6, 12] sum= 24 计算机编程导论
4.2 循环结构概述 循环结构是一种重复执行的程序结构。实际应用中,常会碰到一些需要重复执行的步骤,如级数求和、统计报表等等。例如: (1)计算 1 + 2 + 3 + … + 100,这是一个级数求和问题,需要重复执行100次,对100个数依次进行累加。 (2)假设1个班级中有n名同学,统计男同学和女同学各有多少名。该问题的求解需要重复执行n次,对每1个同学依次进行判断,同时统计男同学和女同学的人数。 计算机编程导论
4.2 循环结构概述 Python提供了两种基本的循环结构语句——while语句、for语句。 (3)给定2个整数,求它们的最大公约数和最小公倍数。例如:给定6和9,求最大公约数时,循环过程从6依次递减至1,当循环到3时,判断得6和9都能被3整除,于是终止循环,求得最大公约数是3.;求最小公倍数时,循环过程从9依次递增至54,当循环到18时,判断得18同时能被6和9整除,于是终止循环,求得最小公倍数是18。 Python提供了两种基本的循环结构语句——while语句、for语句。 计算机编程导论
4.3 while语句 while 表达式: 循环体 while 表达式: 循环体 else: else子句 表达式 假(零) 真(非零) 计算机编程导论
说明: (1)while语句是一个条件循环语句,即首先计算表达式,根据表达式值的真、假来决定是否继续循环。 (2)while语句的语法与if语句类似,要使用缩进来分隔子句。 (3)while语句的条件表达式不需要用括号括起来,但是表达式后面必须有冒号。 (4)使用while语句编程通常会遇到两种题型,一种是循环次数事先确定的问题;一种是循环次数事先不确定的问题。 计算机编程导论
4.3.1 while语句用于有限循环 【例4-1】编程从键盘输入若干正整数,求所有输入整数之和。当输入整数为负数时,结束该操作。 【分析】 该问题使用循环结构解决,由于不确定用户即将输入几个正整数,因此属于不确定循环次数的问题。 计算机编程导论
程序: 程序运行结果: 请输入若干正整数进行求和操作,当输入负数时结束: 请输入一个整数: 10 请输入一个整数: 20 #Exp4_1.py print '请输入若干正整数进行求和操作,当输入负数时结束: ' s = 0 x = input("请输入一个整数: ") while x >= 0: s = s + x print '整数之和=', s 程序运行结果: 请输入若干正整数进行求和操作,当输入负数时结束: 请输入一个整数: 10 请输入一个整数: 20 请输入一个整数: 30 计算机编程导论
【例4-2】编程从键盘输入若干个字符,一边输入一边输出,当输入“#”字符时终止该操作。 是 否 【分析】 (1)本题使用循环结构解决,每次循环从键盘输入一个字符,直到输入为“#”字符时停止循环。 (2)由于输入的字符个数无法确定,因此循环次数不确定。 计算机编程导论
程序: 提问: (1)循环结束后,变量 a 中的值是什么? (2)如果循环体中没有下面这条语句会怎么样? a = raw_input('请输入字符,如果输入 # 号则结束输入操作: ') while a != '#': #判断输入的是否是井号 print '您输入的字符是:', a #打印输入的字符 #以下语句是再次输入一个新的字符 else: print '输入结束' 提问: (1)循环结束后,变量 a 中的值是什么? (2)如果循环体中没有下面这条语句会怎么样? a = raw_input('请输入字符,如果输入 # 号则结束输入操作: ') 计算机编程导论
4.3.2 while语句解决确定循环次数的问题 确定循环次数的问题是指循环之前可以预知循环即将执行的次数,为了控制循环次数,通常在程序中设置一个计数变量,每次循环,该变量进行自增或自减操作,当变量值自增到大于设定的上限值或者自减到小于设定的下限值时,循环自动结束。 计算机编程导论
4.3.2 while语句解决确定循环次数的问题 【例4-3】 编程计算1+2+3+…+100 的值。 分析:本题使用循环结构解决,每循环一次累加一个整数值,整数的取值范围为1~100。由于整数的范围是确定的,因此循环次数也是确定的。 计算机编程导论
4.3.2 while语句解决确定循环次数的问题 框图: 程序: #Exp4_3.py i, s = 1, 0 while i <= 100 : s = s + i i += 1 print '1+2+3+...+100 = ', s 计算机编程导论
4.3.2 while语句解决确定循环次数的问题 【例4-4】 编程依次输出列表中每个元素的值。 分析:本题使用循环结构解决,每循环一次输出一个列表元素值,由于列表定义后,其长度是已知的,因此循环次数也是确定的。 计算机编程导论
4.3.2 while语句解决确定循环次数的问题 程序: #Exp4_4.py a_list = ['a', 'b', 'mpilgrim', 'z', 'example'] a_len = len(a_list) i = 0 while i < a_len: print '列表的第', i+1, '个元素是:', a_list[i] i += 1 计算机编程导论
4.3.3 while语句用于无限循环 当while语句的“表达式”永远不会为布尔假时,循环将永远不会结束,形成无限循环,也称死循环。 while True: 循环体 可以在循环体内使用break语句强制结束死循环。 计算机编程导论
程序: 【例4-5】使用无限循环的方法编程实现例4-2。 a = input('请输入字符,如果输入 # 号则结束输入操作: ') while True: print('您输入的字符是:', a) if a == '#': break 计算机编程导论
【例4-6】求以下表达式的值,其中n值从键盘输入。参考值:当n = 11时,s = 1.833333 。 计算机编程导论
(1)以上问题属于数学中的级数求和问题,是使用循环结构解决的一类常见问题。 【分析】 (1)以上问题属于数学中的级数求和问题,是使用循环结构解决的一类常见问题。 (2)级数求和问题编程的重点在于通过观察表达式的规律,分析每次循环都要完成的事件。通常将这些事件进行局部分解,称为“通式”。 该题的通式有以下几个: (1)分母的通式: (2)变量i的通式: (3)当前项的通式: (4)求和的通式: mu = mu + i i = i + 1 t = 1.0 / mu s = s + t 计算机编程导论
程序: 提问: i=1 mu = 0 s = 0.0 n = input('请输入n值: ') #或用书上的代码 while i <= n: #判断是否计算到表达式的最后一项 mu = mu + i #求分母的通式 i += 1 # i 自增的通式 t = 1.0 / mu #求当前项的通式 s = s + t #求和的通式 print 's = ', s #循环结束后,打印总和 提问: (1)变量 i、mu、s 的初值只能是 1、0、0.0 吗? (2)循环体内语句的先后顺序可以随意调换吗? 计算机编程导论
【例4-7】 通过以下表达式求π的近似值,当某项小于0.00000001(即1e-8)时停止循环。 计算机编程导论
分析: 该题使用循环结构来解决,只有当某一项小于1e-8时才停止迭代,因此循环次数是不确定的。观察表达式中相邻两项的规律是——①前一项的分子乘以1个整数值“i”可得后一项的分子,而这个整数值“i”随着循环次数由1递增到n;②前一项的分母乘以“2*i+1”可得后一项的分母。该题的通式有以下几个: (1)分子的通式:zi = zi * i (2)分母的通式:mu = mu * (2 * i + 1) (3)变量i的通式:i = i + 1 计算机编程导论
程序: #Exp4_7. py i = 1 zi = 1. 0 mu = 1. 0 t = 1. 0 s = 0 程序: #Exp4_7.py i = 1 zi = 1.0 mu = 1.0 t = 1.0 s = 0.0 while t >= 1e-8: s = s + t zi = zi * i mu = mu * ( 2 * i + 1) t = zi * 1.0 / mu i += 1 print 'PAI = ', (2 * s) 计算机编程导论
【例4-8】求1 ~ 100之间能被7整除,但不能同时被5整除的所有整数 。 【分析】 (1)本题需要对1 ~ 100范围内的所有数一一进行判断。 (2)本题的循环次数确定是100次。 (3)在每次循环过程中需要用 if 语句进行条件判断。因此本题是循环嵌套选择的结构。 计算机编程导论
程序: 提问: i = 1 # i 既是循环变量,同时又是被判断的数 while i <= 100: #判断循环是否结束 print('1~100之间能被7整除,但不能同时被5整除的所有数是:') while i <= 100: #判断循环是否结束 if i % 7 == 0 and i % 5 != 0: #判断本次的i是否满足条件 print i, '\t ' #打印满足条件的i i += 1 #每次循环 i 应自增 提问: 请问语句“i += 1”可以和语句 “print i, '\t ' ”对齐吗? 计算机编程导论
【例4-6】输出“水仙花数”。所谓水仙花数是指1个3位的十进制数,其各位数字的立方和等于该数本身。例如:153是水仙花数,因为153 = 13 + 53 + 33 。 【分析】 (1)本题需要对100 ~ 999范围内的所有数一一进行判断。 (2)本题的变量 i 既是循环变量,同时也是被判断的数。 (3)每次循环过程中需要用 if 语句进行条件判断。因此本题也是循环嵌套选择的结构。 计算机编程导论
提问: 程序: 变量 i 是一个三位整数,例如 i = 123 (1)请写出分离 i 的百位数的表达式。 print('所有的水仙花数是:') while i <= 999: #判断循环是否结束 bai = int(i / 100) #分离 i 的百位数 shi = int((i % 100) / 10) #分离 i 的十位数 ge = int(i % 10) #分离 i 的个位数 if bai ** 3 + shi ** 3 + ge ** 3 == i: #判断条件 print i, '\t', #打印水仙花数 i += 1 #变量 i 自增 计算机编程导论
第7次上机作业: 4.1 4.3 计算机编程导论