第一次算法实验,某一高等院校有汽车学院、材料学院、计算机学院、软件学院;每个学院的一年级第一学期都开英语、高数、线代课程。每个学院每学期的成绩已经分别登录在同一个Excel文件的不同Sheet中(表),没有排序,人数分别为,N1,N2,N3,N4。
设计程序:
- 按单课成绩排序算法
- 输出在全校英语成绩前k名的学生名单(学院、学号、姓名、英语成绩)
- 输出在全校英语、高数、现代成绩都是前k名的学生名单(学院、学号、姓名、英语、高数、现代成绩)
源码
import xlrd # 导入模块
from xlutils.copy import copy # 导入copy模块
sheets = []
DATA_DIR = 'C:/Users/wang/Downloads/'
excel_name = '%s分治算法实验job.xls' % DATA_DIR
class scorer(object):
def __init__(self, name, num, major, score1, score2, score3):
self.name = name
self.num = num
self.major = major
self.score1 = score1
self.score2 = score2
self.score3 = score3
def loaddata():
wb = xlrd.open_workbook(excel_name)
# 获取workbook中所有的表格
for i in range(0, 8):
sheets.append(wb.sheet_by_index(i).name)
print(sheets)
for i in range(0, 4): # 共四个学院
work_sheet = wb.sheet_by_index(i)
for j in range(4, work_sheet.nrows): # 从第5行到第11行有数据
# print(work_sheet.row_values(j)[3], str(int(work_sheet.row_values(j)[2])).zfill(6), work_sheet.name,
# work_sheet.row_values(j)[4], work_sheet.row_values(j)[5], work_sheet.row_values(j)[6])
t_scorer = scorer(work_sheet.row_values(j)[3], work_sheet.row_values(j)[2], work_sheet.name,
work_sheet.row_values(j)[4], work_sheet.row_values(j)[5], work_sheet.row_values(j)[6])
majors[i].append(t_scorer)
def sort1(majornum, subject, flag, majorlist):
if 0 <= majornum < 4:
for i in range(1, len(majorlist[majornum])):
for j in range(0, len(majorlist[majornum]) - i):
if subject == 1:
if majorlist[majornum][j].score1 < majorlist[majornum][j + 1].score1:
majorlist[majornum][j], majorlist[majornum][j + 1] = majorlist[majornum][j + 1], majorlist[majornum][j]
elif subject == 2:
if majorlist[majornum][j].score2 < majorlist[majornum][j + 1].score2:
majorlist[majornum][j], majorlist[majornum][j + 1] = majorlist[majornum][j + 1], majorlist[majornum][j]
elif subject == 3:
if majorlist[majornum][j].score3 < majorlist[majornum][j + 1].score3:
majorlist[majornum][j], majorlist[majornum][j + 1] = majorlist[majornum][j + 1], majorlist[majornum][j]
else:
print("请输入正确的科目编号!\n")
if flag:
writedata(majornum, 0)
for i in range(0, len(majorlist[majornum])):
print(majorlist[majornum][i].name, str(int(majorlist[majornum][i].num)).zfill(6), majorlist[majornum][i].major,
majorlist[majornum][i].score1, majorlist[majornum][i].score2, majorlist[majornum][i].score3)
print("排序结果如上,已输出至原表单:'%s'\n" % str(sheets[majornum]))
else:
print("请输入正确的学院编号!\n")
return 0
def sort2(score, k1, flag, scorelist):
scorelist[score - 1] = []
for i in range(0, 4):
sort1(i, score, False, majors)
i1, i2, i3, i4 = 0, 0, 0, 0
if score == 1:
for i in range(0, k1):
t = majors[0][i1]
i1 += 1
if majors[1][i2].score1 > t.score1:
t = majors[1][i2]
i1 -= 1
i2 += 1
if majors[2][i3].score1 > t.score1:
t = majors[2][i3]
i2 -= 1
i3 += 1
if majors[3][i4].score1 > t.score1:
t = majors[3][i4]
i3 -= 1
i4 += 1
scorelist[score-1].append(t)
elif score == 2:
for i in range(0, k1):
t = majors[0][i1]
i1 += 1
if majors[1][i2].score2 > t.score2:
t = majors[1][i2]
i1 -= 1
i2 += 1
if majors[2][i3].score2 > t.score2:
t = majors[2][i3]
i2 -= 1
i3 += 1
if majors[3][i4].score2 > t.score2:
t = majors[3][i4]
i3 -= 1
i4 += 1
scorelist[score - 1].append(t)
else:
for i in range(0, k1):
t = majors[0][i1]
i1 += 1
if majors[1][i2].score3 > t.score3:
t = majors[1][i2]
i1 -= 1
i2 += 1
if majors[2][i3].score3 > t.score3:
t = majors[2][i3]
i2 -= 1
i3 += 1
if majors[3][i4].score3 > t.score3:
t = majors[3][i4]
i3 -= 1
i4 += 1
scorelist[score-1].append(t)
if flag:
writedata(7 - score, k1)
for i in range(0, k1):
if score == 1:
print(scorelist[score - 1][i].major, str(int(scorelist[score - 1][i].num)).zfill(6),
scorelist[score - 1][i].name, scorelist[score - 1][i].score1)
elif score == 2:
print(scorelist[score - 1][i].major, str(int(scorelist[score - 1][i].num)).zfill(6),
scorelist[score - 1][i].name, scorelist[score - 1][i].score2)
elif score == 3:
print(scorelist[score - 1][i].major, str(int(scorelist[score - 1][i].num)).zfill(6),
scorelist[score - 1][i].name, scorelist[score - 1][i].score3)
print("排序结果如上,已输出至原表单:'%s'\n" % str(sheets[7 - score]))
return 0
def sort3(k2, mainlist):
mainlist.clear()
for i in range(0, 3):
sort2(i+1, k2, False, score_list)
for i in range(0, k2):
for j in range(0, k2):
if score_list[0][i].num == score_list[1][j].num:
for k in range(0, k2):
if score_list[0][i].num == score_list[2][k].num:
mainlist.append(score_list[0][i])
writedata(7, k2)
for i in range(0, len(mainlist)):
print(str(int(mainlist[i].num)).zfill(6), mainlist[i].name, mainlist[i].major,
mainlist[i].score1, mainlist[i].score2, mainlist[i].score3)
print("排序结果如上,已输出至原表单:'%s'\n" % str(sheets[7]))
return 0
def writedata(idx, key):
rb = xlrd.open_workbook(excel_name) # 打开文件
wb = copy(rb) # 利用xlutils.copy下的copy函数复制
ws = wb.get_sheet(idx) # 获取表单
if idx == 7:
slist = list(rb.sheet_by_index(idx).row_values(0)[0])
slist.pop(17)
slist[16] = str(key).zfill(2)
s = ''.join(slist)
ws.write(0, 0, s)
print('\n' + s)
for i in range(2, len(main_list)+2): # 从第3行开始有数据
ws.write(i, 0, str(int(main_list[i-2].num)).zfill(6))
ws.write(i, 1, main_list[i-2].name)
# print(main_list[i-2].name)
ws.write(i, 2, main_list[i-2].major)
ws.write(i, 3, main_list[i-2].score1)
ws.write(i, 4, main_list[i-2].score2)
ws.write(i, 5, main_list[i-2].score3)
if len(main_list)+2 < rb.sheet_by_index(idx).nrows+1:
for i in range(len(main_list)+2, rb.sheet_by_index(idx).nrows+1):
for j in range(0, 6):
ws.write(i, j, )
elif idx <= 3:
print('\n' + rb.sheet_by_index(idx).row_values(1)[2])
for i in range(4, rb.sheet_by_index(idx).nrows): # 从第5行开始有数据
ws.write(i, 2, str(int(majors[idx][i - 4].num)).zfill(6))
ws.write(i, 3, majors[idx][i - 4].name)
ws.write(i, 4, majors[idx][i - 4].score1)
ws.write(i, 5, majors[idx][i - 4].score2)
ws.write(i, 6, majors[idx][i - 4].score3)
# print(majors[idx][i - 4].name)
else:
slist = list(rb.sheet_by_index(idx).row_values(0)[0])
slist.pop(10)
slist[9] = str(key).zfill(2)
s = ''.join(slist)
ws.write(0, 0, s)
print('\n' + s)
print(len(score_list[6-idx]))
for i in range(2, len(score_list[6-idx])+2):
ws.write(i, 0, score_list[6-idx][i-2].major)
ws.write(i, 1, str(int(score_list[6 - idx][i-2].num)).zfill(6))
ws.write(i, 2, score_list[6-idx][i-2].name)
# print(score_list[6 - idx][i-2].name)
if idx == 4:
ws.write(i, 3, score_list[6-idx][i-2].score3)
elif idx == 5:
ws.write(i, 3, score_list[6-idx][i-2].score2)
elif idx == 6:
ws.write(i, 3, score_list[6-idx][i-2].score1)
if len(score_list[6-idx])+2 < rb.sheet_by_index(idx).nrows+1:
for i in range(len(score_list[6-idx])+2, rb.sheet_by_index(idx).nrows+1):
for j in range(0, 4):
ws.write(i, j, )
wb.save(excel_name) # 保存文件
if __name__ == '__main__':
score_list = [[], [], []]
majors = [[], [], [], []]
main_list = []
print("\n!!!!!!!!!!!!!!!!!!!请在关闭原表格的情况下运行此程序!!!!!!!!!!!!!!!!!!!\n")
print("表单名称:")
loaddata()
while True:
print("操作名称与代号:\n 1. 按院单科排序 \n 2. 单科全校前k \n 3. 全科均前k \n 4. 退出")
x1 = int(input("请选择您的操作:"))
if x1 == 1:
print("学院名称与代号:\n 1. 汽车学院 \n 2. 材料学院 \n 3. 软件学院 \n 4. 计算机学院")
x2 = int(input("请选择学院:"))
print("科目名称与代号:\n 1. 英语 \n 2. 高数 \n 3. 代数")
x3 = int(input("请选择科目:"))
sort1(x2 - 1, x3, True, majors)
elif x1 == 2:
print("科目名称与代号:\n 1. 英语 \n 2. 高数 \n 3. 代数")
x4 = int(input("请选择科目:"))
K1 = int(input("请选择前k名:"))
if 0 <= x4 < 4:
sort2(x4, K1, True, score_list)
else:
print("输入代号错误!")
elif x1 == 3:
K2 = int(input("请选择前k名:"))
main_list = []
sort3(K2, main_list)
else:
print("再见!")
import os
os._exit(0)
print("\n!!!!!!!!!!!!!!!!!!!请在关闭原表格的情况下运行此程序!!!!!!!!!!!!!!!!!!!\n")