GPACalculating

某大专GPA计算小脚本

1. GPA计算规则

GPA计算详细规则

2. Python脚本

安装依赖包

该脚本有简单的GUI界面,需要使用到python的GUI库tkinter

测试是否有该依赖库。使用终端运行python后引入包tkinter,不报错,即可,如下:

若出现报错信息,则手动安装即可pip install tk

输入文件格式

参考如上格式

输入文档说明:

文档格式: .txt
文档内容:成绩列表
内容格式:
> #term1 :学期标记,每学期数据的第一行,为无空格的整行字符
> CourseName Credit Score OP: 各字段顺序不能改变,中间以空格或英文逗号,分隔开
> > CourseName:课程名,名称内无空格
> > Credit:学分,可为整数或小数
> > Score:课程得分,可为整数或小数
> > Score:课程类型,可填0/10代表非必修/非核专(本大专特色课程类别划分),1代表必修/核专

运行示例

运行后出现如下界面:

请选择输入文件

点击Open file按钮,选定输入文件后得到计算结果:

结果展示

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import tkinter as tk
from tkinter import filedialog

def GPA(list):
sum_credit = 0 # 全部科目
sum_credit_ = 0 # 必修科目 (op == 1)
sum_ave = 0 # 全部
sum_ave_ = 0 # 必修
sum_gpa = 0
for sub in list:
credit = sub[1]
score = sub[2]
op = sub[3] # 必修科目 (op == 1)
gpa = 4.0 - (100 - score) ** 2 * 3.0 / 1600.0
if score < 60:
gpa = 0
elif score == 60:
gpa = 1.0
sum_gpa += gpa * credit
if op == 1:
sum_ave_ += score * credit
sum_credit_ += credit
sum_ave += score * credit
sum_credit += credit
gpa = sum_gpa / sum_credit
ave = sum_ave / sum_credit #全部课加权平均分
ave_ = sum_ave_ / sum_credit_ if sum_credit_ != 0 else 0 #必修课加权平均分
return [gpa, ave, ave_]

def open_file():
global term_text, sum_data_labels, term_labels
filepath = filedialog.askopenfilename(
title="选择文件",
filetypes=(("Text files", "*.txt"), ("All files", "*.*"))
)
subject = [] # 所有学期课程的数据列表
term = [[] for _ in range(10)] #各学期课程的数据列表
count = 0
if not filepath:
return
with open(filepath, encoding='utf-8', mode='r') as f:
while True:
line = f.readline().strip()
print(line,end='\n')
if not line:
break
items = line.split()
if len(items) == 1:
count += 1
elif len(items) == 4:
this_name, this_credit, this_score, this_op = items
subject.append([this_name, float(this_credit), float(this_score), int(this_op)])
term[count].append([this_name, float(this_credit), float(this_score), int(this_op)])
else:
print("读取完毕")
return
sum_data = GPA(subject)
Term = [GPA(term[i+1]) for i in range(count)]

# 清除旧的数据
term_text.delete('1.0', tk.END)
for i, term in enumerate(Term):
term_text.insert(tk.END, f"Term {i + 1}: GPA={term[0]:.4f}, 全部课加权平均={term[1]:.4f},必修课加权平均={term[2]:.4f}\n")

# 更新总成绩信息
sum_data_labels[0]['text'] = f"所有学期GPA: {sum_data[0]:.4f}"
sum_data_labels[1]['text'] = f"所有学期所有课程加权平均: {sum_data[1]:.4f}"
sum_data_labels[2]['text'] = f"所有学期必修课程加权平均: {sum_data[2]:.4f}"

def create_gui():
root = tk.Tk()
root.title("GPA Calculator")

button = tk.Button(root, text="Open File", command=open_file)
button.pack()

# 创建一个 Text 控件来显示学期成绩信息
global term_text
term_text = tk.Text(root, wrap=tk.WORD)
term_text.pack(expand=True, fill=tk.BOTH)

# 创建 Label 控件来显示总成绩信息
global sum_data_labels
sum_data_labels = [
tk.Label(root, text="Total GPA:"),
tk.Label(root, text="Total Average:"),
tk.Label(root, text="Required Average:")
]
for label in sum_data_labels:
label.pack()

root.mainloop()

if __name__ == '__main__':
create_gui()

上述代码中有相关的注释,若GPA计算方法不同,可更改GPA()函数部分。


GPACalculating
https://ljxkkk0.github.io/Blogs/Python/Python实用小脚本/GPACalculating/
作者
ljx
发布于
2024年7月29日
许可协议