软件工程实践2017结对第二次作业
結(jié)對成員:吳君毅(031502629),吳偉根(031502631)
Github鏈接:https://github.com/n9705/Dep-Stu
一、 題目要求
構(gòu)造部門和學(xué)生輸入數(shù)據(jù)的生成程序,實現(xiàn)一個智能自動分配算法,根據(jù)輸入信息,輸出部門和學(xué)生間的匹配信息(一個學(xué)生可以確認(rèn)多個他所申請的部門,一個部門可以分配少于等于其要求的學(xué)生數(shù)的學(xué)生) 及 未被分配到學(xué)生的部門 和 未被部門選中的學(xué)生。
分工情況:基本上是我負(fù)責(zé)數(shù)據(jù)生成程序,偉根負(fù)責(zé)部門學(xué)生自動分配算法,遇到問題互相幫助探討。
二、 數(shù)據(jù)生成程序
這部分主要是由我負(fù)責(zé)
首先根據(jù)題目要求創(chuàng)建兩個結(jié)構(gòu)體數(shù)組部門和學(xué)生,要滿足的條件如下:
學(xué)生:
- 空閑時間段(設(shè)置最大為12個,且同一天的不同時間段不能重疊,且根據(jù)實 際情況,時間不能是晚上10點后到第二天早上8點之間,且空閑時間段以兩小時為單位)
- 學(xué)號(不可重復(fù))
- 意向部門(不可重復(fù),最多5個)
興趣標(biāo)簽(不可重復(fù)最多8個)
部門:
- 活動時間(設(shè)置最大為12個,且同一天的不同時間段不能重疊,且根據(jù)實際情況,時間不能是晚上10點后到第二天早上8點之間,活動時間為2小時)
- 部門人數(shù)限制(10-15之間)
- 部門編號(不可重復(fù))
- 興趣標(biāo)簽(因為一個部門主要比較專業(yè),所以興趣標(biāo)簽定為不超過3個)
原理:通過不斷的循環(huán),給學(xué)生和部門的結(jié)構(gòu)體數(shù)組賦值,其中因為要模擬隨機性,所以大量用到了隨機數(shù)的算法,除了學(xué)生學(xué)號和部門編號,其他都是隨機函數(shù)組合出來的。說是隨機,但是同一個學(xué)生或部門里的一些信息也不能重復(fù),為了避免這個情況,就要給之前隨機出的結(jié)果做統(tǒng)計,不能重復(fù),具體實現(xiàn)就是把之前的結(jié)果送進數(shù)組里然后每生成一次就查重一次。最后輸出的時候,用Json的格式進行輸出。
核心代碼:
輸出文本示例:https://github.com/n9705/Dep-Stu/blob/master/project/input_data.txt
學(xué)生輸出示例:
部門輸出示例:
不足:
生成數(shù)據(jù)用了C++輸出,然后自己加上格式,并沒有用Json的庫輸出,在但是還是在json_CN上校驗通過,輸出了正確的Json格式。
三、數(shù)據(jù)建模及匹配程序的思路及實現(xiàn)方式
數(shù)據(jù)建模:這部分主要我負(fù)責(zé)。從生成輸入數(shù)據(jù)的txt中用Json把數(shù)據(jù)解析出來然后裝進部門和學(xué)生的結(jié)構(gòu)體數(shù)組里。
核心代碼:
匹配程序的思路:這部分主要由偉根負(fù)責(zé)。先按照學(xué)生的意向部門匹配,當(dāng)部門編號匹配時再進行判斷學(xué)生的freetime和部門的event schedules是否滿足條件,條件為部門某天的活動時間范圍小于學(xué)生的當(dāng)天的空閑時間,如果滿足,再判斷興趣標(biāo)簽是否有至少一個符合意向部門的興趣標(biāo)簽,如果有,再判斷部門收的人數(shù)是否已經(jīng)達到member_limit,如果沒有,則把這個人放入這個部門,然后把該學(xué)生的標(biāo)志修改為已加入。
原理圖:
核心代碼:
void application(int num) {for(int i=0;i<5;i++) //至多5個意向部門 {for(int j=0;j<20;j++) //至多20個部門 { int count=0; //計數(shù)變量 if(stu[num].applications_department[i]==dep[j].department_no) //第num個學(xué)生的第i個意向部門編號匹配到相應(yīng)部門 {set_student(num); //對該學(xué)生的freetime進行處理 set_department(j); //對該部門的event_schedule進行處理 for(int stu_time_count=0;stu_time_count<12;stu_time_count++) //至多12個空閑時間段 {for(int dep_time_count=0;dep_time_count<12;dep_time_count++ ) //至多12個活動時間段 {if(str1[stu_time_count].compare(str4[dep_time_count])==0) //匹配星期幾 {if(str2[stu_time_count].compare(str5[dep_time_count])>=0&&str3[stu_time_count].compare(str6[dep_time_count])<0) //時間段比較 {dep[j].save[count] = stu[num].student_no; //滿足條件就將該學(xué)生的學(xué)號存入對應(yīng)的數(shù)組 count++; //計數(shù)加一 if(count>dep[j].member_limit) continue;}}}}} }} }四、 代碼規(guī)范
1、 大括號一定要單獨一行
2、 每個函數(shù)都要有注釋,解釋其功能
3、 定義一個數(shù)組或者變量時,要給出注釋說明其功能
五、 結(jié)果評估
輸出的unlucky_student人數(shù)比較多,大概一百八左右,原因是匹配程序的選擇條件比較簡單,先是意向部門編號匹配然后再是時間匹配,而且是由于for語句循環(huán)的問題,就較為簡單的輸出該學(xué)生被一個部門入取后不再被其他部門入取。
六、 結(jié)對感受
這次作業(yè)感覺完成的不是很好,主要是因為留給作業(yè)的時間太少。由于國慶假期出門旅游,一號出去六號才回來,累得半死七號睡了一天,導(dǎo)致工期嚴(yán)重拖后。。八號才正式開始作業(yè),感覺很對不起自己的隊友,是我拖累他了。緊趕慢趕加班熬夜趕才完成了作業(yè)的大概,還有很多需要完善的。。真的很想早點回來趕作業(yè),可是無奈票是早就買好的,沒法改,花了錢在外面又不能不玩盡興。。唉,導(dǎo)致作業(yè)很趕,自己累也拖累隊友,不說了,都是淚。
這次作業(yè)給我最大的收益就是了解了Json這種輕量級的數(shù)據(jù)交換格式。對代碼的輸出標(biāo)準(zhǔn)格式有了更深刻的認(rèn)識,并且掌握了json的數(shù)據(jù)解析轉(zhuǎn)化,還有熟悉了隨機數(shù)的用法并且如何在一個給定的范圍隨機且不重復(fù)。
結(jié)對的感受,最大的就是兩個人代碼風(fēng)格的差異,所以要制定代碼規(guī)范。還有遇到問題一定要制定計劃,及時溝通,主動聯(lián)系,不然可能會導(dǎo)致對對方的進度有點不了解且合并代碼的時候會因為雙方做的接口或者是變量設(shè)定不一樣導(dǎo)致各種問題,這也僅僅是兩個人的小團隊,如果是多個人,那會更麻煩,所以學(xué)好軟件工程是很重要的。還有就是,以后的作業(yè)和娛樂一定要安排好= =不能像這次一樣這么趕了。
轉(zhuǎn)載于:https://www.cnblogs.com/n9705/p/7642620.html
總結(jié)
以上是生活随笔為你收集整理的软件工程实践2017结对第二次作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #42
- 下一篇: .NET开源MSSQL、Redis监控产