031502643 朱曉健
031502626 孫浩楷git
用力戳我程序員
input_data.txt
數據主要採用rand()來隨機生成。經過相關措施來防止隨機生成的重複數據,而後用Jsoncpp的Json::Writer輸出。github
看到題目的時候原本想直接從文本讀入數據而後進行符號的識別與篩選,後來在上課的時候聽到旁邊兩個同窗正在討論此次的結對做業,依稀聽到了什麼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::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進行溝通。咱們輪流進行編程,雖然沒能出去玩,可是感受這個國慶過得很充實。從浩楷身上學到不少項目經驗。結對項目做業使我學到不少合做的經驗,而且提升了我與人溝通交流的能力,使我受益不淺,對我未來成爲一個合格的程序員有很大幫助。雖然累了點,可是並不後悔當初選了軟工實踐這門課,到目前爲止我真的學到了不少,這是之前其餘課程所不能帶給個人。