1. 程式人生 > >Python:學生資訊管理系統

Python:學生資訊管理系統

簡單版本學生資訊管理系統,用python基礎語法實現,基於python 3.6

容錯率很高的程式碼,做了很多異常處理功能,出錯也不會丟失資訊

啟動時自動從檔案中讀取已有學生資訊,退出時自動儲存

 

程式分3個模組:

Menu:進行選單管理

Student_managemant:進行學生資訊管理

main:主函式

直接上程式碼,有註釋

 

Menu.py

# -*- coding: UTF-8 -*-
import sys
import os

class Menu():
	"""
		選單管理類
		作用:向控制檯列印學生資訊,從控制檯獲取輸入資訊,並進行錯誤處理
	"""


	def welcome(self):
		"""
			歡迎語句
		"""
		print("\n歡迎來到 WilliamCode 學生資訊管理系統")

	def top_menu(self):
		"""
			一級選單,提示使用者輸入命令
		"""
		print("""
請選擇要進行的操作:
	1、新增學生資訊
	2、刪除學生資訊
	3、查詢單個學生資訊
	4、輸出所有學生資訊
	5、輸出所有學生資訊,按照成績由高到低排名
	6、儲存並退出
	#、操作中輸入錯誤時,按Ctrl+C跳轉到主選單
		""")

	def top_menu_get_data(self):
		"""
			獲取一級選單使用者輸入的命令
		"""
		self.data = int(input())
		return [self.data]


	def sub_menu1(self):
		"""
			列印子選單1並收集資訊
			子選單1用於新增學生資訊
		"""
		print("""
	正在新增學生資訊:
		請輸入學生姓名:""")
		self.name = input().strip()

		print("""
		請輸入學生年齡:""")
		self.age = int(input())

		print("""
		請輸入學生成績""")
		self.score = int(input())

		return [self.name, self.age, self.score]


	def sub_menu23_get_name(self):
		"""
			收集子選單2、3的輸入資訊
			子選單2、3作用是刪除或者查詢單個學生資訊
		"""
		print("""
		請輸入學生姓名:""")
		self.name = input().strip()
		return [self.name]

		
if __name__ == '__main__':

	print("Testing Menu Module")
	menu = Menu()
	print(menu.top_menu())
	print(menu.top_menu_get_data())
	print(menu.sub_menu1())
	print(menu.sub_menu23_get_name())

student_managemeng.py

# -*- coding: UTF-8 -*-
import sys
import os

class Student():
	"""
	學生類,用於儲存學生資訊
	只能新增__slots__ = ['name', 'age', 'score']中的三個屬性,如需修改,請改變該列表內容
	name: 學生姓名
	age : 學生年齡
	score:學生成績
	"""



	__slots__ = ['name', 'age', 'score']
	def __init__(self, name_str, age_int, score_int):
		"""
			學生類的初始化函式 
			name_str :學生姓名
			age_int	 :學生年齡
			score_int:學生成績
		"""
		self.name = name_str
		self.age = age_int
		self.score = score_int

	def __str__(self):
		"""
			Student類轉為字串資訊的函式
			除錯時使用
		"""
		return "%s : %s\n%s : %d\n %s: %d\n" % ("name".center(10),self.name, "age".center(10),self.age,  "score".center(10),self.score)



