前言
學生信息管理系統——相信我們大家都是比較熟悉的了,作為一個初入計算機專業的學生,這估計是我們在課程設計中都做過的一個小項目。不過你我那時可能一樣,因為經驗不足和圖於玩樂,開發過程中水了不少地方,哈哈一開;近日臨近學期末 ,因為一些原因,需要來重新做一下它,鑒於以前的不足,所以本次開發參照着軟件工程開發流程走,算是對軟件開發流程再一次鞏固。
項目需求
首先第一個考慮的便是項目需求,對於咱學生來講,項目可行性就不用研究了,這肯定是可行的,砸門就經拿需求干就是了。廢話不多講,先能得到大致功能需求模塊,例如針對本項目經過一番分析可以得到如下需求模塊圖:
1 考慮學生登錄,可以將其細分如下一些需求:
2 管理員登錄
對於管理員登錄,它管理的東西就比較多了。就其中的課程管理,大致對應着的其實就是增、刪、查、改課程
對於教室管理、學生管理、班級管理 需求是類似的
分析一下學生選課管理、學生成績管理,也不難得到下面的功能需求圖:
一個簡單E-R圖幫助了解需求
系統設計
前面需求階段都還比較順風順水, 到設計階段就遇到了阻礙。參照前面的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* 類型數據成員,用作操作管理課程的句柄。
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_屬性必須和Student類中pMC_屬性指向同一個ManageCourse對象。因為它們需要統一進行交互
也就是說pMC_屬性是在構造admin 對象時,外面用參數傳進來。
對於教師管理、班級管理、學生管理可以基於同樣的思路進行處理。只需要在Admin類中添加相應的句柄。
數據保存
所有數據保存在mysql中。在程序啟動時從數據庫中加載到維護的數據結構中,所有操作完成后再將數據保存到mysql中。
之所以如此,可以減少程序與mysql交互的次數,提高執行的效率
編碼實現
至此,已有大體的思路,可以開始編碼實現。代碼已上傳github,若您感興趣可以參考https://github.com/tp16b/project/tree/master/manageSys/src
注意事項:
- 執行環境是Linux,若執行代碼請clone整個工程
- 程序用到mysql保存,執行前請確保安裝好mysql
- c++連接mysql需要用到libmysqlclient-dev庫
最后貼上程序截圖:
- 主界面圖
- 管理員登錄
- 學生登錄
- 成績查詢