作业要求:
要求根据id.txt和finalscore.txt生成学生成绩。文件都是utf-8格式的
1) id.txt 里面放着学号和姓名,没有排序。姓名很怪,不要在乎
2) finalscore.txt里面放着学生的做题信息。其中第三栏或第四栏是做题数量
有的学生昵称是学号,有的是姓名,有的是姓名学号都有。只要有学号或姓名,就有效
3) 分数计算办法: 1题50,2题60,此后每做一题加4分
4) 生成id.txt里面有的所有学生的成绩,按学号排序输出到指定的结果文件。
如果在 finalscore里面找不到学生的做题记录,该生题数和成绩都记0结果文件格式如:
学号 姓名 题数 分数
1700943357 玘尜寋 0 0
1700943359 杛旺煃 0 0
1700943383 玘签翢 2 60
1700943405 陕榄伳 0 0
1700943465 匒乡奡 5 72
1700943469 巸俗杽 3 64
1700943472 钬内佦 0 0
1700943481 別珜辽 0 0
1700943523 趂盨淦 7 80
这样的结果可以导入excel表格(拷贝粘贴即可)id.txt里面没有的学生,不用处理。
注意:源文件和目标文件里面的分隔符,都不是空格,都是制表符 \t (Tab)
注意看finalscore.txt里面,有连着两个 Tab 的情况,比如下面学号和做题数之间是2个tab:
4 1700943836 9
也许你需要关注这一点,也许并不需要5)程序文件名必须叫count.py。运行时,将count.py和id.txt, finalscore.txt放在相同文件夹下面,
然后在命令行窗口进入该文件夹,以命令行方式运行程序,命令行中可以指定结果文件名:python count.py XXX.txt
程序在同一个文件夹下生成结果文件XXX.txt。这个文件名可以随便指定
6)正确的结果已经给出,即ans.txt。最终生成的结果应该和ans.txt文件一致
0) 把finalscore用readlines读到一个字符串列表score里面,列表的每个元素都是一行
1) 把 id.txt全部读到一个列表里面,每个元素一行,就是一个学生的信息
然后把这个列表排序,就得到了按学号排序的学生列表 students
2) 对 students 里的每个元素,split出学号部分和姓名部分,然后到整个 score里面去找,学号部分或姓名部分如果能够在score里面找到,split找到的那个score元素,得到分数,再算成绩,输出。由于数据量不大,所以可以不用字典,集合等。
上代码:不需要考虑什么超时 直接暴力模拟 不难
import sys
import re
def func(x):
if x < 1:
return 0
elif x == 1:
return 50
elif x == 2:
return 60
else:
return 60 + (x-2) * 4
def find(x, y):
for i in range(len(y)):
if x in y[i]:
return i
return -1
f = open("finalscore.txt", "r", encoding="utf-8")
score = f.readlines()
f.close()
f = open("id.txt", "r", encoding="utf-8")
students = f.readlines()
f.close()
students.sort()
f = open(sys.argv[1], 'w', encoding="utf-8")
f.write("学号\t姓名\t题数\t分数\n")
for x in students:
x1, x2 = x.split()
i = max(find(x1, score), find(x2, score))
if i == -1:
f.write("%s\t%s\t%d\t%d\n" % (x1, x2, 0, 0))
else:
lst = re.split("\t", score[i])
tmp = func(int(lst[3]))
f.write("%s\t%s\t%s\t%d\n" % (x1, x2, lst[3], tmp))
f.close()