class Student_Info():
	"""
		學生資訊管理類
		用於儲存多個學生資訊
		包含屬性:
		列表L:元素為Student類的例項
	"""
	
	def __enter__(self):
		"""
			錯誤處理機制的初始化函式
			呼叫with語句時首先呼叫此函式,然後將返回值返回給as後的變數
			功能:
			開啟儲存學生資訊的檔案,將其資訊讀入記憶體中
		"""
		try:
			file = open("student_info.txt",'rt')

		except:
			print("檔案未找到,請聯絡管理員...")
			exit(-1)
		self.L = list()
		for i in file:
			if i == '\n':
				break
			l = i.split()
			s = Student(l[0], int(l[1]), int(l[2]))
			self.L.append(s)
		print("學生資訊讀取成功...")
		file.close()
		return self


	def __exit__(self, exc_type, exc_value, exc_tb):
		"""
			錯誤處理機制的資源回收函式
			跳出with語句時呼叫此函式
			功能:
			發生錯誤的情況下儲存學生資訊到檔案中,防止資訊丟失
			關閉檔案流檔案
		"""

		file = open("student_info.txt",'wt')
		for i in self.L:
			s = "%s %d %d\n" % (i.name, i.age, i.score)
			file.write(s)
		file.close()

	def add_student(self, S):
		"""
			新增學生資訊到列表L中
		"""
		if isinstance(S, Student):
			self.L.append(S)
			return True
		return False
		
	@staticmethod
	def print_all(L):
		"""
			類的靜態方法
			引數為:元素為Student類的列表
			功能:按照表格格式列印列表中所有學生資訊
		"""

		if len(L) == 0:
			print("資料庫中沒有學生資訊,請先新增學生資訊")
			return
		print("\n|%s|" % ("name".center(15)), end='')
		print("%s|" % ("age".center(15)), end = '')
		print("%s|" % ("score".center(15)))
		for i in L:
			print("|%s|" % (i.name.center(15)), end='')
			print("%s|" % (str(i.age).center(15)), end = '')
			print("%s|" % (str(i.score).center(15)))



	def print_sorted(self):
		"""
			將學生資訊按成績排序,並呼叫靜態方法print_all()按照格式列印
		"""
		sorted_list = sorted(self.L, key = key_fun, reverse = True)
		self.print_all(sorted_list)



def key_fun(s1):
	"""
		Student_Info類中規定排序規則的函式,按照分數排名,所以返回score
	"""
	return s1.score

main.py

# -*- coding: UTF-8 -*-
import sys
import os
import student_management as sm
import menu

#用with語句塊進行操作,即使發生錯誤,也能進行資源釋放與資料儲存工作
#減小程式bug帶來的損失
with sm.Student_Info() as si:

	#初始化選單類例項,列印歡迎資訊
	m = menu.Menu()
	m.welcome()
	while True:

		#列印1級選單
		m.top_menu()

		#獲取使用者輸入的資訊,如果發生錯誤,則重新列印一級選單
		try:
			op_data = m.top_menu_get_data()
		except:
			print("輸入不合法,請重新選擇")
			continue

		#使用者選擇新增學生資訊
		if op_data[0] == 1:

			#獲取並新增學生資訊
			try:
				l = m.sub_menu1()
				s = sm.Student(l[0], l[1], l[2])
				if not si.add_student(s):
					print("\n新增失敗")
				print("\n資訊新增成功")

			except:
				print("輸入資料不合法,請重新選擇")

		#使用者選擇刪除學生資訊
		elif op_data[0] == 2:

			#獲取學生姓名並刪除學生資訊,flag用於判斷學生資訊是否被刪除
			#如果沒有被刪除,說明學生不存在,列印錯誤資訊
			name = m.sub_menu23_get_name()[0]
			flag = False
			
			for i in range(len(si.L)):
				if si.L[i].name == name:
					del si.L[i]
					flag = True
					break
			if flag == False:
				print("學生不存在,刪除失敗")
			else:
				print("學生資訊刪除成功")
		
		#使用者選擇查詢單個學生資訊
		elif op_data[0] == 3:
			#獲取學生姓名並查詢學生資訊,flag用於判斷學生資訊是否被列印
			#如果沒有被列印,說明學生不存在,列印錯誤資訊
			name = m.sub_menu23_get_name()[0]
			flag = False
			for i in range(len(si.L)):
				if si.L[i].name == name:
					print(si.L[i])
					flag = True
			if flag == False:
				print("學生不存在,查詢失敗")

		#使用者選擇列印學生資訊,直接呼叫靜態函式列印
		elif op_data[0] == 4:
			si.print_all(si.L)

		#使用者選擇按照成績排序列印學生資訊,直接呼叫函式
		elif op_data[0] == 5:
			si.print_sorted()

		#使用者選擇退出,直接退出迴圈,程式下一步將退出with語句塊
		#退出with語句塊後,程式自動呼叫Student_Info.__exit__()方法,儲存學生資訊,關閉檔案,退出
		elif op_data[0] == 6:
			break

程式碼已上傳至百度網盤,地址為:

連結:https://pan.baidu.com/s/1VYvI24tHC0tst6tjt3wP4w 
提取碼:evb2