一級a做爰片免費(fèi)網(wǎng)站志鴻優(yōu)化設(shè)計(jì)答案網(wǎng)
🎩 歡迎來到技術(shù)探索的奇幻世界👨?💻
📜 個(gè)人主頁:@一倫明悅-CSDN博客
?🏻 作者簡介:?C++軟件開發(fā)、Python機(jī)器學(xué)習(xí)愛好者
🗣??互動(dòng)與支持:💬評論?? ? ?👍🏻點(diǎn)贊?? ? ?📂收藏?? ? 👀關(guān)注+
如果文章有所幫助,歡迎留下您寶貴的評論,
點(diǎn)贊加收藏支持我,點(diǎn)擊關(guān)注,一起進(jìn)步!
目錄
前言 ? ?? ? ? ??
正文
01-需求分析? ? ? ? ? ??
02-功能演示? ? ? ? ? ??
03-錄入學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
04-查找學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
05-刪除學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
06-修改學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
07-對學(xué)生成績進(jìn)行排序功能實(shí)現(xiàn)? ? ? ? ? ??
08-統(tǒng)計(jì)學(xué)生總?cè)藬?shù)功能實(shí)現(xiàn)? ? ? ? ? ??
09-顯示所有學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
總結(jié)?
01-整體代碼實(shí)現(xiàn)? ? ? ? ??
前言 ? ?? ? ? ??
????????Python是一種高級編程語言,以其簡潔易讀的語法而聞名。它支持面向?qū)ο?、命令式、函?shù)式和過程式編程范式。Python由Guido van Rossum于1991年創(chuàng)立,如今已成為最受歡迎的編程語言之一。它在許多領(lǐng)域得到廣泛應(yīng)用,包括Web開發(fā)、科學(xué)計(jì)算、人工智能、數(shù)據(jù)分析和自動(dòng)化腳本等。Python的核心特點(diǎn)包括動(dòng)態(tài)類型、自動(dòng)內(nèi)存管理和廣泛的標(biāo)準(zhǔn)庫,其中包含了許多用于各種任務(wù)的模塊和功能。Python的生態(tài)系統(tǒng)也非常豐富,擁有大量的第三方庫和框架,使開發(fā)人員能夠快速構(gòu)建復(fù)雜的應(yīng)用程序。
正文
01-需求分析? ? ? ? ? ??
????????'''學(xué)生管理系統(tǒng)應(yīng)該具備的功能'''
1,添加學(xué)生及成績信息
? ? ? ?2,將學(xué)生信息保存在文件中
3,修改和刪除學(xué)生信息? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4,查詢學(xué)生信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5,根據(jù)學(xué)生成績進(jìn)行排序? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6,統(tǒng)計(jì)學(xué)生的總分
02-功能演示? ? ? ? ? ??
? ? ?下面對系統(tǒng)實(shí)現(xiàn)的功能進(jìn)行演示一下,后面會(huì)給出分段代碼解釋和整體代碼
????????運(yùn)行之后,界面如下:各種功能選擇項(xiàng)
????????選擇功能1,可以進(jìn)行添加學(xué)生信息操作,如下圖所示:添加張三和學(xué)號,以及各科成績,最后可以選擇是否繼續(xù)添加。
????????選擇功能2,可以進(jìn)行查詢學(xué)生信息,如下圖所示:兩種查詢方式
????????請選擇2
????????按學(xué)號查找請輸入1,按姓名查找請輸入22
????????請輸入要查找學(xué)生的姓名:張三
????????? id ??? ? ? ? 姓名 ? ? ?? ? ?英語成績 ??? ? python成績 ?? ? ?java成績 ??? ? ?總成績 ??
?????????1001 ?? ? ? ? 張三 ? ? ?? ? ? 98 ? ?? ? ? ?96 ? ??? ? ? ?99 ? ??? ? ?293 ??
????????是否繼續(xù)執(zhí)行查詢操作?y/n
????????y
????????按學(xué)號查找請輸入1,按姓名查找請輸入21
????????請輸入要查找學(xué)生的id:1001
????????? id ??? ? ? ? 姓名 ? ? ?? ? ?英語成績 ??? ? python成績 ?? ? ?java成績 ??? ? ?總成績 ??
?????????1001 ?? ? ? ? 張三 ? ? ?? ? ? 98 ? ?? ? ? ?96 ? ??? ? ? ?99 ? ??? ? ?293 ??
????????是否繼續(xù)執(zhí)行查詢操作?y/n
????????選擇功能4,修改學(xué)生信息,如下圖所示:
????????請輸入需要修改學(xué)生的id:1002
????????找到學(xué)生相關(guān)信息,可以修改他的相關(guān)信息了!!!
????????請輸入名字:李四
????????請輸入英語成績:100
????????請輸入python成績:100
????????請輸入java成績100
????????修改成功
????????是否繼續(xù)修改其他學(xué)生的信息?y/n
????????選擇功能5,學(xué)生信息排序,如下圖所示:也有多種排序方式
????????請選擇5
? ????????id ??? ? ? ? 姓名 ? ? ?? ? ?英語成績 ??? ? python成績 ?? ? ?java成績 ??? ? ?總成績 ??
?????????1001 ?? ? ? ? 張三 ? ? ?? ? ? 98 ? ?? ? ? ?96 ? ??? ? ? ?99 ? ??? ? ?293 ??
?????????1002 ?? ? ? ? 李四 ? ? ?? ? ?100 ? ?? ? ? 100 ? ??? ? ? 100 ? ??? ? ?300 ??
????????請選擇(0.升序 1.降序)1
????????請選擇排序方式(1.英語成績排序 2.python成績排序 3.java成績排序 0.總成績排序)1
? ????????id ??? ? ? ? 姓名 ? ? ?? ? ?英語成績 ??? ? python成績 ?? ? ?java成績 ??? ? ?總成績 ??
?????????1002 ?? ? ? ? 李四 ? ? ?? ? ?100 ? ?? ? ? 100 ? ??? ? ? 100 ? ??? ? ?300 ??
?????????1001 ?? ? ? ? 張三 ? ? ?? ? ? 98 ? ?? ? ? ?96 ? ??? ? ? ?99 ? ??? ? ?293 ??
????????選擇功能6,統(tǒng)計(jì)學(xué)生總?cè)藬?shù),如下圖所示:
?????????選擇功能7,顯示所有學(xué)生信息,如下圖所示:
03-錄入學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?1,表示錄入學(xué)生信息,調(diào)用insert()函數(shù),函數(shù)如下
????????代碼解釋如下:這段代碼定義了一個(gè)函數(shù)insert()
,它的作用是用來錄入學(xué)生信息并將信息保存到一個(gè)列表中,最后將列表保存到文件中。:
-
def insert():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為insert
。 -
student_list = []
: 創(chuàng)建一個(gè)空列表student_list
,用于存儲(chǔ)錄入的學(xué)生信息。 -
while True:
: 進(jìn)入一個(gè)無限循環(huán),用于不斷地錄入學(xué)生信息,直到用戶選擇退出。 -
id = input('請輸入學(xué)號(如1001):')
: 提示用戶輸入學(xué)號,并將輸入的值賦給變量id
。 -
if not id:
: 如果學(xué)號為空(用戶沒有輸入),則執(zhí)行break
語句退出循環(huán),即結(jié)束錄入信息操作。 -
name = input('請輸入姓名:')
: 提示用戶輸入姓名,并將輸入的值賦給變量name
。 -
if not name:
: 如果姓名為空(用戶沒有輸入),則執(zhí)行break
語句退出循環(huán),即結(jié)束錄入信息操作。 -
try:
: 使用try
語句開始嘗試錄入成績信息,因?yàn)槌煽冇锌赡茕浫脲e(cuò)誤,所以使用異常處理。 -
english = int(input('請輸入英語成績:'))
: 提示用戶輸入英語成績,并將輸入的字符串轉(zhuǎn)換為整數(shù)類型,并將其賦給變量english
。 -
python = int(input('請輸入python成績:'))
: 提示用戶輸入Python成績,并將輸入的字符串轉(zhuǎn)換為整數(shù)類型,并將其賦給變量python
。 -
java = int(input('請輸入Java成績:'))
: 提示用戶輸入Java成績,并將輸入的字符串轉(zhuǎn)換為整數(shù)類型,并將其賦給變量java
。 -
except:
: 如果輸入的成績無效(無法轉(zhuǎn)換為整數(shù)),則執(zhí)行except
語句塊,打印錯(cuò)誤提示信息并繼續(xù)循環(huán)。 -
student = {'id':id,'name':name,'english':english,'python':python,'java':java}
: 將錄入的學(xué)生信息保存到一個(gè)字典student
中,包括學(xué)號、姓名、英語成績、Python成績和Java成績。 -
student_list.append(student)
: 將學(xué)生信息字典student
添加到列表student_list
中。 -
anewer = input('是否繼續(xù)添加?y/n\n')
: 提示用戶是否繼續(xù)添加學(xué)生信息,用戶輸入y
表示繼續(xù),輸入其他任意值表示退出。 -
if anewer=='y': continue else: break
: 根據(jù)用戶輸入的選擇,如果是y
則繼續(xù)循環(huán),否則執(zhí)行break
語句退出循環(huán)。 -
最后,如果退出循環(huán),即用戶不再添加學(xué)生信息,則調(diào)用一個(gè)未定義的
save()
函數(shù)來保存學(xué)生信息到文件中(你需要自行定義該函數(shù)),并輸出"學(xué)生信息錄入完畢!!!"的提示信息。
def insert(): # 定義insert()函數(shù),錄入學(xué)生信息student_list = [] # 創(chuàng)建一個(gè)列表,用于存儲(chǔ)錄入的學(xué)生信息while True: # 循環(huán)錄入學(xué)生信息id = input('請輸入學(xué)號(如1001):')if not id: # 如果沒有輸入學(xué)號或者輸入錯(cuò)誤,則執(zhí)行break,退出錄入信息操作breakname = input('請輸入姓名:')if not name: # 如果是空的,則執(zhí)行breakbreak# 然后開始錄入成績信息,但是成績有可能錄入錯(cuò)誤,因此用try...except...保證異常處理try:english = int(input('請輸入英語成績:'))python = int(input('請輸入python成績:'))java = int(input('請輸入Java成績:'))except: #當(dāng)你輸入的成績無效時(shí),會(huì)執(zhí)行except語句print('輸入無效,不是整數(shù)類型,請重新輸入')continue# 將錄入的學(xué)生信息保存到字典student = {'id':id,'name':name,'english':english,'python':python,'java':java}# 將學(xué)生信息添加到列表中student_list.append(student)anewer = input('是否繼續(xù)添加?y/n\n')if anewer=='y':continueelse:break2# 信息添加之后,將信息保存到文件中,需要退出循環(huán)# 調(diào)用save()函數(shù),保存信息save(student_list) # save()函數(shù)未定義,需要自行定義print('學(xué)生信息錄入完畢!!!')
04-查找學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?2,表示查找學(xué)生信息,調(diào)用search()函數(shù),函數(shù)如下
????????代碼解釋如下:這段代碼定義了一個(gè)名為search()
的函數(shù),其作用是用于查找學(xué)生信息。
-
def search():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為search
。 -
student_query = []
: 創(chuàng)建一個(gè)空列表student_query
,用于存儲(chǔ)查詢到的學(xué)生信息。 -
while True:
: 進(jìn)入一個(gè)無限循環(huán),直到用戶選擇退出查詢操作。 -
id = ''
和name = ''
: 初始化兩個(gè)變量id
和name
為空字符串,用于存儲(chǔ)用戶輸入的學(xué)號和姓名。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(未提供filename
變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
mode = input('按學(xué)號查找請輸入1,按姓名查找請輸入2')
: 提示用戶選擇查詢方式,1表示按學(xué)號查詢,2表示按姓名查詢。 -
if mode == '1':
: 如果用戶選擇按學(xué)號查詢,則要求用戶輸入要查找學(xué)生的學(xué)號。 -
elif mode=='2':
: 如果用戶選擇按姓名查詢,則要求用戶輸入要查找學(xué)生的姓名。 -
else:
: 如果用戶輸入有誤(既不是1也不是2),則輸出錯(cuò)誤提示信息并重新調(diào)用search()
函數(shù)以重新執(zhí)行查詢操作。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 打開指定的文件進(jìn)行讀取操作,使用with
語句可以確保文件在使用后被正確關(guān)閉。 -
student = rfile.readlines()
: 讀取文件中的所有內(nèi)容,并將每行內(nèi)容存儲(chǔ)在列表student
中。 -
for item in student:
: 遍歷student
列表中的每一行內(nèi)容。 -
d =dict(eval(item))
: 將每行內(nèi)容轉(zhuǎn)換為字典類型,并賦給變量d
,這里使用eval()
函數(shù)將字符串轉(zhuǎn)換為字典類型。 -
if id != '':
和if name != '':
: 如果用戶輸入了學(xué)號或姓名(即不為空),則執(zhí)行相應(yīng)的查詢操作。 -
student_query.append(d)
: 將符合查詢條件的學(xué)生信息字典添加到student_query
列表中。 -
show_student(student_query)
: 調(diào)用一個(gè)未定義的show_student()
函數(shù)來顯示查詢結(jié)果,你需要自行定義該函數(shù)。 -
student_query.clear()
: 清空student_query
列表,以便下一次查詢使用。 -
answer = input('是否繼續(xù)執(zhí)行查詢操作?y/n\n')
: 提示用戶是否繼續(xù)執(zhí)行查詢操作,如果用戶輸入y
則繼續(xù),否則執(zhí)行break
語句退出循環(huán)。 -
else:
: 如果指定的文件不存在,則輸出提示信息"未錄入學(xué)生信息"并返回,即結(jié)束函數(shù)的執(zhí)行。
def search(): # 定義search()函數(shù),查找學(xué)生信息student_query = []while True:id = ''name = ''if os.path.exists(filename):# 現(xiàn)在分模式查找,1代表使用id查找,2代表使用name查找mode = input('按學(xué)號查找請輸入1,按姓名查找請輸入2')if mode == '1': # 需要加上單引號,因?yàn)檩斎氲氖亲址?#xff0c;并未轉(zhuǎn)變類型id = input('請輸入要查找學(xué)生的id:')elif mode=='2': # elif就相當(dāng)于else if的功能,主要在有多個(gè)選擇時(shí)使用,因?yàn)閕f先用來判斷是否為1# 下面還有兩個(gè)選擇,就是2和其他的數(shù),因此不能直接用else,還要用elif判斷一下是否為2name = input('請輸入要查找學(xué)生的姓名:')else:print('您的輸入有誤,請重新輸入')search() #輸入錯(cuò)了,就重新調(diào)用函數(shù),也可以使用continuewith open(filename,'r',encoding='UTF-8') as rfile: # 讀取內(nèi)容,將所有內(nèi)容放在student文件中student = rfile.readlines()for item in student: # 遍歷student列表d =dict(eval(item)) # 字符串轉(zhuǎn)成字典類型if id != '':if d['id'] ==id:student_query.append(d)if name != '':if d['name'] == name:student_query.append(d)# 顯示查詢結(jié)果show_student(student_query) # 定義show_student函數(shù)# 清空列表student_query.clear()answer = input('是否繼續(xù)執(zhí)行查詢操作?y/n\n')if answer=='y':continueelse:breakelse:print('未錄入學(xué)生信息')return
05-刪除學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?3,表示刪除學(xué)生信息,調(diào)用delete()函數(shù),函數(shù)如下
????????代碼解釋如下,這段代碼定義了一個(gè)名為delete()
的函數(shù),其作用是用于刪除學(xué)生信息。:
-
def delete():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為delete
。 -
while True:
: 進(jìn)入一個(gè)無限循環(huán),直到用戶選擇退出刪除操作。 -
student_id = input('請輸入要?jiǎng)h除的學(xué)生的id:')
: 提示用戶輸入要?jiǎng)h除的學(xué)生的學(xué)號。 -
if student_id!='':
: 檢查用戶輸入的學(xué)號是否不為空。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(同樣未提供filename
變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as file:
: 使用with
語句打開文件進(jìn)行讀取操作。 -
student_old = file.readlines()
: 將文件中的所有內(nèi)容讀取到列表student_old
中。 -
flag = False
: 初始化一個(gè)標(biāo)記變量flag
,用于標(biāo)記是否刪除了學(xué)生信息。 -
if student_old:
: 如果student_old
列表不為空(即文件中存在學(xué)生信息),則執(zhí)行下面的操作。 -
with open(filename,'w',encoding='UTF-8') as wfile:
: 使用with
語句打開文件進(jìn)行寫入操作,這里打開方式為覆蓋寫入('w’模式)。 -
for item in student_old:
: 遍歷student_old
列表中的每個(gè)學(xué)生信息。 -
d =dict(eval(item))
: 將每行內(nèi)容(學(xué)生信息)轉(zhuǎn)換為字典類型,并賦給變量d
,這里使用eval()
函數(shù)將字符串轉(zhuǎn)換為字典類型。 -
if d['id']!= student_id:
: 檢查當(dāng)前學(xué)生信息的學(xué)號是否與用戶輸入的學(xué)號不相等,如果不相等則寫入到新文件中(相當(dāng)于刪除了這條學(xué)生信息)。 -
else:
: 如果當(dāng)前學(xué)生信息的學(xué)號與用戶輸入的學(xué)號相等,則將標(biāo)記變量flag
設(shè)為True
,表示找到了要?jiǎng)h除的學(xué)生信息。 -
if flag==1:
: 如果flag
為True
(1),則輸出刪除成功的提示信息。 -
else:
: 如果flag
為False
,則輸出未找到要?jiǎng)h除的學(xué)生信息的提示信息。 -
show()
: 調(diào)用一個(gè)未定義的show()
函數(shù)來重新顯示全部學(xué)生信息,你需要自行定義該函數(shù)。 -
answer = input('是否繼續(xù)刪除學(xué)生信息?y/n\n')
: 提示用戶是否繼續(xù)執(zhí)行刪除操作,如果用戶輸入y
則繼續(xù),否則執(zhí)行break
語句退出循環(huán)。
def delete(): # 定義delete()函數(shù),刪除學(xué)生信息while True:student_id = input('請輸入要?jiǎng)h除的學(xué)生的id:')if student_id!='':# 當(dāng)輸入的id之后,則不是空的,此時(shí)要判斷導(dǎo)入id是否在文件中,使用os模塊if os.path.exists(filename): # 判斷文件是否存在with open(filename,'r',encoding='UTF-8') as file:student_old = file.readlines() # 如果存在,讀取學(xué)生的信息,將其添加到列表當(dāng)中else: # 如果不存在student_old=[] # 建立一個(gè)空列表flag = False # 標(biāo)記是否刪除if student_old: # 這里表示如果列表student_old為真,則執(zhí)行下面with語句with open(filename,'w',encoding='UTF-8') as wfile: # 使用上下管理器,寫入d ={} # 創(chuàng)建一個(gè)空字典for item in student_old: # 遍歷student_old中的信息d=dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['id']!= student_id: # 判斷是否與輸入的信息相等wfile.write(str(d)+'\n') # 不相等,則寫入d字典中else:flag = True # 相等則執(zhí)行刪除操作if flag==1:print(f'id為{student_id}的學(xué)生信息已被刪除')else:print(f'沒有找到id為{student_id}的學(xué)生信息')else: # 文件不存在print('無學(xué)生信息')breakshow() # 刪除之后重新顯示全部學(xué)生信息answer = input('是否繼續(xù)刪除學(xué)生信息?y/n\n')if answer == 'y':continueelse:break
06-修改學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?4,表示修改學(xué)生信息,調(diào)用modify()函數(shù),函數(shù)如下
????????代碼解釋如下,這段代碼定義了一個(gè)名為?modify()
?的函數(shù),其作用是用于修改學(xué)生信息。
-
def modify():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為?modify
。 -
show()
: 調(diào)用一個(gè)未定義的?show()
?函數(shù)來顯示全部學(xué)生信息,你需要自行定義該函數(shù)。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(同樣未提供?filename
?變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用?with
?語句打開文件進(jìn)行讀取操作。 -
student_old = rfile.readlines()
: 將文件中的所有內(nèi)容讀取到列表?student_old
?中,每行內(nèi)容作為列表的一個(gè)元素。 -
student_id = input('請輸入需要修改學(xué)生的id:')
: 提示用戶輸入需要修改的學(xué)生的學(xué)號。 -
if student_id != '':
: 檢查用戶輸入的學(xué)號是否不為空。 -
with open(filename,'w',encoding='UTF-8') as wfile:
: 使用?with
?語句打開文件進(jìn)行寫入操作,這里打開方式為覆蓋寫入(‘w’ 模式)。 -
for item in student_old:
: 遍歷?student_old
?列表中的每個(gè)學(xué)生信息。 -
d = dict(eval(item))
: 將每行內(nèi)容(學(xué)生信息)轉(zhuǎn)換為字典類型,并賦給變量?d
,這里使用?eval()
?函數(shù)將字符串轉(zhuǎn)換為字典類型。 -
if d['id'] == student_id:
: 檢查當(dāng)前學(xué)生信息的學(xué)號是否與用戶輸入的學(xué)號相等,如果相等則表示找到了要修改的學(xué)生信息。 -
while True:
: 進(jìn)入一個(gè)無限循環(huán),直到用戶輸入正確的信息。 -
try:
: 嘗試執(zhí)行下面的代碼塊。 -
d['name'] = input('請輸入名字:')
: 提示用戶輸入新的名字,并更新到學(xué)生信息中。 -
d['english'] = input('請輸入英語成績:')
: 提示用戶輸入新的英語成績,并更新到學(xué)生信息中。 -
d['python'] = input('請輸入python成績:')
: 提示用戶輸入新的Python成績,并更新到學(xué)生信息中。 -
d['java'] = input('請輸入java成績:')
: 提示用戶輸入新的Java成績,并更新到學(xué)生信息中。 -
except:
: 如果用戶輸入有誤,則執(zhí)行下面的代碼塊。 -
break
: 如果用戶輸入正確,跳出無限循環(huán)。 -
wfile.write(str(d)+'\n')
: 將更新后的學(xué)生信息寫入到文件中。 -
answer = input('是否繼續(xù)修改其他學(xué)生的信息?y/n\n')
: 提示用戶是否繼續(xù)執(zhí)行修改操作,如果用戶輸入?y
?則繼續(xù),否則結(jié)束函數(shù)。 -
if answer=='y': modify()
: 如果用戶選擇繼續(xù)修改其他學(xué)生信息,則遞歸調(diào)用?modify()
?函數(shù)。
def modify(): # 定義modify()函數(shù),修改學(xué)生信息show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_old = rfile.readlines() # readlines() 函數(shù)用于讀取文件中的所有行,然后將起放入創(chuàng)建的列表中else:return # 文件不存在,結(jié)束函數(shù)student_id = input('請輸入需要修改學(xué)生的id:')if student_id != '':if os.path.exists(filename):with open(filename,'w',encoding='UTF-8') as wfile:for item in student_old:d = dict(eval(item))if d['id'] == student_id:print('找到學(xué)生相關(guān)信息,可以修改他的相關(guān)信息了!!!')while True:try:d['name'] = input('請輸入名字:')d['english'] = input('請輸入英語成績:')d['python'] = input('請輸入python成績:')d['java'] = input('請輸入java成績')except:print('輸入有誤,請重新輸入') # 如果輸入有誤,則會(huì)繼續(xù)執(zhí)行while trueelse:break# 如果都沒輸入錯(cuò)誤,則使用write寫入wfile.write(str(d)+'\n')print('修改成功')# 一些學(xué)生被修改,還有一些未修改的學(xué)生,也就是id不相等的else:wfile.write(str(d)+'\n')answer = input('是否繼續(xù)修改其他學(xué)生的信息?y/n\n')if answer=='y':modify() # 在函數(shù)里面調(diào)用函數(shù)
07-對學(xué)生成績進(jìn)行排序功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?5,表示對學(xué)生成績進(jìn)行排序,調(diào)用sort()函數(shù),函數(shù)如下
????????代碼解釋如下,這段代碼定義了一個(gè)名為?sort()
?的函數(shù),其作用是對學(xué)生成績進(jìn)行排序。
-
def sort():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為?sort
。 -
show()
: 調(diào)用一個(gè)未定義的?show()
?函數(shù)來顯示全部學(xué)生信息,你需要自行定義該函數(shù)。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(同樣未提供?filename
?變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用?with
?語句打開文件進(jìn)行讀取操作。 -
student_list = rfile.readlines()
: 將文件中的所有內(nèi)容讀取到列表?student_list
?中,每行內(nèi)容作為列表的一個(gè)元素。 -
student_new = []
: 創(chuàng)建一個(gè)空列表?student_new
,用于存儲(chǔ)將每行學(xué)生信息轉(zhuǎn)換為字典后的結(jié)果。 -
for item in student_list:
: 遍歷?student_list
?列表中的每個(gè)學(xué)生信息。 -
d = dict(eval(item))
: 將每行內(nèi)容(學(xué)生信息)轉(zhuǎn)換為字典類型,并賦給變量?d
,這里使用?eval()
?函數(shù)將字符串轉(zhuǎn)換為字典類型。 -
student_new.append(d)
: 將轉(zhuǎn)換后的學(xué)生信息字典添加到?student_new
?列表中。 -
asc_or_desc = input('請選擇(0.升序 1.降序)')
: 提示用戶選擇排序方式,0 表示升序,1 表示降序。 -
if asc_or_desc=='0': asc_or_desc_bool = False
: 如果用戶選擇升序,則將?asc_or_desc_bool
?設(shè)為?False
,否則設(shè)為?True
?表示降序。 -
mode = input('請選擇排序方式(1.英語成績排序 2.python成績排序 3.java成績排序 0.總成績排序)')
: 提示用戶選擇排序方式,1 表示按英語成績排序,2 表示按Python成績排序,3 表示按Java成績排序,0 表示按總成績排序。 -
根據(jù)用戶輸入的?
mode
,使用?lambda
?函數(shù)定義排序的關(guān)鍵字,然后使用?sort()
?函數(shù)對?student_new
?列表進(jìn)行排序。 -
show_student(student_new)
: 調(diào)用一個(gè)未定義的?show_student()
?函數(shù)來顯示排序后的學(xué)生信息,你需要自行定義該函數(shù)。
def sort(): # 定義sort()函數(shù),對學(xué)生成績進(jìn)行排序show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_list = rfile.readlines()student_new = []for item in student_list:d = dict(eval(item))student_new.append(d)else:return# 共有升序和降序兩種排序方式,手動(dòng)輸入asc_or_desc = input('請選擇(0.升序 1.降序)')if asc_or_desc=='0':asc_or_desc_bool = Falseelif asc_or_desc=='1':asc_or_desc_bool = Trueelse:print('您的輸入有誤,請重新輸入')sort()mode = input('請選擇排序方式(1.英語成績排序 2.python成績排序 3.java成績排序 0.總成績排序)')if mode=='1':student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)elif mode =='2':student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)elif mode =='3':student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)elif mode =='0':student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)else:print('您的輸入有誤,請重新輸入')sort()show_student(student_new)
08-統(tǒng)計(jì)學(xué)生總?cè)藬?shù)功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?6,表示統(tǒng)計(jì)學(xué)生總?cè)藬?shù),調(diào)用total()函數(shù),函數(shù)如下
????????代碼解釋如下,這段代碼定義了一個(gè)名為?total()
?的函數(shù),其作用是統(tǒng)計(jì)學(xué)生總?cè)藬?shù)。
-
def total():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為?total
。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(同樣未提供?filename
?變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用?with
?語句打開文件進(jìn)行讀取操作。 -
students = rfile.readlines()
: 將文件中的所有內(nèi)容讀取到列表?students
?中,每行內(nèi)容作為列表的一個(gè)元素。 -
if students:
: 檢查?students
?列表是否非空,即是否有學(xué)生信息。 -
print(fr'一共有{len(students)}名學(xué)生')
: 如果有學(xué)生信息,則使用?len()
?函數(shù)統(tǒng)計(jì)學(xué)生總?cè)藬?shù),并打印出來。 -
else:
: 如果?students
?列表為空,即沒有學(xué)生信息,則打印提示信息?'尚未錄入學(xué)生信息'
。
def total(): # 定義total()函數(shù),統(tǒng)計(jì)學(xué)生總?cè)藬?shù)if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()if students:print(fr'一共有{len(students)}名學(xué)生')else:print('尚未錄入學(xué)生信息')
09-顯示所有學(xué)生信息功能實(shí)現(xiàn)? ? ? ? ? ??
? ? ?7,表示顯示所有學(xué)生的信息,調(diào)用show()函數(shù),函數(shù)如下
????????代碼解釋如下,這段代碼定義了一個(gè)名為?show()
?的函數(shù),其作用是顯示所有學(xué)生的信息。
-
def show():
: 這是定義一個(gè)函數(shù)的開始,函數(shù)名為?show
。 -
student_lst = []
: 創(chuàng)建一個(gè)空列表?student_lst
,用于存儲(chǔ)所有學(xué)生的信息。 -
if os.path.exists(filename):
: 檢查是否存在指定的文件(同樣未提供?filename
?變量,應(yīng)該在代碼中定義),這里假設(shè)用來存儲(chǔ)學(xué)生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用?with
?語句打開文件進(jìn)行讀取操作。 -
students = rfile.readlines()
: 將文件中的所有內(nèi)容讀取到列表?students
?中,每行內(nèi)容作為列表的一個(gè)元素。 -
for item in students:
: 遍歷?students
?列表中的每個(gè)學(xué)生信息。 -
student_lst.append(eval(item))
: 將每行內(nèi)容(學(xué)生信息)轉(zhuǎn)換為字典類型,并添加到?student_lst
?列表中。這里使用?eval()
?函數(shù)將字符串轉(zhuǎn)換為字典類型。 -
if student_lst:
: 檢查?student_lst
?列表是否非空,即是否有學(xué)生信息。 -
如果?
student_lst
?列表非空,則調(diào)用一個(gè)未定義的?show_student()
?函數(shù)來顯示所有學(xué)生的信息,你需要自行定義該函數(shù)。 -
如果文件不存在或者沒有學(xué)生信息,則打印提示信息?
'尚未錄入學(xué)生信息!!!'
。
def show(): # 定義show()函數(shù),顯示所有學(xué)生的信息student_lst = []if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()for item in students:student_lst.append(eval(item))if student_lst:show_student(student_lst)else:print('尚未錄入學(xué)生信息!!!')
總結(jié)?
01-整體代碼實(shí)現(xiàn)? ? ? ? ??
? ? ? ? 注:上面僅僅是每一項(xiàng)功能實(shí)現(xiàn)的代碼,整體代碼如下,如果需要使用,一定要使用下面的代碼。
import os
filename = 'students.txt'
def main():while True: # 為了顯示主菜單menu() # 調(diào)用menu()函數(shù)# 有各種功能,下面就是讓用戶選擇choice = int(input('請選擇'))if choice in [0,1,2,3,4,5,6,7]: # 共有八個(gè)功能,判斷選擇的是否在這八個(gè)序號里面if choice==0: # 選擇0,表示退出系統(tǒng)answer = input('您確定要退出系統(tǒng)嗎?y/n\n') # 輸出一個(gè)詢問,是否要退出if answer=='y' or answer=='Y': # 判斷輸入的是否為yprint('謝謝您的使用')break # 打斷menu()函數(shù)的輸出else: # 不是選的ycontinue # 繼續(xù)程序執(zhí)行elif choice==1: # 如果選擇的是1insert() # 調(diào)用insert()函數(shù),錄入學(xué)生信息elif choice==2: # 如果選擇的是2search() # 調(diào)用search()函數(shù),查找學(xué)生信息elif choice==3: # 如果選擇的是3delete() # 調(diào)用delete()函數(shù),刪除學(xué)生信息elif choice==4: # 如果選擇的是4modify() # 調(diào)用modify()函數(shù),修改學(xué)生信息elif choice==5: # 如果選擇的是5sort() # 調(diào)用sort()函數(shù),對學(xué)生成績進(jìn)行排序elif choice==6: # 如果選擇的是6total() # 調(diào)用total()函數(shù),統(tǒng)計(jì)學(xué)生總?cè)藬?shù)elif choice==7: # 如果選擇的是7show() # 調(diào)用show()函數(shù),顯示所有學(xué)生的信息def menu():print('======================學(xué)生信息管理系統(tǒng)======================')print('-------------------------功能菜單-------------------------')print('\t\t\t\t\t\t1.錄入學(xué)生信息')print('\t\t\t\t\t\t2.查找學(xué)生信息')print('\t\t\t\t\t\t3.刪除學(xué)生信息')print('\t\t\t\t\t\t4.修改學(xué)生信息')print('\t\t\t\t\t\t5.排序')print('\t\t\t\t\t\t6.統(tǒng)計(jì)學(xué)生總?cè)藬?shù)')print('\t\t\t\t\t\t7.顯示所有學(xué)生信息')print('\t\t\t\t\t\t0.退出系統(tǒng)')print('---------------------------------------------------------')def insert(): # 定義insert()函數(shù),錄入學(xué)生信息student_list = [] # 創(chuàng)建一個(gè)列表,用于存儲(chǔ)錄入的學(xué)生信息while True: # 循環(huán)錄入學(xué)生信息id = input('請輸入學(xué)號(如1001):')if not id: # 如果沒有輸入學(xué)號或者輸入錯(cuò)誤,則執(zhí)行break,退出錄入信息操作breakname = input('請輸入姓名:')if not name: # 如果是空的,則執(zhí)行breakbreak# 然后開始錄入成績信息,但是成績有可能錄入錯(cuò)誤,因此用try...except...保證異常處理try:english = int(input('請輸入英語成績:'))python = int(input('請輸入python成績:'))java = int(input('請輸入Java成績:'))except: #當(dāng)你輸入的成績無效時(shí),會(huì)執(zhí)行except語句print('輸入無效,不是整數(shù)類型,請重新輸入')continue# 將錄入的學(xué)生信息保存到字典student = {'id':id,'name':name,'english':english,'python':python,'java':java}# 將學(xué)生信息添加到列表中student_list.append(student)anewer = input('是否繼續(xù)添加?y/n\n')if anewer=='y':continueelse:break2# 信息添加之后,將信息保存到文件中,需要退出循環(huán)# 調(diào)用save()函數(shù),保存信息save(student_list) # save()函數(shù)未定義,需要自行定義print('學(xué)生信息錄入完畢!!!')
def save(lst): # 傳進(jìn)去一個(gè)列表# 然后將列表中的內(nèi)容保存在文件中try:stu_txt = open(filename,'a',encoding='UTF-8')except:stu_txt = open(filename,'w',encoding='UTF-8')for item in lst:stu_txt.write(str(item)+'\n')stu_txt.close()def search(): # 定義search()函數(shù),查找學(xué)生信息student_query = []while True:id = ''name = ''if os.path.exists(filename):# 現(xiàn)在分模式查找,1代表使用id查找,2代表使用name查找mode = input('按學(xué)號查找請輸入1,按姓名查找請輸入2')if mode == '1': # 需要加上單引號,因?yàn)檩斎氲氖亲址?#xff0c;并未轉(zhuǎn)變類型id = input('請輸入要查找學(xué)生的id:')elif mode=='2': # elif就相當(dāng)于else if的功能,主要在有多個(gè)選擇時(shí)使用,因?yàn)閕f先用來判斷是否為1# 下面還有兩個(gè)選擇,就是2和其他的數(shù),因此不能直接用else,還要用elif判斷一下是否為2name = input('請輸入要查找學(xué)生的姓名:')else:print('您的輸入有誤,請重新輸入')search() #輸入錯(cuò)了,就重新調(diào)用函數(shù),也可以使用continuewith open(filename,'r',encoding='UTF-8') as rfile: # 讀取內(nèi)容,將所有內(nèi)容放在student文件中student = rfile.readlines()for item in student: # 遍歷student列表d =dict(eval(item)) # 字符串轉(zhuǎn)成字典類型if id != '':if d['id'] ==id:student_query.append(d)if name != '':if d['name'] == name:student_query.append(d)# 顯示查詢結(jié)果show_student(student_query) # 定義show_student函數(shù)# 清空列表student_query.clear()answer = input('是否繼續(xù)執(zhí)行查詢操作?y/n\n')if answer=='y':continueelse:breakelse:print('未錄入學(xué)生信息')return
def show_student(lst):# 顯示查詢結(jié)果的過程,結(jié)果是按照一定的格式顯示的,因此要使用格式化字符串if len(lst) ==0:print('沒有查詢到學(xué)生信息,無數(shù)據(jù)顯示!!!')return# 如果查到了,就要定義標(biāo)題的顯示格式format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'print(format_title.format('id','姓名','英語成績','python成績','java成績','總成績'))# 定義內(nèi)容的顯示格式format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'for item in lst:print(format_data.format(item.get('id'),item.get('name'),item.get('english'),item.get('python'),item.get('java'),int(item.get('english'))+int(item.get('python'))+int(item.get('java'))))
def delete(): # 定義delete()函數(shù),刪除學(xué)生信息while True:student_id = input('請輸入要?jiǎng)h除的學(xué)生的id:')if student_id!='':# 當(dāng)輸入的id之后,則不是空的,此時(shí)要判斷導(dǎo)入id是否在文件中,使用os模塊if os.path.exists(filename): # 判斷文件是否存在with open(filename,'r',encoding='UTF-8') as file:student_old = file.readlines() # 如果存在,讀取學(xué)生的信息,將其添加到列表當(dāng)中else: # 如果不存在student_old=[] # 建立一個(gè)空列表flag = False # 標(biāo)記是否刪除if student_old: # 這里表示如果列表student_old為真,則執(zhí)行下面with語句with open(filename,'w',encoding='UTF-8') as wfile: # 使用上下管理器,寫入d ={} # 創(chuàng)建一個(gè)空字典for item in student_old: # 遍歷student_old中的信息d=dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['id']!= student_id: # 判斷是否與輸入的信息相等wfile.write(str(d)+'\n') # 不相等,則寫入d字典中else:flag = True # 相等則執(zhí)行刪除操作if flag==1:print(f'id為{student_id}的學(xué)生信息已被刪除')else:print(f'沒有找到id為{student_id}的學(xué)生信息')else: # 文件不存在print('無學(xué)生信息')breakshow() # 刪除之后重新顯示全部學(xué)生信息answer = input('是否繼續(xù)刪除學(xué)生信息?y/n\n')if answer == 'y':continueelse:break
def modify(): # 定義modify()函數(shù),修改學(xué)生信息show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_old = rfile.readlines() # readlines() 函數(shù)用于讀取文件中的所有行,然后將起放入創(chuàng)建的列表中else:return # 文件不存在,結(jié)束函數(shù)student_id = input('請輸入需要修改學(xué)生的id:')if student_id != '':if os.path.exists(filename):with open(filename,'w',encoding='UTF-8') as wfile:for item in student_old:d = dict(eval(item))if d['id'] == student_id:print('找到學(xué)生相關(guān)信息,可以修改他的相關(guān)信息了!!!')while True:try:d['name'] = input('請輸入名字:')d['english'] = input('請輸入英語成績:')d['python'] = input('請輸入python成績:')d['java'] = input('請輸入java成績')except:print('輸入有誤,請重新輸入') # 如果輸入有誤,則會(huì)繼續(xù)執(zhí)行while trueelse:break# 如果都沒輸入錯(cuò)誤,則使用write寫入wfile.write(str(d)+'\n')print('修改成功')# 一些學(xué)生被修改,還有一些未修改的學(xué)生,也就是id不相等的else:wfile.write(str(d)+'\n')answer = input('是否繼續(xù)修改其他學(xué)生的信息?y/n\n')if answer=='y':modify() # 在函數(shù)里面調(diào)用函數(shù)def sort(): # 定義sort()函數(shù),對學(xué)生成績進(jìn)行排序show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_list = rfile.readlines()student_new = []for item in student_list:d = dict(eval(item))student_new.append(d)else:return# 共有升序和降序兩種排序方式,手動(dòng)輸入asc_or_desc = input('請選擇(0.升序 1.降序)')if asc_or_desc=='0':asc_or_desc_bool = Falseelif asc_or_desc=='1':asc_or_desc_bool = Trueelse:print('您的輸入有誤,請重新輸入')sort()mode = input('請選擇排序方式(1.英語成績排序 2.python成績排序 3.java成績排序 0.總成績排序)')if mode=='1':student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)elif mode =='2':student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)elif mode =='3':student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)elif mode =='0':student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)else:print('您的輸入有誤,請重新輸入')sort()show_student(student_new)
def total(): # 定義total()函數(shù),統(tǒng)計(jì)學(xué)生總?cè)藬?shù)if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()if students:print(fr'一共有{len(students)}名學(xué)生')else:print('尚未錄入學(xué)生信息')
def show(): # 定義show()函數(shù),顯示所有學(xué)生的信息student_lst = []if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()for item in students:student_lst.append(eval(item))if student_lst:show_student(student_lst)else:print('尚未錄入學(xué)生信息!!!')
if __name__ == '__main__':main()