import socket as st
import pandas as pd
from matplotlib.gridspec import GridSpec
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc("font", family='KaiTi')
def menu():
print('\t|学生成绩管理系统|\t')
print('*' * 8 + '1统计数据' + '*' * 8)
print('*' * 8 + '2查询成绩' + '*' * 8)
print('*' * 8 + '3绘制图表' + '*' * 8)
def draw():
# C基础的及格率
inf_C = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础')
pass_count = len(inf_C[inf_C['考试成绩'] >= 60])
fail_count = len(inf_C) - len(inf_C[inf_C['考试成绩'] >= 60])
C_pass_rate = pass_count / len(inf_C)
C_fail_rate = fail_count / len(inf_C)
# 数据结构的及格率
inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构')
pass_count = len(inf_data[inf_data['考试成绩'] >= 60])
fail_count = len(inf_data) - len(inf_data[inf_data['考试成绩'] >= 60])
Data_pass_rate = pass_count / len(inf_data)
Data_fail_rate = fail_count / len(inf_data)
# STM32的及格率
inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32')
pass_count = len(inf_STM32[inf_STM32['考试成绩'] >= 60])
fail_count = len(inf_STM32) - len(inf_STM32[inf_STM32['考试成绩'] >= 60])
STM_pass_rate = pass_count / len(inf_STM32)
STM_fail_rate = fail_count / len(inf_STM32)
# C++的及格率
inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++')
pass_count = len(inf_cpp[inf_cpp['考试成绩'] >= 60])
fail_count = len(inf_cpp) - len(inf_cpp[inf_cpp['考试成绩'] >= 60])
Cpp_pass_rate = pass_count / len(inf_cpp)
Cpp_fail_rate = fail_count / len(inf_cpp)
# 创建子图
fig, ax = plt.subplots(2, 2)
# 绘制饼图
labels = ['及格', '不及格']
Csize = [C_pass_rate, C_fail_rate]
Datasize = [Data_pass_rate, Data_fail_rate]
STMsize = [STM_pass_rate, STM_fail_rate]
Cppsize = [Cpp_pass_rate, Cpp_fail_rate]
ax[0, 0].pie(Csize, labels=labels, autopct='%1.1f%%')
ax[0, 0].set_title('C基础')
ax[0, 1].pie(Datasize, labels=labels, autopct='%1.1f%%')
ax[0, 1].set_title('数据结构')
ax[1, 0].pie(STMsize, labels=labels, autopct='%1.1f%%')
ax[1, 0].set_title('STM32')
ax[1, 1].pie(Cppsize, labels=labels, autopct='%1.1f%%')
ax[1, 1].set_title('C++')
# 创建子图
fig = plt.figure(figsize=[10, 9])
gs = GridSpec(3, 2)
# 绘制饼图
labels = ['及格', '不及格']
Csize = [C_pass_rate, C_fail_rate]
Datasize = [Data_pass_rate, Data_fail_rate]
STMsize = [STM_pass_rate, STM_fail_rate]
Cppsize = [Cpp_pass_rate, Cpp_fail_rate]
ax1 = fig.add_subplot(gs[0, 0])
plt.pie(Csize, labels=labels, autopct='%1.1f%%')
plt.title('C基础')
ax2 = fig.add_subplot(gs[0, 1])
plt.pie(Datasize, labels=labels, autopct='%1.1f%%')
plt.title('数据结构')
ax3 = fig.add_subplot(gs[1, 0])
plt.pie(STMsize, labels=labels, autopct='%1.1f%%')
plt.title('STM32')
ax4 = fig.add_subplot(gs[1, 1])
plt.pie(Cppsize, labels=labels, autopct='%1.1f%%')
plt.title('C++')
Cret = inf_C.sort_values('考试成绩', ascending=False, ignore_index=True)
classname = ['C基础', '数据结构', 'STM32', 'C++']
peo = Cret.head()
lst = []
for i in range(5):
lst.append(peo['机位号'][i] - 1)
ctemp = inf_C['考试成绩'].loc[lst[0:5]]
dtemp = inf_data['考试成绩'].loc[lst[0:5]]
stemp = inf_STM32['考试成绩'].loc[lst[0:5]]
cpptemp = inf_cpp['考试成绩'].loc[lst[0:5]]
ax5 = fig.add_subplot(gs[2, :])
for i in range(5):
newlst = [ctemp.iloc[i], dtemp.iloc[i], stemp.iloc[i], cpptemp.iloc[i]]
ax5.plot(classname, newlst, label=f'第{i + 1}')
plt.legend()
plt.savefig('imagin.png')
plt.close()
with open('imagin.png', 'rb') as img: # rb以二进制模式读取文件
tep = img.read() # 获取二进制数据
return tep
def Stat(): # 统计数据
# 统计C语言成绩
inf_C = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础')
c_maxscore = inf_C['考试成绩'].max()
c_minscore = inf_C['考试成绩'].min()
c_averscore = inf_C['考试成绩'].mean()
c_percent_of_pass = inf_C[inf_C['考试成绩'] >= 60].shape[0] / inf_C['考试成绩'].shape[0]
# 统计数据结构成绩
inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构')
data_maxscore = inf_data['考试成绩'].max()
data_minscore = inf_data['考试成绩'].min()
data_averscore = inf_data['考试成绩'].mean()
data_percent_of_pass = inf_data[inf_data['考试成绩'] >= 60].shape[0] / inf_data['考试成绩'].shape[0]
# 统计STM32成绩
inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32')
STM_maxscore = inf_STM32['考试成绩'].max()
STM_minscore = inf_STM32['考试成绩'].min()
STM_averscore = inf_STM32['考试成绩'].mean()
STM_percent_of_pass = inf_STM32[inf_STM32['考试成绩'] >= 60].shape[0] / inf_STM32['考试成绩'].shape[0]
# 统计C++成绩
inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++')
cpp_maxscore = inf_cpp['考试成绩'].max()
cpp_minscore = inf_cpp['考试成绩'].min()
cpp_averscore = inf_cpp['考试成绩'].mean()
cpp_percent_of_pass = inf_cpp[inf_cpp['考试成绩'] >= 60].shape[0] / inf_cpp['考试成绩'].shape[0]
data = {'最高分': [c_maxscore, data_maxscore, STM_maxscore, cpp_maxscore],
'最低分': [c_minscore, data_minscore, STM_minscore, cpp_minscore],
'平均分': [c_averscore, data_averscore, STM_averscore, cpp_averscore],
'及格率': [c_percent_of_pass, data_percent_of_pass, STM_percent_of_pass, cpp_percent_of_pass]}
ind = ['C基础', '数据结构', 'STM32', 'C++']
df = pd.DataFrame(data, index=ind)
# 追加模式
with pd.ExcelWriter('./StudentScore.xlsx', engine='openpyxl', mode='a') as writer:
df.to_excel(writer, index=False,sheet_name='sheet')
return '统计完成'
def searchstu(name):
# 统计各科成绩
inf_c = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础')
inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构')
inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32')
inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++')
scorec = inf_c[inf_c['姓名'] == name]['考试成绩']
scoredata = inf_data[inf_data['姓名'] == name]['考试成绩']
scoreSTM = inf_STM32[inf_STM32['姓名'] == name]['考试成绩']
scorecpp = inf_cpp[inf_cpp['姓名'] == name]['考试成绩']
ret = f"{name}的成绩:C基础:{scorec.iloc[0]},数据结构:{scoredata.iloc[0]},STM32:{scoreSTM.iloc[0]},C++:{scorecpp.iloc[0]}"
print(ret)
return ret
def SearchClassName(classname):
fd = pd.read_excel('./StudentScore.xlsx', sheet_name=classname)
class_maxscore = fd['考试成绩'].max()
class_minscore = fd['考试成绩'].min()
class_averscore = fd['考试成绩'].mean()
class_percent_of_pass = fd[fd['考试成绩'] >= 60].shape[0] / fd['考试成绩'].shape[0]
temp = f'该课程的最高分为:{class_maxscore},最低分为:{class_minscore},平均分为:{class_averscore},及格率为:{class_percent_of_pass}'
print(temp)
return temp
if __name__ == '__main__':
# 创建套接字
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)
# 绑定
sfd.bind(('192.168.8.92', 9999))
# 监听
sfd.listen(5)
# 等待客户端的连接,connect_fd是用于通信的套接字
connect_fd, addr = sfd.accept()
print('连接成功')
while 1:
menu()
buf = connect_fd.recv(32)
if buf.decode() == '1':
temp = Stat()
connect_fd.send(temp.encode())
elif buf.decode() == '2':
print('请输入你想查询的东西,查询学生请按s,查询课程成绩信息请按c:')
num = connect_fd.recv(32)
if num.decode() == 's':
print('请输入学生姓名:')
n = connect_fd.recv(32)
temp = searchstu(n.decode())
connect_fd.send(temp.encode())
elif num.decode() == 'c':
print('请输入要查询的课程:')
n = connect_fd.recv(32)
temp = SearchClassName(n.decode())
connect_fd.send(temp.encode())
elif buf.decode() == '3':
img_bytes = draw()
text = "绘制完成"
connect_fd.send(text.encode())
connect_fd.send(img_bytes)
elif buf.decode() == 'quit':
break
connect_fd.close()
import socket as st
from PIL import Image
import io
import matplotlib.pyplot as plt
def menu():
print('\t|学生成绩管理系统|\t')
print('*' * 8 + '1统计数据' + '*' * 8)
print('*' * 8 + '2查询成绩' + '*' * 8)
print('*' * 8 + '3绘制图表' + '*' * 8)
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)
sfd.connect(('192.168.8.92', 9999))
while 1:
menu()
order1 = input('输入命令:')
if order1 == '1':
sfd.send(order1.encode())
rbuf = sfd.recv(32)
print(rbuf.decode())
if order1 == '2':
sfd.send(order1.encode())
order2 = input('请输入你想查询的东西,查询学生请按s,查询课程成绩信息请按c:')
if order2 == 's' or 'c':
if order2 == 's':
order3 = input('输入学生的姓名:')
elif order2 == 'c':
order3 = input('输入科目的姓名:')
else:
print('输入错误!')
continue
sfd.send(order2.encode())
sfd.send(order3.encode())
rbuf = sfd.recv(256)
print(rbuf.decode())
if order1 == '3':
sfd.send(order1.encode())
txt = sfd.recv(32)
print(txt.decode())
binary_data = sfd.recv(1024)
image_file = io.BytesIO(binary_data)
image = Image.open(image_file)
image.show()
if order1 == 'quit':
sfd.send(order1.encode())
break
sfd.close()
最新发布