1. 利用数组实现原始信息与处理结果的对应存储。
一次考试共考了语文、代数和外语三科。某小组共有九人,考后各科及格名单如下表,请编写算法找出三科全及格的学生的名单(学号)。各科及格学生的学号如下表,编写程序依次输入及格学生的学号,输出3科全部及格的学生学号。
思考:
(1)怎样用更方便的存储方式提高算法的效率?
(2)分析设计的算法的时间复杂度。
思路1:枚举法
拿语文学号和代数依次比较,如果相同,则执行下一层循环,和外语作比较,找到相同的进行输出
1 a = [] 2 yw = int(input('请输入语文及格学生的学号,输入-1结束:')) 3 while yw != -1: 4 a.append(yw) 5 yw = int(input('请输入语文及格学生的学号,输入-1结束:')) 6 7 b = [] 8 ds = int(input('请输入代数及格学生的学号,输入-1结束:')) 9 while ds != -1: 10 b.append(ds) 11 ds = int(input('请输入代数及格学生的学号,输入-1结束:')) 12 13 c = [] 14 wy = int(input('请输入外语及格学生的学号,输入-1结束:')) 15 while wy != -1: 16 c.append(wy) 17 wy = int(input('请输入外语及格学生的学号,输入-1结束:')) 18 print('三科全及格学生学号:',end = '') 19 for i in range(0,len(a)): 20 key = a[i] 21 for j in range(0,len(b)): 22 if b[j] != key: 23 continue 24 for k in range(0,len(c)): 25 if key==c[k]: 26 print(key,end = ' ') 27 break
错误点:
1、第一次测试时候, 代码的while循环里没有这个语句,结果只能输一次学号
yw = int(input('请输入语文及格学生的学号,输入-1结束:'))
2、第二次,我以为是因为没有加end = ' '这个语句(我不知道这个语句是干啥的),加上后,依旧没有输出
3、我又检查了一遍代码,查了下break用法,原来这里应该用continue而不是break。。。
for j in range(0,len(b)): if b[j] != key: continue
改进:我希望能一直执行这些代码,而不是一轮就结束了,而且当输入负数时会报错,让重新输入
1 while True: 2 a = [] 3 yw = int(input('请输入语文及格学生的学号,输入-1结束:')) 4 while yw !=-1: 5 if yw > -1: 6 a.append(yw) 7 yw = int(input('请输入语文及格学生的学号,输入-1结束:')) 8 else: 9 yw = int(input('请重新输入大于零的学号,输入-1结束:')) 10 11 b = [] 12 ds = int(input('请输入代数及格学生的学号,输入-1结束:')) 13 while ds != -1: 14 if ds > -1: 15 b.append(ds) 16 ds = int(input('请输入代数及格学生的学号,输入-1结束:')) 17 else: 18 ds = int(input('请重新输入大于零的学号,输入-1结束:')) 19 20 c = [] 21 wy = int(input('请输入外语及格学生的学号,输入-1结束:')) 22 while wy != -1: 23 if wy > -1: 24 c.append(wy) 25 wy = int(input('请输入外语及格学生的学号,输入-1结束:')) 26 else: 27 wy = int(input('请重新输入大于零的学号,输入-1结束:')) 28 29 print('三科全及格学生学号:',end = '') 30 for i in range(len(a)): 31 key = a[i] 32 for j in range(len(b)): 33 if b[j] != key: 34 continue 35 for k in range(len(c)): 36 if key==c[k]: 37 print(key,end = ' ') 38 break 39 print('\n==================================')
改进【未来】:里面模式都差不多,希望有种方法可以让我压缩代码
思路2:
用数组a的九个下标分量作为各学号考生及格科目的计数器。将3科共存一个数组,当扫描完毕总及格名单后,凡计数器的值为3,就是3科全部及格的学生。否则,至少有一科未及格。
1 a = [] 2 for i in range(1,11): 3 a.append(0) 4 xh = int(input("请输入及格学生的学号1--9,输入-1结束:")) 5 while xh != -1: 6 a[xh] += 1 7 xh= int(input("请输入及格学生的学号1--9,输入-1结束:")) 8 print("三科全部及格的学生:", end="") 9 for xh in range(1,10): 10 if a[xh] == 3: #若将3改为其他数n,则求得的是n科成绩及格的学生 11 print(xh,end=" ")
【参考CSDN——python小明】
学到的知识点:
1、end="" 的用处就是表示该行 print 后还没有结束,后面还有内容,取消换行,end=‘ ’引号里面可以加空格,进行分隔
2、break:终止当前循环,如果只有一层,则执行循环后面的代码,如果不止一层,跳到上一层
continue:跳过此次循环