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

前言

學生信息管理系統——相信咱們你們都是比較熟悉的了,做爲一個初入計算機專業的學生,這估計是咱們在課程設計中都作過的一個小項目。不過你我那時可能同樣,由於經驗不足和圖於玩樂,開發過程當中水了很多地方,哈哈一開;近日臨近學期末 ,由於一些緣由,須要來從新作一下它,鑑於之前的不足,因此本次開發參照着軟件工程開發流程走,算是對軟件開發流程再一次鞏固。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_屬性必須和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. 成績查詢
相關文章
相關標籤/搜索