




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、課程設計題目:1、課程設計名稱:學生考勤系統(tǒng)。2、課程設計內容: 對學生考勤信息的統(tǒng)計與管理,可以分為若干個模塊來實現(xiàn),如:理論 課考勤、實驗課考勤、班級或院系會議考勤、課外活動考勤等等。缺勤的情況可以按不同的類型(缺席、遲到、早退、請假)設置不同的權值。系統(tǒng)要求能對 考勤信息進行數(shù)據(jù)錄入、情況的統(tǒng)計、信息的輸出顯示等等。學生也可以根據(jù)自己的理解,去考 慮更多的功能,并給予實現(xiàn)。能按各種條件進行組合查詢和數(shù)據(jù)統(tǒng)計,并能按指定順序進行格式 化輸出。對數(shù)據(jù)的新增,修改及刪除應注意滿足相應的約束條件。二、問題的分析:在進行問題的分析前,我們應該知道該問題的任務和需求。任務和需求如下: 考勤信息記
2、錄了學生的在校所有學習生活的出勤情況,它包括:缺席日期、 缺席類型。如:若是缺課,則應記錄缺課日期、第幾節(jié)課、課程名稱、學生學號、 學生姓名、缺課類型(遲到、早退、請假及曠課) 。試設計一考勤管理系統(tǒng),使之能提供以下功 能:1 、錄入學生的缺勤記錄;2 、修改某個學生的缺勤記錄;3 、查詢某個學生的缺勤情況;4 、統(tǒng)計某段時間內, 缺勤學生學號及缺勤次數(shù), 按缺勤權值統(tǒng)計學生的負分值, 并能進行排序;5 、統(tǒng)計某段時間內,有學生曠課的課程及曠課人次,按曠課人次由多到少排序;6 、系統(tǒng)以菜單方式工作。 具體要求如下:1 、 采取模塊化方式進行程序設計, 要求程序的功能設計、 數(shù)據(jù)結構設計及整體結
3、構設計合理。 學生也可根據(jù)自己對題目的理解增加新的功能模塊(視情況可另外加分) 。2 、 系統(tǒng)以菜單界面方式(至少采用文本菜單界面,如能采用圖形菜單界面更好)工作,運行 界面友好,演示程序以用戶和計算機的對話方式進行。3 、 程序算法說明清晰,理論分析與計算正確,運行情況良好,實驗測試數(shù)據(jù)無誤,容錯性強 (能對錯誤輸入進行判斷控制) 。4 、 編程風格良好 (包括縮進、 空行、 適當注釋、 變量名和函數(shù)名見名知意, 程序容易閱讀等) 所以進行問題的分析時我們應該進行以下工作:(1)備工作:a 、仔細閱讀課程設計任務書,明確實驗設計的目的、實驗內容、實驗要求、所需知識點等。b、閱讀教材及相關材料
4、,更深入的了解所需知識點,并與其它知識點能夠融會貫通,加深 對各知識點的了解,使得在進行課程設計的時候能夠更好的運用各知識點。當看到本設計所設計的知識點時,心里真的很害怕,因為其中有很多的知識點我都不知道, 所以在課程設計開始的第一周我基本沒做出什么。后來經(jīng)過翻閱資料,問題被逐一解決。(2 )設計整體框架: 由實驗設計內容、目的與要求來分析該如何簡略設計該實驗的總體框架, ,然后一步步完善整個程序。a 、分析實驗題目,確定需要用到對象,分析如何使用對象,并分配好成員函數(shù)和成員數(shù)據(jù)。b、分析實驗要求的功能,按功能確定需要用到的外部函數(shù)。c、大概想想是不是需要其他的外部函數(shù)來輔助外部函數(shù)來實現(xiàn)實驗
5、要求的功能。d、想想主函數(shù)如何實現(xiàn)。(3) 、完善函數(shù):按實驗設計的總體框架一步步來編寫函數(shù)。對于暫時想不到的函數(shù)先跳過 或查書,一步步寫完函數(shù)。( 4)、程序實現(xiàn)思路: 開始是設計程序的界面,了解需要實現(xiàn)的功能模塊。對數(shù)據(jù)結構的選擇寫出的界面,現(xiàn)在需要做的事情其實就是要將所有的菜單功能進行實現(xiàn)。可以考慮將用戶輸 入每個學生的記錄用一個結構體里面,即:struct Student_info std:string date;/缺課日期std:string class_num; /第幾節(jié)課std:string course_name; /課程名稱std:string stu_name;/學生姓名s
6、td:string non_attendance_type; /缺課類型;最后所有的學生記錄都保存到一個 vector 里面,然后根據(jù)需要再將里面需要查找的元素進 行查找,相應的排序可能就是將他們盡可能壓進關聯(lián)式容器map,有的部分就壓入 set里面,這些都是根據(jù)模塊的功能來選定的。對功能的實現(xiàn)1、錄入學生的缺課記錄首先提示用戶按照正確的格式進行學生缺課記錄的錄入,這個步驟比較簡單,只需要不斷地 將記錄的每個數(shù)據(jù)項存入結構體對應的成員中。2、修改某個學生的缺課記錄首先必須查找到你所需要修改的那位的學生全部缺課記錄。這個模塊不需要定義新的結構 體。在修改前當然要檢查記錄是否為空了,不為空的話,可
7、以設置下面這五個菜單供用戶選擇:1 、缺課日期 2、第幾節(jié)課 3、課程名稱4、學生姓名 5、缺課類型 6、退出修改程序并返回系統(tǒng)主菜單修改很簡單,僅需要對該學生的某個部分進行替換即可。采用 switch 語句很快就解決。 J 最后實現(xiàn)對所選記錄的修改,完成后更新原有的學生記錄。3、查詢某個學生的缺課情況查詢某個學生的缺課情況 , 這個模塊是在以下這個函數(shù)中實現(xiàn)的:find_student_absent(vector& students, string& name)其中name為用戶本人輸入的學生姓名,這樣可以很快在vector里面找到該學生的所有的記 錄。為了達到查詢結果按照日期升序排序,同一
8、天內按照所缺課程的時間升序排序的目的,那就 需要選擇一個數(shù)據(jù)結構 need 來保存查找得到的該學生的所有缺課記錄,即:mapstring, mapstring, vector need這個數(shù)據(jù)結構看起來有點復雜,其實非常好用。第一個索引值string 類型保存學生的缺課的日期,第二個 map的鍵值則為該學生當天在第幾節(jié)課缺課,而vector用來保存該學生其余信息,那么得到的 need 保存的記錄已經(jīng)滿足了查詢結果按照日期升序排序,同一天內按照所缺課 程的時間升序排序的要求,只需要按格式輸出這些記錄即可。4、統(tǒng)計曠課學生姓名及曠課節(jié)數(shù)和有學生曠課的課程及曠課人次這兩個模塊之所以放在一起討論,是由
9、于它們其實功能都是大同小異的??梢钥紤]用泛型編 程來解決。不過我在源程序中并沒有這么做,而是寫成兩個函數(shù)模塊。這個兩個模塊根據(jù)課程名稱來找出所有與“曠課”這個字符串有關的記錄先暫存到一個 vector 。考慮到 vector 遠遠不能滿足客戶的要求,那么可以考慮新建一個數(shù)據(jù)結構來保存這些 記錄,同時滿足要求,即:mapint, set need; /將統(tǒng)計出來的結果保存屬于這段時間的學生曠課記錄其中set保存的是曠課學生姓名(有學生曠課的課程),map的鍵值為學生曠課節(jié)數(shù)(曠課人 次)。最后會發(fā)現(xiàn)一個小問題,輸出的結果并不是用戶需要的結果先按曠課節(jié)數(shù)(曠課人次)降序 排序,曠課節(jié)數(shù)相同的學生按
10、姓名(有學生曠課的課程)升序排序, 解決的辦法很簡單,只需要再輸出的時候定義一個迭代器即可解決,即:mapint, set :const_reverse_iterator mapset_it = need.rbegin();該功能得以解決。5、退出系統(tǒng)三、算法的設計:根據(jù)任務要求,我定義了 5 個子函數(shù)和一個結構體,分別將五個字函數(shù)分為五個模塊。 第一個模塊:輸入學生的缺課記錄。在該模塊中,調用 s.clear() 來清空 s 的記錄,用 in.clear();/ 將 記 錄 的 錯 誤 狀 態(tài) 恢 復 正 確 , 以 繼 續(xù) 讀 取 記 錄 , 用 bool is_empty(vector&
11、 s)/ 判斷輸入學生的記錄是否為空,為空則返回真,用 bool compare(Student_info& x,Student_info& y)/ 按照時間排序 , 若日期相等則看課程時間,然后 再根據(jù) bool time(const Student_info& stud,int y1,int m1,int d1,int y2,int m2,int d2)/ 篩選符合輸入時間段的數(shù)據(jù)。第二個模塊:修改某個學生的缺課情況。首先清空MAP容器,根據(jù)ix2=s_ name.fi nd( name); /符合名字要求的數(shù)據(jù),用 for(ix2=s_name.begin();ix2!=s_name.e
12、nd();ix2+)/將改寫后的數(shù)據(jù)放入 vector 容器中。第三個模塊: 查找某學生的缺課情況。 用 bool compare2(Search_struct& x,Search_struct& y)/ 按照次數(shù)排序 , 次數(shù)相等的則按照名字排序。第四個模塊:查找某段時間內曠課學生姓名及曠課節(jié)數(shù)。 第五個模塊:查找某段時間內曠課的課程及曠課人次。四、上機調試過程: 本次課程設計總體上感覺比之前做過的實驗綜合性比較強。在這里我主要總結一下我設計這個學生考勤管理系統(tǒng)的心得和在編譯程序的過程中遇到的問題以及解決的辦法。為了使得程序的編寫更加有條理,閱讀更加明了,在寫每個模塊的時候都將自己的思路寫在
13、 每個函數(shù)的第一行,告訴自己我這個函數(shù)將要做的是什么事情。下面實對調試過程中遇到的一些小收獲:編譯時發(fā)現(xiàn)這樣的小錯誤:1d:my documentsvisual studio 2005projectscourse1course1main.cpp(69): errorC2360: initialization of name is skipped by case label最后得到的解決答案實:原來在 case 語句中,是不允許聲明變量的。初次使用 const_reverse_iterator 的總結 :運行的時候出現(xiàn)“ map set iterator not incrementable”這樣
14、的運行終止錯誤問題的結局:經(jīng)過檢驗查出是 const_reverse_iterator原因是: mapint, set :const_reverse_iterator mapset_it = need.rbegin();for(; mapset_it != need.rend(); mapset_it-)mapset_it 的操作不能是 mapset_it- 操作 ,而應該是 mapset_it+五、測試結果及其分析:如: 1. 錄入學生的缺課情況: 2008-2-3 1-2 林 C+ 曠課2008-2-4 3-4 夏 歷史 早退如果再按 4:查找某段時間內曠課學生姓名及曠課節(jié)數(shù)。 會顯示出如
15、下結果: 時間段, 2008-2-11-2.至 2008-2-28 ,曠課姓名:林,曠課節(jié)數(shù):六、參考文獻:1 .鄭莉 等編著C+語言程序設計(第三版)北京:清華大學出版社2 .鄭莉等編著C+語言程序設計(第三版)學生用書北京:清華大學出版社3 .劉振安 等編著C+程序設計課程設計機械工業(yè)出版社4 .吳乃陵 等編著C+程序設計北京:高等教育出版社5 .李春葆 等編著C+程序設計學習與上機實驗指導北京:清華大學出版社七、附錄 源程序:#include #include #include #include #include #include #include #include using name
16、space std;struct Student_infoint year,month,day,lesson1,lesson2;std:string course,name,type;std:istream& read(std:istream&);istream& Student_info:read(istream& in) inyearmonthdaylesson1lesson2coursenametype; return in;istream& read_record(istream& in,vector&s)/ 第 一 個 模 塊 輸入學生的缺課記錄Student_info record
17、;s.clear();/ 調用 s.clear() 來清空 s 的記錄while(record.read(in)s.push_back(record);in.clear();/ 將記錄的錯誤狀態(tài)恢復正確,以繼續(xù)讀取記錄return in; bool is_empty(vector& s)/ 判斷輸入學生的記錄是否為空,為空則返回真return s.empty();bool compare(Student_info& x,Student_info& y)/ 按照時間排序 , 若日期相等則看課程時 間 if(x.year=y.year&x.month=y.month&x.day=y.day) re
18、turn x.lesson1y.lesson1;else if(x.year=y.year&x.month=y.month&x.day!=y.day)return x.dayy.day;else if(x.year=y.year&x.month!=y.month)return x.monthy.month;else return x.yeary.year;bool time(const Student_info& stud,int y1,int m1,int d1,int y2,int m2,int d2)/ 篩選符合輸入時間段的數(shù)據(jù)if (y1 = stud.year & stud.mont
19、h = m1 & stud.day d2)return 0;else if (y1 = stud.year & stud.month m2)return 0;else if (y1 stud.year | y2 stud.year)return 0;elsereturn 1;課情況 if(!is_empty(s)int n,m,j,k;mapstring,vector s_name;mapstring,vector :iterator ix2;vector:iterator ix,iter,itera;string name; 定義這些參數(shù)和迭代器必須在SWITHC外卜,不然它可能被忽略跳過w
20、hile(true)cout*endl;cout * 1. 請輸入你要修改缺課記錄的學生姓名*endl;cout*endl;cout*2.返回 上 一+k-菜*endl;cout*endl;coutn;if(n=1)s_name.clear(); 清空 MAP容器for(ix=s.begin();ix!=s.end();+ix)s_name(*ix).name.push_back(*ix);s.clear();coutname;coutendl;if(s_name.find(name)!=s_name.end()ix2=s_name.find(name); /找到符合名字要求的數(shù)據(jù) , 并顯示
21、出for(iter=(*ix2).second.begin();iter!=(*ix2).second.end();+iter)cout(*iter).year-(*iter).month-(*iter).dayt; cout(*iter).lesson1-(*iter).lesson2;coutt(*iter).courset(*iter).namet(*iter).typeendl;itera=(*ix2).second.begin();coutj;for(k=0;k!=j-1;+k) +itera;coutendl;*cout * 需 要 更 改 的 項 目 *endl;cout * *
22、endl;cout * 1 日期 2 節(jié)次 3 課程名稱 4 姓名 5 缺課類型 6 返回上一級 *endl;cout * *endl;coutendl;*coutm;switch(m)case 1:cout(*itera).year(*itera).month(*itera).day;break;case 2:cout(*itera).lesson1(*itera).lesson2; break;case 3: cout(*itera).course;break; case 4: cout(*itera).name;break; case 5: cout(*itera).type;break
23、; case 6: break;default:cout 你的選擇錯了,請看清楚 !second.begin();iter!=ix2-second.end();iter+)s.push_back(*iter);elsecout 沒有這個學生的缺課記錄 endl;coutendl;break;else if(n=2)return ;elsecout 你的選擇錯了,請看清楚 !endl;elsecout 記錄為空,沒有學生的缺課記錄 !endl;void Search_record(vector& s)/ 第三個模塊 缺課情況 if(!is_empty(s)int i;vector:iterato
24、r iter; mapstring,vector :iterator it1; mapstring,vector s_name; mapstring, vector :iterator itera; vector:iterator it;vector 容器查找某學生的string name; while(true)cout*endl;cout *endl;cout * 1 輸入你要查詢的學生姓名 2 返回上一級 *endl; cout*endl;cout*endl;couti;if(i=1)s_name.clear();for(it=s.begin();it!=s.end();+it)s_na
25、me(*it).name.push_back(*it);for(itera=s_name.begin();itera!=s_name.end(); +itera)sort(itera-second.begin(),itera-second.end(),compare); coutname;coutendl;if(s_name.find(name)!=s_name.end()it1=s_name.find(name);for(iter=(*it1).second.begin();iter!=(*it1).second.end();+iter) cout(*iter).year-(*iter).m
26、onth-(*iter).dayt; cout(*iter).lesson1-(*iter).lesson2;coutt(*iter).courset(*iter).namet(*iter).typeendl; elsecout 沒有這個學生 .endl;coutendl;else if(i=2)return ;elsecout 對不起,沒有這個選項 !endl;elsecout 沒有這個學生的缺課記錄 endl;struct Search_structstring name,course;int times;/ 定義另一個結構模塊, 次數(shù)相等的則按照bool compare2(Search_
27、struct& x,Search_struct& y)/ 按照次數(shù)排序 名字排序if(x.times=y.times)return y.times;查找某段時void Search_s_t(vector& std)/ 第四個模塊 間內曠課學生姓名及曠課節(jié)數(shù)if(!is_empty(std)vector:iterator it;vector:iterator itera; map:iterator iter;vector vec;int y1,m1,d1,y2,m2,d2;map ret;cout 請輸入你要查找的一個時間段 (y1 m1 d1 y2 m2 d2): y1m1d1y2
28、m2d2;for(it=std.begin();it!=std.end();+it) if(time(*it,y1,m1,d1,y2,m2,d2) retit-name+=(it-lesson2-it-lesson1+1);for(iter=ret.begin();iter!=ret.end();iter+)Search_struct tmp;=iter-first;tmp.times=iter-second;vec.push_back(tmp);sort(vec.begin(),vec.end(),compare2); for(itera=vec.begin();itera!
29、=vec.end();itera+) coutnamettimesendl;elsecout 對不起,沒有你要查找的記錄 !endl;查找某段時void Search_c_t(vector& std)/第五個模塊 -間內曠課的課程及曠課人次if(!is_empty(std)vector:iterator it;vector:iterator itera; map:iterator iter; vector vec; int y1,m1,d1,y2,m2,d2; map ret;cout 請輸入你想要查找的時間段 (y1 m1 d1 y2 m2 d2): y1m1d1y2m2d2;for(it=std.beg
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新質生產力綠色出行
- 血管周細胞瘤的臨床護理
- 2025典當借款合同范本C
- 沈陽高一數(shù)學試卷及答案
- 商品學期末試卷及答案
- 2025裝飾裝修勞務分包合同(正式)
- 智能設備用戶體驗設計考核試卷
- 玉米加工與農產品精深加工考核試卷
- 浙江國企招聘2025上半年嘉興市屬國有企業(yè)招聘97人筆試參考題庫附帶答案詳解
- 紡織設備電氣控制技術考核試卷
- 09DX004 民用建筑工程電氣初步設計深度圖樣
- 母語對目標語習得的影響
- 醫(yī)療糾紛處理及防范技巧與案例分析課件
- 昆明市農科院嵩明基地種質資源圃大棚設施維修項目清單
- 全過程工程造價咨詢服務方案范本
- DB4403T339-2023城市級實景三維數(shù)據(jù)規(guī)范
- 心電監(jiān)護儀故障應急預案
- 冀教版五年級英語下冊-lesson-19-課件
- 城市軌道交通工程建設質量管理標準化研究的開題報告
- 住宅項目從封頂至竣工工序穿插作業(yè)
- 2023版押品考試題庫必考點含答案
評論
0/150
提交評論