GPA计算器

准备工作:
用户事先准备好如下图所示的Excel表格,其中A列为每门课程的学分,B列为每门课程的成绩。成绩可以有三种合法的表示方式:

  • 百分制:支持0-100的整数或浮点数
  • 五分制:默认支持'优', '良', '中', '差', '优秀', '良好', '中等', '及格', '不及格'的表示方式,可自行定义five_list变量
  • 二分制:默认支持'通过', '不通过'的表示方式,可自行定义two_list变量
"""
GPA计算器
"""
import numpy as np
import pandas as pd

# 用户定义参数
path = r'成绩单.xls'  # 用户Excel文件路径

# 系统预置参数
method_list = ['STA4.0','MOD4.0_v1','MOD4.0_v2','PKU4.0']                       # GPA计算方法代号列表
method_name_list = ['标准4.0方法','改进4.0方法v1','改进4.0方法v2','北大4.0方法']    # GPA计算方法名称列表
five_list = ['优', '良', '中', '差', '优秀', '良好', '中等', '及格', '不及格']     # 合法的五分制成绩
two_list = ['通过', '不通过']    # 合法的二分制成绩

# 百分制转换为4.0分制
def convert_100_4(n, method):
    """
    百分制转换为4.0分制
    :param n: int或float类型的百分制分数
    :param method: str格式,使用的方法,应为method_list中的一个元素
    :return: float类型的4.0分制分数
    """
    # 标准4.0方法
    if method == 'STA4.0':
        if 90 <= n <= 100:
            return 4.0
        elif 80 <= n < 90:
            return 3.0
        elif 70 <= n < 80:
            return 2.0
        elif 60 <= n < 70:
            return 1.0
        elif 0 <= n < 60:
            return 0.0
    # 改进4.0方法v1
    if method == 'MOD4.0_v1':
        if 85 <= n <= 100:
            return 4.0
        elif 70 <= n < 85:
            return 3.0
        elif 60 <= n < 70:
            return 2.0
        elif 0 <= n < 60:
            return 0.0
    # 改进4.0方法v2
    if method == 'MOD4.0_v2':
        if 85 <= n <= 100:
            return 4.0
        elif 75 <= n < 85:
            return 3.0
        elif 60 <= n < 75:
            return 2.0
        elif 0 <= n < 60:
            return 0.0
    # 北大4.0方法
    elif method == 'PKU4.0':
        if 90 <= n <= 100:
            return 4.0
        elif 85 <= n < 90:
            return 3.7
        elif 82 <= n < 85:
            return 3.3
        elif 78 <= n < 82:
            return 3.0
        elif 75 <= n < 78:
            return 2.7
        elif 72 <= n < 75:
            return 2.3
        elif 68 <= n < 72:
            return 2.0
        elif 64 <= n < 68:
            return 1.5
        elif 60 <= n < 64:
            return 1.0
        elif 0 <= n < 60:
            return 0

# 五分制转换为4.0分制
def convert_5_4(n):
    """
    五分制转换为4.0分制
    :param n: str类型的五分制分数
    :return: float类型的4.0分制分数
    """
    if n == '优秀' or n == '优':
        return 4.0
    elif n == '良好' or n == '良':
        return 3.0
    elif n == '中等' or n == '中':
        return 2.0
    elif n == '及格':
        return 1.0
    elif n == '不及格' or n == '差':
        return 0.0

# 二分制转换为4.0分制
def convert_2_4(n):
    """
    二分制转换为4.0分制
    :param n: str类型的二分制分数
    :return: float类型的4.0分制分数
    """
    if n == '通过':
        return 1.0
    elif n == '不通过':
        return 0.0

# 主程序
def run():

    # 定义初始值
    sum = 0  # 用来累加每行的学分
    sumpro = [0 for i in range(len(method_list))]  # 用来累加method_list中每种方法下的学分*4.0分制成绩

    # 使用pandas读取为DataFrame(数字将自动转换格式)
    data = pd.read_excel(path, index_col=None, header=0)

    # 逐行校验合法性并累加计算
    for i in range(len(data)):
        credit = data.iloc[i, 0]  # 学分
        score = data.iloc[i, 1]  # 成绩

        # 校验学分合法性
        if type(credit) == str:
            print('Excel表中的A' + str(i + 2) + '单元格数值不合法!学分应为非负整数或浮点数!程序异常终止!')
            break
        elif type(credit) == float or type(credit) == int:
            if credit<0:
                print('Excel表中的A' + str(i + 2) + '单元格数值不合法!学分应为非负整数或浮点数!程序异常终止!')
                break

        # 校验成绩合法性并计算GPA
        if type(score) == float or type(score) == int:
            if score < 0 or score > 100:
                print('Excel表中的B' + str(i + 2) + '单元格数值不合法!百分制分数应在0-100之间!程序异常终止!')
                break
            else:
                sum += credit
                sumpro = [sumpro[i] + credit * convert_100_4(score, method_list[i]) for i in range(len(method_list))]

        elif type(score) == str:
            if score in five_list:
                sum += credit
                sumpro = [sumpro[i] + credit * convert_5_4(score) for i in range(len(method_list))]
            elif score in two_list:
                sum += credit
                sumpro = [sumpro[i] + credit * convert_2_4(score) for i in range(len(method_list))]
            else:
                print('Excel表中的B' + str(i + 2) + '单元格数值不合法!未定义的文字型成绩!程序异常终止!')
        print(sumpro)
        print(sum)
    print('计算完毕!使用每种方法计算的GPA分别为:')
    for i in range(len(method_list)):
        print(method_name_list[i]+'\t  '+str(sumpro[i]/sum))

if __name__ == '__main__':
    run()

计算完毕后,结果将以屏幕输出的形式展现:

猜你喜欢

转载自www.cnblogs.com/oddgod/p/12289071.html