軟件開發的一個案例:學生信息管理系統


前言

學生信息管理系統——相信我們大家都是比較熟悉的了,作為一個初入計算機專業的學生,這估計是我們在課程設計中都做過的一個小項目。不過你我那時可能一樣,因為經驗不足和圖於玩樂,開發過程中水了不少地方,哈哈一開;近日臨近學期末 ,因為一些原因,需要來重新做一下它,鑒於以前的不足,所以本次開發參照着軟件工程開發流程走,算是對軟件開發流程再一次鞏固。


項目需求

首先第一個考慮的便是項目需求,對於咱學生來講,項目可行性就不用研究了,這肯定是可行的,砸門就經拿需求干就是了。廢話不多講,先能得到大致功能需求模塊,例如針對本項目經過一番分析可以得到如下需求模塊圖:

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庫

最后貼上程序截圖:

  1. 主界面圖
  2. 管理員登錄
  3. 學生登錄
  4. 成績查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM