17 循环嵌套

1、引入

某次程序大赛,S1班有4名学员参加,学员的成绩由用户输入,计算该班参赛学员的平均分。
在这里插入图片描述
场景:上述练习中,如果有3个班级各四名同学参赛,如何计算每个班级参赛同学的平均分呢?
在这里插入图片描述
分析:
需要循环3次计算每个班的平均分。而每个班有四名同学,所以对每个班级需要循环四次累加总分。可以用一个循环控制班级的数目,用另一个循环控制每个班级同学的数目,这样就得到了二重循环。

2、二重循环

Python中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。在Python中,for循环和while循环都可以进行循环嵌套。

在while循环中套用while循环

while 条件表达式1:
	while 条件表达式2:
		循环体2
	循环体1

for循环中套用for循环

for 迭代变量1 in 对象1:
	for 迭代变量2 in 对象2:
		循环体2
	循环体1

while循环中套用for循环

while 条件表达式1:
	for 迭代变量 in 对象:
		循环体2
	循环体1

for循环中套用while循环

for 迭代变量 in 对象:
	while 条件表达式:
		循环体2
	循环体1

各种循环可以相互嵌套,内层循环结束后才执行外层循环的语句。外层循环变量变化一次,内层循环变量要变化一遍。

3、示例

classNum = 1
while classNum <= 3:
    print("请输入{}班4位学员的成绩".format(classNum))
    i = 1
    sum = 0
    while i <= 4:
        print("请输入第{}位学员的成绩:".format(i), end="")
        score = int(input())
        sum += score
        i += 1
    avg = sum / 4
    print("{}班参赛学员的平均分是:{}".format(classNum,avg))
    classNum += 1

或者:

classNum = 1
while classNum <= 3:
    sum = 0
    print("请输入{}班4位学员的成绩".format(classNum))
    for x in range(1, 5):
        print("请输入第{}位学员的成绩:".format(x), end="")
        score = int(input())
        sum += score
    avg = sum / 4
    print("{}班参赛学员的平均分是:{}".format(classNum,avg))
    classNum += 1
for classNum in range(1,5):
    print("\n请输入软件{}班的学员成绩".format(classNum))
    sum = 0  # 累加和
    for i in range(1, 5):
        score = int(input("请输入第{}名学员的成绩:".format(i)))
        sum += score
    avg = sum / 4
    print("软件{}班参赛学员的平均分是:{}".format(classNum, avg))

4、练习

(1)用*打印直角三角形图案。
在这里插入图片描述
分析:
第一行,i=1,打印一个*,内层循环一次,j的取值只有1。
第二行,i=2,打印两个*,内层循环两次,j的取值只有1~2。
第三行,i=3,打印三个*,内层循环三次,j的取值只有1~3。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)输入行数,打印直角三角形。
 从控制台输入直角三角形的高度
 每行的数目依次为1、3、5、7…
在这里插入图片描述
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行均打印
号,第i行的*号数为2 * i – 1,从而得到内层循环条件。

(3)打印倒直角三角形。
从控制台输入直角三角形的高度,每行*的数目从下至上依次为1、2、3、4…。
在这里插入图片描述
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行均打印*号,某一行与该行*号数之和等于行数加1,从而得到内层循环条件。

(4)打印等腰三角形
控制台输入等腰三角形的高度,每行的数目依次为1、3、5、7…。
在这里插入图片描述
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行先打印空格,再打印
号。打印空格和打印*号用两个不同的for循环。为了清晰起见,我们可以以#号代替空格来分析每行空格数、*号数和行数的关系,如下图所示:
在这里插入图片描述
在这里插入图片描述
i行的空格数与i之和等于rows,第i*号数为2 * i-1,从而得到两个内层for循环的循环条件。

(5)打印菱形
如果用户输入的行数为奇数,则打印出菱形;否则提示用户输入奇数。假设用户输入的行数为rows,则每行的*号数依次为1,3,5,7,……,rows,……,7,5,3,1,如下图所示。
在这里插入图片描述
复杂图形分步打印的思想。
分析:
先判断用户输入的是否为奇数。
分步打印,先打印菱形的上半部分,即一个等腰三角形,行数为(rows + 1)/ 2
打印菱形的下半部分,打印完一行后换行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值