教学案例六 多重循环
1.n之内的素数
输入n,显示n之内的所有素数 每行显示10个素数 例如,若输入500,结果如图所示
n=eval(input())
#代码开始
c = 0for i in range(2, n+1):for j in range(2, i):if i % j == 0:breakelse:c += 1print("{:5d}".format(i), end = "")if c % 10 == 0:print()#代码结束
2.打印乘法表
输入x(小于10的整数),输出x行乘法表 例如:输入9,显示如下图所示
x=eval(input())
#代码开始
for i in range(1,x+1):for j in range(1,i+1):print("%d*%d=%2d"%(j,i,i*j),end=" ")print()#代码结束
3.百钱买百鸡
设公鸡每只5元,母鸡每只3元,小鸡每元3只,现用x元钱买y只鸡。 编写一个程序,输入x和y,算出各买多少只鸡?(公鸡、母鸡、小鸡必须都有)如果有多个符合条件的结果,则都显示出来。如果没有符合条件的结果,则显示无解。
x=eval(input("钱"))
y=eval(input("鸡"))
#代码开始
c = 0
for i in range(1,x):for j in range(1,x):for k in range(3, x, 3):if 5 * i + 3 * j + k / 3 == x and i + j + k == y:c += 1print("公鸡%d只母鸡%d只小鸡%d只" % (i,j,k))
if c == 0:print("无解")#代码结束
4.逻辑推理竞赛名次
ABCD四个学生参加一次数学竞赛,赛后他们四人预测名次如下 A说:c第一 ,我第三 B说:我第一,D第四 C说,我第三,D第二 D没有说话 等到最后公布考试成绩时,发现他们每人预测对了一半,编写程序,显示ABCD的名次,各名次之间用空格隔开
#代码开始for a in range(1,5):for b in range(1,5):for c in range(1,5):for d in range(1,5):x1 = (c==1 and a==3)x2 = (b==1 and d==4)x3 = (c==3 and d==2)y1 = (c==1 or a==3)y2 = (b==1 or d==4)y3 = (c==3 or d==2)if not x1 and not x2 and not x3 and y1 and y2 and y3:if a!=b and a!=c and a!=b and b!=c and b!=d and c!=d:print(a,b,c,d)#代码结束
5.用户登录密码检验
密码文件如图所示,每行存放逗号分隔的用户名和密码。编写一个小程序,接受输入的用户名和密码,若与文件中的信息相同,则显示密码正确。 若文件中没有输入的用户名,或输入的密码不正确,则显示用户名或密码错误,可再次输入。 若输入错误次数达到三次,则显示密码错误三次,结束程序。
f1=open("sy6//密码.txt","r",encoding="utf-8")
#代码开始
k = 0
flag = 0
while True:f1.seek(0)yhm = input("用户名")mm = input("密码")if yhm != "":for i in f1.readlines():i = i.strip("\n")i = i.split(",")if yhm==i[0] and mm==i[1]:print("密码正确")flag = 1breakelse:k += 1if k >= 3:print("密码错误三次")breakelse:print("用户名或密码错误")if flag==1:break#代码结束
f1.close()
6.选择题
实验六 多重循环
1.显示输入数字之内的完全数
显示输入数字之内的完全数。 一个数整等于其所有因子之和(不含这个数本身),则称这个数为完全数。例如 6=1+2+3,所以 6 是完全数。
x=eval(input())
#代码开始
for i in range(1, x):s = 0for j in range(1, i):if i % j == 0:s = s + jif s == i:print(i)#代码结束
2.输出阶乘等式
输入x 输出从1!到x!等式 例如输入10 输出
x=eval(input())
#代码开始for i in range(1, x + 1):s = 1print("%s!=" % i, end = "")for j in range(1, i + 1):s = s * jprint(j,end="")if i != j:print("*",end="")print("=%d"% s)#代码结束
3.输出符合要求的数字
输入一个数字x(1-9之间),输出所有每个数位上的数字不超过x,各个数位的数字互不相同的三位数,每行显示10个数 注意:每个数后面有空格 提示:可以在print中设置end=" ",在输出表达式后显示空格 例如,输入5,输出如下图
x=eval(input())
#代码开始
count = 0
for i in range(100,1000):a1 = i % 10 # 个位a2 = i // 10 % 10 # 十位a3 = i // 100 # 百位if a1 <= x and a2 <= x and a3 <= x and a1 != a2 and a1 != a3 and a2 != a3:count += 1print(i, end=" ")if count % 10 == 0:print()#代码结束
4.鸡兔同笼问题
鸡和兔子关在一个笼子里,输入头的个数和脚的个数,求笼内关了多少只兔子和多少只鸡? 如果没有符合条件的数目,显示无解
t=eval(input())
j=eval(input())
#代码开始
sum1 = 0
for i in range(1, t):s = t - iif 2 * i + 4 * s == j:sum1 += 1print("鸡%d只兔子%d只"% (i, s))
if sum1 == 0:print("无解")
#代码结束
5.剩余最短木料
求剩余最短木料的切割方案。 输入一根材料的长度,需要截成长度为19米和23米的短料。求两种短料各截多少根时,剩余的材料最少?(每种短料必须大于等于一根)
s=eval(input())
#代码开始
a = s // 19
b = s // 23
sy = 5
for i in range(1, b):for j in range(1, a):if j * 19 + i * 23 <= s:sx = s - j * 19 - i * 23if sx < sy:n1 = jn2 = izx = sx#代码结束
print("19米{}段,23米{}段,剩余{}米".format(n1,n2,zx))
6.打印图形
编写一个能计打印图形的小程序。 输入大写字母,打印一个相关图形 例如,输入E 打印图形如下
zm=input("")
#代码开始
n = ord(zm) - ord("A")
for i in range(0, n+1):for j in range(n-i):print(" ",end="")for x in range(0, i+1):print("%s" % chr(ord("A") + x),end="")for y in range(1,i+1):print("%s" % chr(ord("A") + i - y),end="")print()
#代码结束
7.逻辑推断
一位法官在审理一起盗窃案时,对涉及到的四名嫌疑犯A、B、C、D进行了审问。 四人分别供述如下: A:“罪犯在B、C、D三人之中。” B:“我没有作案,是C偷的。” C:“在A和D中间有一个是罪犯。” D:“B说的是事实” 经过充分的调查,证实四人中只有两人说了真话,并且罪犯只有一个。 请输出真正罪犯的编码 例如,如果A是罪犯,输出A是罪犯。
提示:可以用变量a为0表示a不是罪犯,a为1表示a是罪犯 然后对每个人的两种可能循环。
#代码开始
for a in range(0, 2):for b in range(0, 2):for c in range(0, 2):for d in range(0, 2):if a + b + c + d == 1: # 只有一个罪犯,相加等于1if (b==1 or c==1 or d==1)+2*(b==0 and c==1)+(a==1 or d==1)==2:if a == 1:print("A是罪犯")elif b == 1:print("B是罪犯")elif c== 1:print("C是罪犯")elif d == 1:print("D是罪犯")#代码结束
8.多人唐诗作品标题
在唐诗.txt文件,如下图所示。每首诗的标题为序号诗人冒号诗名。
编写程序,输入诗人姓名,显示该诗人所写的诗的标题,以及作品数,如图所示。 如果该诗人没有作品,显示无作品。 要求能够循环输入诗人姓名进行查找,直到输入空串为止。提示: 查询完一位诗人后需要通过f1.seek(0)将文件指针移到文件的开始处。
f1=open("sy6//唐诗.txt","r",encoding="utf-8")
x=input("诗人姓名")#代码开始
while True:count = 0f1.seek(0)if x == "":breakfor i in f1.readlines():i = i.strip("\n")if i.find(x) != -1:count += 1print(i)if count != 0:print("一共{}首".format(count))else:print("无作品")x = input("诗人姓名")#代码结束
f1.close()