算法实验1(三门全及格)


1.      利用数组实现原始信息与处理结果的对应存储。

一次考试共考了语文、代数和外语三科。某小组共有九人,考后各科及格名单如下表,请编写算法找出三科全及格的学生的名单(学号)。各科及格学生的学号如下表,编写程序依次输入及格学生的学号,输出3科全部及格的学生学号。

 算法实验1(三门全及格)

思考:

(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/244300.html

(0)
上一篇 2022年4月17日
下一篇 2022年4月17日

相关推荐

发表回复

登录后才能评论