軟件工程實踐2017第二次結對做業

結對成員

031502643 朱曉健
031502626 孫浩楷git

GitHub項目地址

用力戳我程序員

數據生成程序

input_data.txt
數據主要採用rand()來隨機生成。經過相關措施來防止隨機生成的重複數據,而後用Jsoncpp的Json::Writer輸出。github

考慮因素

  • 部門總數爲20個,學生總數爲300個
  • 時間段必須具備實際意義
  • 防止部門號和學生號重複
  • 做業要求中的其餘點均要知足
    在咱們寫數據生成程序的時候,遇到了生成的學號超過規定長度的狀況,後來發現是一個地方過於粗心,沒有對字符串清空。還有就是爲了讓unlucky_student和unlucky_department的數量儘可能少,咱們的free_time時間段是設的比較多的,event_schedule時間段是設的比較少的,但都知足兩個以上的基本要求。

匹配程序

前序

看到題目的時候原本想直接從文本讀入數據而後進行符號的識別與篩選,後來在上課的時候聽到旁邊兩個同窗正在討論此次的結對做業,依稀聽到了什麼JSON格式輸入很方便啊(內心一陣竊喜hahaha),雖然不知道JSON是什麼,不過應該對此次的結對做業有幫助。
下課回去後,又認真地看了下題目,發現題目裏赫然寫着「Json格式」,若是我沒猜錯的話,我第一步要完成的工做應該就是把JSON格式的數據讀到C++程序中。上網百度了一下須要安裝jsoncpp,按照網上的教程死活裝不上去,一直提示「link2005「」重定義錯誤,氣的我有種砸電腦的衝動,折騰了我一早上。後來是在MSDN上看到的解決辦法,在連接器的命令行中加入「 /FORCE:MULTIPLE 」,終於TM能用了。算法

數據建模

Student類的私有數據student_no,tags採用string類型,application_department採用動態string數組指針,並在析構函數中釋放所申請的堆內存,free_time和department_no採用vector容器來存儲。Department類的私有數據department_no,tags採用string類型,event_schedules採用動態string數組指針,member採用vector容器來存儲。Student類和Department類互爲友元類,方便成員函數的數據訪問。編程

匹配程序思路

首先根據學生的部門意願順序來匹配,只要該學生的一個空閒時間段和該部門一個常規活動時間段匹配,該學生就能加入到該部門中;而後,再對全部部門進行掃描,若是發現部門人數超過限制人數的,則剔除興趣標籤不匹配的學生,直到部門人數等於限制人數爲止,若是興趣標籤不匹配的學生都剔除完了部門人數仍然超過限制人數,則隨機剔除,直到部門人數等於限制人數爲止;對被剔除的學生再進行一次部門時間段匹配,以保證儘量多的學生能分配到部門。json

實現方式

  • 首先利用Json::Reader將txt的字符流轉換成Json::Value
  • 使用函數Student::StuAssignment和Department::DepAssignment將Json::Value數據讀入到各自的類私有數據中。
  • 按照匹配原則使用Student::TimeMatch進行學生空閒時間段和部門常規活動時間段的匹配,匹配成功則加入該部門,並刪除新成員相應的free_time,防止和後續的意願部門時間衝突。
  • 掃描每一個部門的人數,若超過限制人數,則使用Department::InterestFilter函數對部門成員進行剔除,優先剔除興趣標籤不匹配的,直到人數等於限制人數,對被剔除的學生歸還相應的free_time。
  • 對被剔除的學生使用Student::Redistribute函數調用Student::TimeMatch函數進行匹配。
  • 將相關數據寫入Json::Value,使用Json::StyledWriter轉換成字符流並輸出。數組

    寫匹配程序時遇到的一些問題

  • 原本是不想將兩個類弄成互爲友元類的,可是若是使用友元成員函數的話會引發循環依賴問題致使報錯,在網上搜索了相關的解決方法並無找到,只能聲明爲友元類了。
  • 在最後的結果輸出時,遇到了一點麻煩,示例中的輸出是按照(unlucky_student,admitted,unlucky_department)的順序進行輸出的,可是個人程序不論怎麼改,死活是按照(admitted,unlucky_department,unlucky_student)的順序輸出。在網上找了很久,後來發現由於jsoncpp是基於map容器,而map的key是按照字母順序進行索引,若是要修改的話,要改STL,並且會致使map的算法效率降低。在諮詢了助教以後,得知不按順序也是能夠的,因而便放棄了修改STL的想法。app

代碼規範

採用類來封裝數據。變量名主要採用小寫字母構成,單詞與單詞之間用下劃線鏈接;函數名採用字母構成,單詞首字母大寫,單詞之間沒有使用分隔符。以Student類爲例:函數

class Student
{
private:
    std::string student_no;
    std::vector<std::string>free_time;
    int freetimes;
    std::string *applications_department;
    int applications;
    std::string tags;
    std::vector<std::string>department_no;
    friend class Department;
public:
    Student();
    ~Student();
    void StuAssignment(Json::Value &root, int index);//將json數據讀到Student類中
    void TimeMatch(Department*dep,bool check);//進行時間匹配
    bool UnluckyStudents();//判斷一個學生是否一個部門都沒被分配到
    void FreetimeDelete(Department&dep);//對已分配到部門的學生刪除相應的free_time
    void Redistribute(Department&dep,Department*deps);//對被踢出的學生進行從新分配
    friend int GetIndex(Student*stu, Department*dep, std::string s);//由部門號或者學生號獲取索引
};

結果評估

按照上述的匹配原則,以示例中input_data.txt爲例的話,有126個unluncky_student,0個unlucky_department。本次匹配原則並無很是地嚴苛,只要學生空閒時間裏的一個與部門活動時間段匹配即算匹配成功,所以unlucky_student相較於全匹配原則減小了不少。對匹配結果基本滿意。工具

尤爲是最後一個對被踢出的學生按照其部門意願再進行分配我以爲頗有必要,這樣可以最大程度的保證每一個學生能分配到部門。固然,若是空閒時間老是不和部門活動時間相匹配的話也只能成爲UnluckyStudent了。

結對感覺

此次的做業恰逢國慶,我回家了,浩楷在學校,沒法面對面地進行交流,所以採用聊天工具QQ進行溝通。咱們輪流進行編程,雖然沒能出去玩,可是感受這個國慶過得很充實。從浩楷身上學到不少項目經驗。結對項目做業使我學到不少合做的經驗,而且提升了我與人溝通交流的能力,使我受益不淺,對我未來成爲一個合格的程序員有很大幫助。雖然累了點,可是並不後悔當初選了軟工實踐這門課,到目前爲止我真的學到了不少,這是之前其餘課程所不能帶給個人。

相關文章
相關標籤/搜索