算法实验1--分治思想排序

第一次算法实验,某一高等院校有汽车学院、材料学院、计算机学院、软件学院;每个学院的一年级第一学期都开英语、高数、线代课程。每个学院每学期的成绩已经分别登录在同一个Excel文件的不同Sheet中(表),没有排序,人数分别为,N1,N2,N3,N4。
设计程序:

  1. 按单课成绩排序算法
  2. 输出在全校英语成绩前k名的学生名单(学院、学号、姓名、英语成绩)
  3. 输出在全校英语、高数、现代成绩都是前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")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值