4.4.3《循环嵌套的应用》粤教版(2019)数据与计算必修1-课后练习(含解析)

资源下载
  1. 二一教育资源

4.4.3《循环嵌套的应用》粤教版(2019)数据与计算必修1-课后练习(含解析)

资源简介

循环嵌套的应用练习题
(粤教版·必修一《数据与计算》4.4.3)
一、单选题(共15题,每题5分,共75分)
1. 关于循环嵌套,下列说法正确的是(  )
A. 外层循环每执行一次,内层循环就完整地执行一轮
B. 内层循环每执行一次,外层循环就完整地执行一轮
C. 内外层循环是同时执行的
D. 循环嵌套中不能使用break语句
2. 执行以下代码,输出结果是(  )
```python
for i in range(1, 3):
for j in range(1, 4):
print(i, j, end=' ')
print()
```
A. 1 1 1 2 1 3 2 1 2 2 2 3
B. 1 1 1 2 1 3 然后换行 2 1 2 2 2 3
C. 1 1 2 2 3 3 1 2 2 3 3 4
D. 1 1 1 2 2 2 1 3 2 3 3 3
3. 下列代码中,内层循环体总共执行的次数是(  )
```python
for i in range(3):
for j in range(4):
print("", end='')
```
A. 7
B. 12
C. 3
D. 4
4. 执行以下代码,输出图形是(  )
```python
for i in range(1, 5):
for j in range(1, i+1):
print(j, end='')
print()
```
A.
1
12
123
1234
B.
1
22
333
4444
C.
1
21
321
4321
D.
1
11
111
1111
5. 关于循环嵌套中的break和continue,下列说法正确的是(  )
A. break只能跳出最内层的循环
B. break会跳出所有嵌套循环
C. continue会跳出所有嵌套循环
D. 在嵌套循环中不能使用break
6. 执行以下代码,输出结果中共有多少个星号?(  )
```python
for i in range(3):
for j in range(3):
if i == j:
continue
print('*', end='')
```
A. 3
B. 6
C. 9
D. 12
7. 以下代码段的功能是输出一个乘法口诀表的一部分,请判断输出的是(  )
```python
for i in range(1, 4):
for j in range(1, i+1):
print(f"{j}{i}={ij}", end=' ')
print()
```
A. 完整的1-3乘法表(下三角)
B. 完整的1-3乘法表(上三角)
C. 1-3乘法表但只有j<=i的部分
D. A和C都正确
8. 下列代码的输出结果是(  )
```python
for i in range(3, 0, -1):
for j in range(1, i+1):
print(j, end='')
print()
```
A.
123
12
1
B.
123
23
3
C.
321
21
1
D.
111
22
3
9. 下列嵌套循环中,内层循环体执行次数最多的是(  )
A. `for i in range(5): for j in range(5): ...`
B. `for i in range(5): for j in range(i): ...`
C. `for i in range(5): for j in range(5-i): ...`
D. `for i in range(5): for j in range(5, i, -1): ...`
10. 执行以下代码,输出结果是(  )
```python
for i in range(1, 4):
for j in range(1, 4):
if i * j > 4:
break
print(i, j)
```
A. 输出(1,1)(1,2)(1,3)(2,1)
B. 输出(1,1)(1,2)(1,3)(2,1)(2,2)
C. 输出(1,1)(1,2)(2,1)(2,2)(3,1)
D. 输出(1,1)(1,2)(2,1)
11. 使用循环嵌套打印等腰三角形,以下说法正确的是(  )
A. 只需一层循环即可实现
B. 通常需要两层循环:一层控制行数,一层控制每行的空格和星号
C. 需要三层循环:分别控制行数、空格和星号
D. 只能用while嵌套,不能用for嵌套
12. 下列代码输出一个数字三角形,若输入n=4,则输出(  )
```python
n = int(input())
num = 1
for i in range(1, n+1):
for j in range(1, i+1):
print(num, end=' ')
num += 1
print()
```
A.
1
2 3
4 5 6
7 8 9 10
B.
1
1 2
1 2 3
1 2 3 4
C.
1
2 2
3 3 3
4 4 4 4
D.
1
2 4
3 6 9
4 8 12 16
13. 下列有关循环嵌套性能的说法,错误的是(  )
A. 循环嵌套层数过多会导致程序效率降低
B. 应尽量减少循环嵌套的层数
C. 循环嵌套时,将次数多的循环放在内层可以提升效率(某些语言中)
D. 在Python中,循环嵌套的效率与循环变量的顺序无关
14. 执行以下代码后,变量s的值是(  )
```python
s = 0
for i in range(1, 4):
for j in range(1, i+1):
s += j
```
A. 10
B. 6
C. 3
D. 1
15. 以下哪个循环嵌套可以输出倒三角形,例如n=4时输出:
```
```
A.
```python
for i in range(4, 0, -1):
for j in range(i):
print('', end='')
print()
```
B.
```python
for i in range(4):
for j in range(4-i):
print('*', end='')
print()
```
C. A和B都正确
D. 以上都不正确
二、填空题(共10题,每题2分,共20分)
1. 在循环嵌套中,外层循环每执行一次,内层循环会__________地执行完整的一轮。
2. 执行以下代码,输出结果中共有__________个星号。
```python
for i in range(5):
for j in range(5):
if i + j > 5:
break
print('', end='')
```
3. 以下代码输出一个直角三角形,请补充内层循环的条件。
```python
for i in range(1, 6):
for j in range(__________):
print('*', end='')
print()
```
若希望输出:
*
**
4. 执行 `for i in range(3): for j in range(3): print(i, j)` ,总共输出__________行。
5. 下面的代码用于输出九九乘法表的上三角部分,请补充完整。
```python
for i in range(1, 10):
for j in range(__________, 10):
print(f"{i}*{j}={i*j}", end='\t')
print()
```
6. 循环嵌套中,break语句只跳出__________层循环。
7. 以下代码中,变量s的最终值是__________。
```python
s = 0
for i in range(1, 4):
for j in range(1, 4):
if i == j:
continue
s += i * j
```
8. 使用嵌套循环输出一个3×3的方格(由星号组成,每行星号之间用空格分隔),请补充内层循环的输出部分。
```python
for i in range(3):
for j in range(3):
print('*', end=__________ if j < 2 else '')
print()
```
9. 观察下列图案,需使用循环嵌套实现,其中外层循环控制__________,内层循环控制__________。
```
* * * * *
* * * *
* * *
* *
*
```
10. 执行以下代码,输出结果是__________。
```python
for i in range(1, 4):
for j in range(1, 4):
if i + j == 4:
print(i, j)
```
三、情景作答题(共3题)
情景一:社团排班表(创新应用)
某高中社团有5名成员,编号1-5。需要制作一个值日排班表,要求:每天由2名成员共同值日,且一周5天(周一至周五)内,每个成员恰好值日2次,且不能连续两天值日(即同一人不能在相邻两天都值日)。请尝试用循环嵌套生成所有可能的排班方案(只需生成一个满足条件的方案即可,不必枚举全部)。
问题:
1. 分析问题,描述如何用循环嵌套思路生成一个满足条件的排班表。(6分)
2. 编写Python程序,输出周一至周五每天的值日成员编号(每天两人,格式如“周一: 1 3”)。(8分)
3. 如果要求每个成员值日次数相同,但总天数增加,如何调整算法?(4分)
情景二:寻找质数对(数学与编程)
质数对是指两个质数相差2,例如(3,5)、(5,7)、(11,13)。请使用循环嵌套找出100以内的所有质数对。
要求: 先编写一个判断质数的函数,然后在主程序中使用嵌套循环实现。
问题:
1. 编写函数 `is_prime(n)` 判断一个整数是否为质数。(4分)
2. 使用双重循环,找出100以内所有相差2的质数对,并输出。注意避免重复输出如(3,5)和(5,3)。(8分)
3. 如果要找的是孪生素数(相差2),且希望提高效率,有什么优化方法?(4分)
情景三:绘制“回”字形图案(趣味图形)
输入一个奇数n(如5),输出一个由星号组成的“回”字形方阵。例如n=5时输出:
```
*****
* *
* *
* *
*****
```
n=7时输出:
```
*******
* *
* *
* *
* *
* *
*******
```
注意:最外层一圈全是星号,内部是空心区域。
问题:
1. 分析图形规律,说明需要使用几层循环?如何判断某位置(i,j)是否输出星号?(6分)
2. 编写程序,输入奇数n,输出对应的“回”字形图案。(8分)
3. 如果将图案改为“回”字嵌套多层(例如n=9时,最外层一圈星号,内部再一圈星号,形成两层边框),应如何修改条件?写出判断条件。(4分)
参考答案与解析
一、单选题答案解析
1. A
解析:嵌套循环中,外层循环每执行一次,内层循环都会从头到尾完整执行一遍。B说反了;C错,不是同时;D错,break可用。
2. B
解析:外层i=1时,内层j=1,2,3输出"1 1 1 2 1 3",然后print()换行;i=2时输出"2 1 2 2 2 3"换行。所以B正确。
3. B
解析:外层3次,内层每次4次,共3×4=12次。
4. A
解析:i从1到4,内层j从1到i,输出j,每行后换行。得到第一行1,第二行12,第三行123,第四行1234。A正确。
5. A
解析:break和continue只作用于当前所在的循环层(最内层),不会跳出所有嵌套。A正确,B错;C错,continue只跳过本次循环的剩余部分;D错。
6. B
解析:i=0时,j=0跳过,j=1,2输出2个星;i=1时,j=0,2输出2个星(j=1跳过);i=2时,j=0,1输出2个星(j=2跳过),共6个。
7. D
解析:代码输出i从1到3,j从1到i,即下三角部分,也是j<=i的部分,所以A和C都正确。
8. A
解析:外层i=3,2,1。i=3时内层j=1,2,3输出123换行;i=2时输出12换行;i=1时输出1。所以A。
9. A
解析:A:5×5=25次;B:0+1+2+3+4=10次;C:5+4+3+2+1=15次;D:5+4+3+2+1=15次(range(5,i,-1)当i=0时j=5,4,3,2,1 注意i从0开始?本题假设range(5)即i=0..4,但选项D中range(5, i, -1)初始i=0时产生5,4,3,2,1共5次,i=1时4,3,2,1共4次...总和也是15)。所以A最多。
10. B
11. B
解析:等腰三角形需要两层循环,外层控制行数,内层分别控制空格和星号(可以用两个内层循环或一个内层循环处理)。B正确。
12. A
解析:num从1开始,每输出一次递增,形成连续自然数三角形。
13. D
解析:Python中循环嵌套顺序会影响效率,通常将循环次数多的放在内层可以减少切换开销。D说法错误。
14. A
解析:i=1时:j=1→s=1;i=2时:j=1→s=2,j=2→s=4;i=3时:j=1→s=5,j=2→s=7,j=3→s=10。所以s=10。
15. C
解析:A和B都能正确输出倒三角形,A从4降到1,内层j在range(i)输出i个星;B从0到3,内层range(4-i)输出4-i个星。两者等价。
二、填空题答案解析
1. 完整
2. 15
3. range(1, i+1) 或 range(i)
4. 9
5. i(上三角:第i行从i开始到9)
6. 最内
7. 36(分析:i,j从1到3,跳过i=j的情况,计算所有ij的和:总和(1+2+3)(1+2+3)=66=36,减去对角线和1+4+9=14,得22?不对,注意s累加的是ij,所有组合共9项,总和= (1+2+3)(1+2+3)=36,减去对角线1+4+9=14,得22。但还有顺序?i≠j,包括(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)共6项,和为12+13+21+23+31+32=2+3+2+6+3+6=22。s=22。所以填22。)
8. ' '(空格)
9. 行数;每行中的输出项(空格和星号)
10. (1,3) 和 (2,2) 和 (3,1)(i+j==4,输出三行)
三、情景作答题答案解析
情景一:社团排班表
1. 思路分析
- 需要生成一周5天的排班,每天2人,共需10人次,每人恰好2次,共5人×2=10人次。
- 不能连续两天值日,即某人在第k天值日后,第k+1天不能再次出现。
- 可用循环嵌套尝试分配:外层循环天数,内层循环选择成员,并检查是否已值日2次、前一天是否值日。
- 采用贪心:从第一天开始,为每天随机或顺序选择符合条件的2人,若某天无法找到则回溯。但为了简单,可编写一个循环直到找到可行方案。
2. 代码示例(贪心+随机,可能需多次运行)
```python
import random
members = [1,2,3,4,5]
schedule = []
used_count = {m:0 for m in members}
last_day = {m:False for m in members} 前一天是否值日
days = 5
for day in range(days):
daily = []
available = [m for m in members if used_count[m]<2 and not last_day[m]]
if len(available) < 2:
简单重试机制,实际可回溯,这里仅示例
print("需重新运行")
break
chosen = random.sample(available, 2)
for m in chosen:
used_count[m] += 1
last_day[m] = True
schedule.append(chosen)
重置last_day:除了当天值日的人,其他人上一日状态清空
for m in members:
if m not in chosen:
last_day[m] = False
if len(schedule)==5:
for i, d in enumerate(schedule):
print(f"周{i+1}: {d[0]} {d[1]}")
```
3. 调整方法:若天数增加,每人值日次数相应增加(总人次=天数×2,每人次数相等需总人次能被人数整除),仍可用贪心,但可能需要更复杂的搜索算法(如回溯)。
情景二:寻找质数对
1. 判断质数函数
```python
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n0.5)+1):
if n % i == 0:
return False
return True
```
2. 输出质数对
```python
for i in range(2, 100):
if is_prime(i) and is_prime(i+2) and i+2 <= 100:
print(f"({i}, {i+2})")
```
注意避免重复,只输出小的在前。
3. 优化:可以先找出所有质数存入列表,然后遍历列表检查相邻元素差是否为2,减少重复判断。
情景三:绘制“回”字形图案
1. 图形规律
需两层循环(行和列)。判断条件:如果行索引为0或n-1(第一行或最后一行)或者列索引为0或n-1(第一列或最后一列),则输出星号,否则输出空格。
2. 代码
```python
n = int(input("请输入奇数n: "))
for i in range(n):
for j in range(n):
if i == 0 or i == n-1 or j == 0 or j == n-1:
print('', end='')
else:
print(' ', end='')
print()
```
3. 多层嵌套边框(例如两层)
可定义层数layer=2,判断条件:如果i在[0, layer-1]或[n-layer, n-1]或j在[0, layer-1]或[n-layer, n-1]且同时满足在边框范围内,则输出星号,否则输出空格。通用条件:`if i < layer or i >= n-layer or j < layer or j >= n-layer: print('', end='') else: print(' ', end='')`。

展开更多......

收起↑

资源预览