更新了一版答案,點(diǎn)此鏈接
新增需求:
1.學(xué)號(hào)遞增,刪除學(xué)員后學(xué)號(hào)不可再用
2.重名檢測(cè),按序列打印學(xué)員,選擇刪除
3.刪除學(xué)員可以選擇按照姓名或者學(xué)號(hào)
4.添加登錄系統(tǒng),不同的賬號(hào)存儲(chǔ)不同的添加內(nèi)容 (已添加)
5.本地文件保存
簡(jiǎn)介:
本項(xiàng)目分為6個(gè)模塊,其中界面模塊為主程序,調(diào)用其他模塊
登錄系統(tǒng)采用賬號(hào)密碼登錄,不同賬號(hào)對(duì)應(yīng)不同班級(jí)學(xué)生列表
在主界面中輸入用戶名,并將用戶名作為參數(shù)傳遞給其他功能模塊函數(shù),用于獲取不同賬號(hào)對(duì)應(yīng)班級(jí)列表
萌新寫的程序,有BUG,重要的事情說(shuō)三遍!
萌新寫的程序,有BUG,重要的事情說(shuō)三遍!
萌新寫的程序,有BUG,重要的事情說(shuō)三遍!
(盡力查找中- -)
1. yxy_interface.py
模塊(界面模塊):主界面程序
from add_stu import add_stu
import check_stu
from delete_stu import del_stu
from revise_stu import revise_stu
import yxy_login
"""
新增需求:
1.學(xué)號(hào)遞增,刪除學(xué)員后學(xué)號(hào)不可再用
2.重名檢測(cè),按序列打印學(xué)員,選擇刪除
3.刪除學(xué)員可以選擇按照姓名或者學(xué)號(hào)
4.添加登錄系統(tǒng),不同的賬號(hào)存儲(chǔ)不同的添加內(nèi)容 (已添加)
5.本地文件保存
"""
def main():
print('簡(jiǎn)易版學(xué)生管理系統(tǒng)登錄界面')
user_name = input('請(qǐng)輸入您的賬號(hào):')
re = yxy_login.login_in(user_name)
if re == 'quit':
print('退出系統(tǒng)')
else:
stus = yxy_login.get_stus(user_name)
stu_num = yxy_login.get_stu_num(user_name)
# 編輯主界面循環(huán)
while True:
print('+' * 60)
print('+' + '歡迎來(lái)到非常非常簡(jiǎn)易版的學(xué)生管理系統(tǒng)^_^'.center(40, ' ') + '+')
print('+' + '1.添加學(xué)生信息'.center(52, ' ') + '+')
print('+' + '2.查詢學(xué)生信息'.center(52, ' ') + '+')
print('+' + '3.刪除學(xué)生信息'.center(52, ' ') + '+')
print('+' + '4.修改學(xué)生信息'.center(52, ' ') + '+')
print('+'+'5.退出'.center(56, ' ')+'+')
print('+' * 60)
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作:'))
if step1 == 5:
break
# 編輯添加學(xué)生的循環(huán)界面
elif step1 == 1:
while True:
add_stu(user_name)
print('1.繼續(xù)添加')
print('2.返回上一步')
step2 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step2 == 2:
break
elif step2 == 1:
continue
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
# 編輯查詢學(xué)生的界面
elif step1 == 2:
while True:
print('1.查詢指定學(xué)生信息')
print('\n2.查詢所有學(xué)生信息')
print('\n3.查詢指定學(xué)生平均分')
print('\n4.返回上一步')
step3 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step3 == 4:
break
elif step3 == 1:
check_stu.search_stu(user_name)
elif step3 == 2:
check_stu.check_all(user_name)
elif step3 == 3:
check_stu.avg_score(user_name)
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
# 編輯刪除學(xué)生的界面
elif step1 == 3:
del_stu(user_name)
# 編輯修改學(xué)生的界面
elif step1 == 4:
revise_stu(user_name)
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
if __name__ == '__main__':
main()
2. yxy_login.py
模塊,登錄模塊,負(fù)責(zé)登錄系統(tǒng)和數(shù)據(jù)的保存和載入
import json
"""
思路:
建立數(shù)據(jù)的結(jié)構(gòu):
老師1 = {'account':輸入賬號(hào), 'password': 輸入密碼}
list1 = [{老師1}, {老師2}]
dict2 = {輸入賬號(hào)1:列表1, 輸入賬號(hào)2:列表2}
dict3 = {輸入賬號(hào)1:學(xué)號(hào)池1,輸入賬號(hào)2:學(xué)號(hào)池2}
登錄后輸入賬號(hào),密碼
保存在dict1中,如果信息不對(duì),返回相應(yīng)提示
如果通過(guò),導(dǎo)入老師對(duì)應(yīng)的列表,以及對(duì)應(yīng)的學(xué)號(hào)池
"""
def print_stu(stu: dict):
"""
定義一個(gè)函數(shù),用來(lái)打印學(xué)生信息
:param stu: 學(xué)生信息對(duì)應(yīng)的字典
:return:
"""
print(
'name: %s, 學(xué)號(hào): %s, 英語(yǔ)成績(jī):%s, 體育成績(jī):%s, 美術(shù)成績(jī): %s,數(shù)學(xué)成績(jī): %s,年齡: %s,' %
(stu['name'], stu['seq'], stu['en_score'], stu['ph_score'], stu['art_score'], stu['math_score'], stu['age'])
)
def save(dict1, filename):
with open('./'+filename, 'w', encoding='utf-8') as fs:
json.dump(dict1, fs)
def load_dict(filename):
try:
with open('./'+filename, 'r', encoding='utf-8') as fs:
dict1 = json.load(fs)
return dict1
except FileNotFoundError:
save({}, filename)
return {}
def load_list(filename):
try:
with open('./'+filename, 'r', encoding='utf-8') as fs:
dict1 = json.load(fs)
return dict1
except FileNotFoundError:
save([], filename)
return []
list_account = load_list('list_account.json')
dict_stus = load_dict('dict_stus.json')
dict_num = load_dict('dict_num.json')
def get_stus(user_name):
stus = dict_stus[user_name] # 班級(jí)列表
return stus
def get_stu_num(user_name):
stu_num = dict_num[user_name] # 學(xué)號(hào)池當(dāng)前可用序列
return stu_num
def register() -> str:
"""
定義一個(gè)注冊(cè)函數(shù),用來(lái)注冊(cè)用戶的賬號(hào)密碼,并保持到本地文件,函數(shù)返回輸入賬號(hào)對(duì)應(yīng)的字符串
:return:
"""
dict_account = {}
print('歡迎來(lái)到注冊(cè)系統(tǒng)!')
account = input('請(qǐng)輸入賬號(hào),按q退出注冊(cè):')
if account == 'q':
print('退出注冊(cè)!')
return 'quit'
while True:
password = input('請(qǐng)輸入密碼,按q退出注冊(cè): ')
if password == 'q':
print('退出注冊(cè)!')
return 'quit'
re_password = input('請(qǐng)?jiān)俅屋斎朊艽a以確認(rèn): ')
if re_password == password:
print('恭喜您注冊(cè)成功!')
dict_account['account'] = account # 初始化賬號(hào)密碼列表
dict_account['password'] = password
list_account.append(dict_account)
save(list_account, 'list_account.json')
dict_stus[account] = [] # 初始化 賬號(hào):班級(jí)列表 字典
dict_num[account] = 1 # 初始化 賬號(hào):學(xué)號(hào)池 字典
save(dict_stus, 'dict_stus.json')
save(dict_num, 'dict_num.json')
return account
else:
print('輸入密碼錯(cuò)誤,請(qǐng)重新創(chuàng)建密碼')
continue
def login_in(user_name):
# 登錄界面循環(huán)
while True:
# 先檢測(cè)賬號(hào),賬號(hào)匹配就檢測(cè)密碼
for item in list_account:
if item['account'] == user_name:
# 檢測(cè)密碼的循環(huán),通過(guò)函數(shù)返回值為賬號(hào),退出返回'quit',輸入錯(cuò)誤循環(huán)輸入
while True:
password = input('請(qǐng)輸入您的密碼,輸入q退出系統(tǒng)')
if password == 'q':
return 'quit'
elif password == item['password']:
print('='*20 + '\n' + 'welcome back!' + user_name + '\n' + '='*20)
return user_name
else:
print('您的密碼不正確,請(qǐng)重新輸入')
continue
# 賬號(hào)不匹配讓用戶進(jìn)行注冊(cè),退出返回'quit',注冊(cè)成功函數(shù)返回用戶名
else:
print('您的賬號(hào)不存在!')
while True:
step1 = int(input('按1注冊(cè)賬號(hào),按0退出系統(tǒng)'))
if step1 == 1:
return register()
elif step1 == 0:
return 'quit'
else:
print('您的輸入不正確!請(qǐng)重新輸入')
continue
3. add_stu.py
模塊,學(xué)生信息添加功能模塊
注意:學(xué)號(hào)基于生成器生成,但是生成器每次運(yùn)行會(huì)重置,所以生成器初始序號(hào)也需要文件保存到本地
import yxy_login
# def save_num(num: int):
# """
# 定義一個(gè)函數(shù),用來(lái)保存當(dāng)前的下一個(gè)學(xué)號(hào)序列
# :param num: 學(xué)號(hào)對(duì)應(yīng)的數(shù)字序列
# :return:
# """
# with open('./stu_num.txt', 'w', encoding='utf-8') as fs:
# fs.write(str(num+1))
#
#
# def load_num():
# """
# 定義一個(gè)函數(shù),用來(lái)讀取當(dāng)前可用的學(xué)號(hào)序列
# :return: 數(shù)字,學(xué)號(hào)序列
# """
# try:
# with open('./stu_num.txt', 'r', encoding='utf-8') as fs:
# num = fs.read()
# return int(num)
# except FileNotFoundError:
# save_num(1)
# return 1
# 定義一個(gè)生產(chǎn)學(xué)號(hào)的生成器
def seq_generator(user_name):
stu_num = yxy_login.get_stu_num(user_name)
num = stu_num # 從保存的本地文件中導(dǎo)入當(dāng)前可用學(xué)號(hào)
if num >= 1000:
print('學(xué)號(hào)超限,請(qǐng)重置')
yield 0
for x in range(num, 10000):
yield x
# 定義一個(gè)全局變量re_seq用來(lái)存放生成器地址
def get_seq(user_name):
"""
定義一個(gè)函數(shù),用來(lái)獲得學(xué)號(hào)
:return: 字符串,學(xué)號(hào)
"""
global re_seq
re_seq = seq_generator(user_name)
num = next(re_seq)
# save_num(num)
yxy_login.dict_num[user_name] = num + 1
yxy_login.save(yxy_login.dict_num, 'dict_num.json')
return 'py1807' + str(num).rjust(4,'0')
def add_stu(user_name):
# 創(chuàng)建一個(gè)函數(shù)用來(lái)添加學(xué)生
infors = {}
# 創(chuàng)建一個(gè)用來(lái)存放輸入學(xué)生信息的字典
name = input('請(qǐng)輸入要添加學(xué)生的姓名: ')
infors['name'] = name.title()
infors['seq'] = get_seq(user_name)
en_score = input('請(qǐng)輸入要添加學(xué)生的英語(yǔ)成績(jī): ')
infors['en_score'] = en_score
ph_score = input('請(qǐng)輸入要添加學(xué)生的體育成績(jī): ')
infors['ph_score'] = ph_score
art_score = input('請(qǐng)輸入要添加學(xué)生的美術(shù)成績(jī): ')
infors['art_score'] = art_score
math_score = input('請(qǐng)輸入要添加學(xué)生的數(shù)學(xué)成績(jī): ')
infors['math_score'] = math_score
age = input('請(qǐng)輸入要添加學(xué)生的年齡: ')
infors['age'] = age
stus = yxy_login.get_stus(user_name)
stus.append(infors)
yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
return stus
4. check_stu.py
模塊,查找功能模塊,刪除和修改功能也會(huì)基于此模塊編寫
import yxy_login
def check_all(user_name):
"""
打印全班所有學(xué)生的信息
:return:
"""
stus = yxy_login.get_stus(user_name)
print('班級(jí)所有學(xué)生信息如下:')
for stu in stus:
yxy_login.print_stu(stu)
# def search_stu_name(name: str) -> list:
# """
# 生成重名列表:根據(jù)姓名查找學(xué)生信息,并將學(xué)生(包括重名的)存入列表
# :return:
# """
# search_list = []
# name = name.title()
# # 使用姓名匹配學(xué)生,將重名學(xué)生存入列表
# for stu in yxy_login.stus:
# if stu['name'] == name:
# search_list.append(stu)
# if not search_list:
# print('該學(xué)生不在班級(jí)里面')
#
# return search_list
def search_stu_name(name: str, user_name) -> list:
"""
生成重名列表:根據(jù)姓名查找學(xué)生信息,并將重名學(xué)生對(duì)應(yīng)在數(shù)據(jù)庫(kù)原列表的下標(biāo)存入列表
:return:
"""
stus = yxy_login.get_stus(user_name)
search_list = []
name = name.title()
# 使用姓名匹配學(xué)生,將重名學(xué)生存入列表
index = 0 # 用來(lái)存放重名學(xué)生在stus列表中的下標(biāo)
for stu in stus:
# print(stu)
if stu['name'] == name:
search_list.append(index)
index += 1
if not search_list:
print('該學(xué)生不在班級(jí)里面')
return search_list
def print_stu_list(search_list: list, user_name):
"""
打印重名學(xué)生信息:根據(jù)按姓名查找返回的結(jié)果列表,打印出學(xué)生的信息
:param search_list:
:return:
"""
stus = yxy_login.get_stus(user_name)
i = 0
for index in search_list:
print('序號(hào):%s ' % (i), end='')
yxy_login.print_stu(stus[index])
i += 1
def return_stu_name(user_name):
"""
輸入學(xué)生名字查找學(xué)生,在重名時(shí),根據(jù)選擇的序號(hào),返回所選擇學(xué)生在數(shù)據(jù)庫(kù)中的元素
如果找不到,返回空字典
:return:
"""
stus = yxy_login.get_stus(user_name)
name = input('請(qǐng)輸入您要查找的學(xué)生的名字:')
search_list = search_stu_name(name, user_name)
if not search_list:
return {}
print_stu_list(search_list, user_name)
num = int(input('請(qǐng)輸入您想選擇的學(xué)生的序號(hào):'))
index = search_list[num]
stu = stus[index]
return stu
def search_stu_num(stu_num: str, user_name) -> dict:
"""
根據(jù)學(xué)號(hào)查找學(xué)生,并返回在數(shù)據(jù)庫(kù)中的元素,沒(méi)有返回為空
:param stu_num: 字符串,學(xué)生學(xué)號(hào)
:return: 學(xué)生對(duì)應(yīng)的字典
"""
stus = yxy_login.get_stus(user_name)
se_stu = {} # 新建字典用來(lái)存放查找結(jié)果
# 根據(jù)學(xué)號(hào)查找,找到就將結(jié)果賦值給se_stu
for stu in stus:
if stu['seq'] == stu_num:
return stu
else:
print('該學(xué)生不在班級(jí)里面')
return {}
def search_stu(user_name):
while True:
print('1.根據(jù)學(xué)生姓名查找')
print('2.根據(jù)學(xué)生學(xué)號(hào)查找')
print('3.返回上一級(jí)')
try:
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step1 == 3:
break
elif step1 == 1:
name = input('請(qǐng)輸入您要查找的學(xué)生的名字:')
search_list = search_stu_name(name, user_name)
print_stu_list(search_list, user_name)
elif step1 == 2:
stu_num = input('請(qǐng)輸入您要查找的學(xué)生的學(xué)號(hào):')
stu = search_stu_num(stu_num, user_name)
yxy_login.print_stu(stu)
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
except ValueError:
print('請(qǐng)輸入對(duì)應(yīng)數(shù)字')
# def avg_score():
# name = input('請(qǐng)輸入要求平均成績(jī)的學(xué)生的姓名: ')
# name = name.title()
# index = 0
# search_dict = {}
# # 使用姓名匹配學(xué)生,將重名學(xué)生存入字典
# for stu in yxy_login.stus:
# if stu['name'] == name:
# print('name: %s, 學(xué)號(hào): %s,' % (stu['name'], stu['seq']))
# search_dict[stu['seq']] = index
# index += 1
# if not search_dict:
# print('您所查找的學(xué)生不在班級(jí)里面')
# elif len(search_dict) == 1:
# for key in search_dict:
# index = search_dict[key]
# se_stu = yxy_login.stus[index]
# avg = (int(se_stu['en_score']) + int(se_stu['ph_score']) + int(se_stu['art_score']) + int(
# se_stu['math_score'])) / 4
# print('您要查詢的學(xué)生的平均成績(jī)?yōu)?.1f' % (avg))
# else:
# search_num = input('請(qǐng)輸入您要查詢的以上學(xué)生的學(xué)號(hào)以確認(rèn): ')
# search_index = search_dict[search_num]
# se_stu = yxy_login.stus[search_index]
# avg = (int(se_stu['en_score']) + int(se_stu['ph_score']) + int(se_stu['art_score']) + int(se_stu['math_score']))/4
# print('您要查詢的學(xué)生的平均成績(jī)?yōu)?.1f' % (avg))
def get_avg(stu: dict):
avg = (int(stu['en_score']) + int(stu['ph_score']) + int(stu['art_score']) + int(stu['math_score']))/4
print('該學(xué)生的平均分為:%s' % (avg))
return avg
def avg_score(user_name):
while True:
print('1.根據(jù)學(xué)生姓名查詢平均分')
print('2.根據(jù)學(xué)生學(xué)號(hào)查詢平均分')
print('0.返回上一級(jí)')
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step1 == 0:
break
elif step1 == 1:
stu = return_stu_name(user_name) # 調(diào)用輸入姓名,并選擇序號(hào)后,返回所選擇學(xué)生在數(shù)據(jù)庫(kù)中元素的函數(shù)
get_avg(stu)
elif step1 == 2:
stu_num = input('請(qǐng)輸入您要查找的學(xué)生的學(xué)號(hào):')
stu = search_stu_num(stu_num, user_name)
yxy_login.print_stu(stu)
get_avg(stu)
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
5. delete_stu.py
模塊,刪除學(xué)生信息功能模塊
import yxy_login
import check_stu
# def del_from_list(del_stu: dict):
# """
# 根據(jù)學(xué)生所對(duì)應(yīng)的字典,去班級(jí)學(xué)生列表中刪除學(xué)生
# :param stu:
# :return:
# """
# stu_num = del_stu['seq']
# for stu in yxy_login.stus.copy():
# if stu['seq'] == stu_num:
# yxy_login.stus.remove(stu)
# break
def del_stu(user_name):
"""
刪除指定的學(xué)生
:return:
"""
stus = yxy_login.get_stus(user_name)
while True:
print('1.根據(jù)名字刪除')
print('2.根據(jù)學(xué)號(hào)刪除')
print('3.返回上一級(jí)')
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step1 == 3:
break
elif step1 == 1:
stu = check_stu.return_stu_name(user_name) # 調(diào)用輸入姓名,并選擇序號(hào)后,返回所選擇學(xué)生在數(shù)據(jù)庫(kù)中元素的函數(shù)
# print(stu)
stus.remove(stu)
yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
print('恭喜恭喜恭喜您!刪除成功')
elif step1 == 2:
stu_num = input('請(qǐng)輸入您要?jiǎng)h除的學(xué)生的學(xué)號(hào):')
stu = check_stu.search_stu_num(stu_num, user_name)
stus.remove(stu)
yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
print('恭喜恭喜恭喜您!刪除成功')
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
6. revise_stu.py
模塊,修改學(xué)生信息功能模塊
import yxy_login
import check_stu
def revise_specified(stu: dict):
"""
輸入指定的學(xué)生在數(shù)據(jù)庫(kù)的元素,并修改指定的值
:param stu:
:return:
"""
while True:
print('1.修改姓名')
print('2.修改英語(yǔ)成績(jī)')
print('3.修改體育成績(jī)')
print('4.修改美術(shù)成績(jī)')
print('5.修改數(shù)學(xué)成績(jī)')
print('6.修改年齡')
print('0.返回上一級(jí)')
r_key = int(input('請(qǐng)輸入您想進(jìn)行的操作:'))
if r_key == 0:
break
elif r_key == 1:
r_key = 'name'
elif r_key == 2:
r_key = 'en_score'
elif r_key == 3:
r_key = 'ph_score'
elif r_key == 4:
r_key = 'art_score'
elif r_key == 5:
r_key = 'math_score'
elif r_key == 6:
r_key = 'age'
else:
print('輸入錯(cuò)誤,請(qǐng)重新輸入: ')
continue
r_value = input('請(qǐng)修改所選項(xiàng)的值:')
if r_key == 'name':
stu[r_key] = r_value.title()
else:
stu[r_key] = r_value
return stu
def revise_all(stu):
keys = list(stu)
for key in keys:
if key == 'seq':
break
value = input('請(qǐng)依次輸入需要修改的學(xué)生信息')
stu[key] = value
return stu
def revise_menu(stu):
while True:
print('1.修改該學(xué)生全部信息')
print('2.修改指定項(xiàng)信息')
print('0.返回上一級(jí)')
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step1 == 0:
break
elif step1 == 1:
revise_all(stu)
print('恭喜恭喜恭喜您!修改成功')
elif step1 == 2:
revise_specified(stu)
print('恭喜恭喜恭喜您!修改成功')
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')
def revise_stu(user_name):
while True:
print('1.根據(jù)名字查找需要修改的學(xué)生')
print('2.根據(jù)學(xué)號(hào)查找需要修改的學(xué)生')
print('3.返回上一級(jí)')
step1 = int(input('請(qǐng)輸入您想進(jìn)行的操作: '))
if step1 == 3:
break
elif step1 == 1:
stu = check_stu.return_stu_name(user_name) # 調(diào)用輸入姓名,并選擇序號(hào)后,返回所選擇學(xué)生在數(shù)據(jù)庫(kù)中元素的函數(shù)
revise_menu(stu)
yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
elif step1 == 2:
stu_num = input('請(qǐng)輸入您要查找的學(xué)生的學(xué)號(hào):')
stu = check_stu.search_stu_num(stu_num, user_name)
yxy_login.print_stu(stu)
revise_menu(stu)
yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
else:
print('輸入錯(cuò)誤,請(qǐng)重新選擇:')