學生信息管理系統——相信咱們你們都是比較熟悉的了,做爲一個初入計算機專業的學生,這估計是咱們在課程設計中都作過的一個小項目。不過你我那時可能同樣,由於經驗不足和圖於玩樂,開發過程當中水了很多地方,哈哈一開;近日臨近學期末 ,由於一些緣由,須要來從新作一下它,鑑於之前的不足,因此本次開發參照着軟件工程開發流程走,算是對軟件開發流程再一次鞏固。mysql
首先第一個考慮的即是項目需求,對於咱學生來說,項目可行性就不用研究了,這確定是可行的,砸門就經拿需求幹就是了。廢話很少講,先能獲得大體功能需求模塊,例如針對本項目通過一番分析能夠獲得以下需求模塊圖:
1 考慮學生登陸,能夠將其細分以下一些需求:
c++
2 管理員登陸
對於管理員登陸,它管理的東西就比較多了。就其中的課程管理,大體對應着的其實就是增、刪、查、改課程git
對於教室管理、學生管理、班級管理 需求是相似的
分析一下學生選課管理、學生成績管理,也不可貴到下面的功能需求圖:
github
一個簡單E-R圖幫助瞭解需求
sql
前面需求階段都還比較順風順水, 到設計階段就遇到了阻礙。參照前面的E-R圖,比較容易獲得這麼幾個類:
Student類 Teacher類 Course類 Admin類 Grade班級類
難點在於類之間的交互
廢話很少講,以學生選課爲例,下面是我設計<1>Student類和Course類實現交互:數據庫
Course類數據結構
#include "common.h" struct Course { string course_id_; //課程id string course_name_;//課程名 int times_; //學時 int credit_; //學分 Course(const string& ci="C00", const string& cn="", int times=0, int c=0, int s=0) :course_id_( ci),course_name_( cn),times_(times),credit_(c) { } bool operator<(const Course& rhs) const{ if(course_id_ < rhs.course_id_) return true; else return false; } }; //管理課程類 class ManageCourse { typedef set<Course>::iterator Ite; private: set<Course> contain_; //存儲課程set容器 public: int addCourse(const string& , const string& , int, int) ; int changeCourse(const string&) ; int eraseCourse(const string&) ; Ite findCourse(const string& c_id) {return contain_.find(Course(c_id));} void showCourse(); //顯示系統中全部課程信息 };
Student類編碼
class Student { typedef map<Course, int>::iterator Ite; private: string usn_; string name_; string profession_; //專業 string email_; string birth_; //出生日期 string sex_; //性別 string password_; ManageCourse* pMC_; //ManageCourse進行交互,從系統選得課程 map<Course, int> con_score_;//存儲課程及其對應分數的map容器 public: Student(ManageCourse* pmc, ....): .....{} //簡寫了 //我的信息操做 void showProfile(); //顯示學生我的信息 int changePWD(); //選課管理 void manageCourse(const string& admin_id); int addCourse(const string& c_id) ; //添加課程至con_score_容器 int cancleCourse(const string& c_id) ; void showCourseScore() ; //顯示學生全部課程與分數 ... };
能夠看出Student類中有一個操縱Course的句柄,由它來負責和ManageCourse課程類交互,進而實現從系統選課的操做;再者在Student類中存有一個存放課程和對應分數的map容器,這樣利用pMC_句柄在系統找到的課程即可以放入map容器進行管理設計
<2> Admin類與Course類進行交互
同上,Admin類須要實現對系統的課程進行管理就十分簡單了,只須要在類中添加ManageCourse* 類型數據成員,用做操做管理課程的句柄。3d
class Admin { private: int admin_id_; string admin_name_; string admin_pass_; ManageCourse* pMC_; //管理課程句柄 public : Admin(ManageCourse* pMC, ...)::...,pMC_(pMC) { } ~Admin( ) { ...} ManageStudent* getStuHandle( ) { return pMS_;} //manage course member function void manageCourse(); //handle student choose course void handleChooseCourse( ); void addCourseForStu(); void cancleCourseForStu(); };
也就是說pMC_屬性是在構造admin 對象時,外面用參數傳進來。
對於教師管理、班級管理、學生管理能夠基於一樣的思路進行處理。只須要在Admin類中添加相應的句柄。
全部數據保存在mysql中。在程序啓動時從數據庫中加載到維護的數據結構中,全部操做完成後再將數據保存到mysql中。
之因此如此,能夠減小程序與mysql交互的次數,提升執行的效率
至此,已有大致的思路,能夠開始編碼實現。代碼已上傳github,若您感興趣能夠參考https://github.com/tp16b/project/tree/master/manageSys/src