Python版GPA計算器


最近在網申投簡歷時遇到一個需要計算GPA的問題,想起自己在上學時寫的Excel公式版GPA計算器略顯low,而且操作也比較復雜,於是一時興起,寫了個Python版的,在此分享給大家!

准備工作:
用戶事先准備好如下圖所示的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
    elif 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
    elif 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 isinstance(credit, str):
            print('Excel表中的A' + str(i + 2) + '單元格數值不合法!學分應為非負整數或浮點數!程序異常終止!')
            break
        elif credit<0:
            print('Excel表中的A' + str(i + 2) + '單元格數值不合法!學分應為非負整數或浮點數!程序異常終止!')
            break

        # 校驗成績合法性並計算GPA
        if isinstance(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) + '單元格數值不合法!未定義的文字型成績!程序異常終止!')
                break
        elif 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))]

    else:
        print('計算完畢!使用每種方法計算的GPA分別為:')
        for i in range(len(method_list)):
            print(method_name_list[i]+'\t  '+str(sumpro[i]/sum))

if __name__ == '__main__':
    run()

計算完畢后,結果將以屏幕輸出的形式展現:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM