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:跳过此次循环
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/244300.html