版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 一 課程設計目的及要求</p><p><b> 學生通訊系統(tǒng)</b></p><p> 學生通信錄信息包括:姓名、學號、年齡、性別、家庭住址、聯(lián)系電話、寢室號等信息?,F(xiàn)要求編寫程序來完成如下功能:</p><p> 學生通信錄信息的輸入</p><p> 學生的通信錄信息刪除和修改<
2、/p><p> 學生的通信錄信息查詢和統(tǒng)計功能</p><p> 學生的通信錄信息輸出顯示。</p><p> 二 課程設計具體實現(xiàn)</p><p><b> 1.總體設計</b></p><p><b> 2.詳細設計</b></p><p>
3、 在進行系統(tǒng)的各項功能介紹之前,有必要先說一下我所選的課程項設計的主要思路。</p><p> 這個系統(tǒng)的核心部分就是結(jié)構(gòu)體鏈表,它貫穿整個程序。一切數(shù)據(jù)的增、刪、查、改都要以它為支撐。整個程序其實就是在操作一張很大的鏈表。我在15周時就已經(jīng)開始考慮課程設計題目,當時是想先做一個關(guān)于面向過程的課題,立馬就考慮的先用結(jié)構(gòu)體鏈表做為數(shù)據(jù)的容器。而且已經(jīng)做成型了。后來老師您把題目給改了,要求都用面向?qū)ο笞?,我是考慮
4、過用vector或者是list來做數(shù)據(jù)的容器的,但想想程序幾經(jīng)初成型,就不改變?nèi)萜髁耍椭苯影杨惖膶ο笞鰹榻Y(jié)構(gòu)體的數(shù)據(jù)部分,程序當然也有較大改動,但基本框架是沒有變的。</p><p> 先來說鏈表的構(gòu)造,在主菜單下選擇功能之前,鏈表就已經(jīng)認構(gòu)造完畢,程序按行讀取文本文件,每讀一行,便對其進行分割。分割出來的字符串為學生類對象對應的每一項信息。在分割字符串時,我按字符‘@’進行分割(當然,在數(shù)據(jù)存儲時也是按行存
5、儲,且每項信息以‘@’分開),其關(guān)鍵代碼如下:</p><p> void read_info(){ //讀取文件</p><p> head=NULL;</p><p> Student s; //構(gòu)造學生類對象</p><p> ifstream in("student_info.txt");</p
6、><p> string read;</p><p><b> int no;</b></p><p> while(getline(in,read)) {//按行讀取</p><p><b> no=0;</b></p><p><b> int i;<
7、;/b></p><p> while(read.find_first_of("@")!=-1){</p><p> string temp;</p><p> i=read.find_first_of("@");</p><p> temp=read.substr(0,i);</p
8、><p> if(no==0){</p><p> s.name=temp; //賦予姓名</p><p><b> }</b></p><p> if(no==1){</p><p> s.tel=temp; //賦予電話</p><p><b> }&
9、lt;/b></p><p> if(no==2){</p><p> s.xuehao=temp;//賦予學號</p><p><b> }</b></p><p> if(no==3){</p><p> s.sex=temp; //賦予性別</p><p&
10、gt;<b> }</b></p><p> if(no==4){</p><p> s.banji=temp; //賦予班級</p><p><b> }</b></p><p><b> no++;</b></p><p> read=r
11、ead.substr(i+1);</p><p><b> }</b></p><p> s.dizhi=read; //賦予地址</p><p> if(s.name.size()>0&&s.xuehao.size()>0){ //判斷學號與姓名是否為空</p><p> inser
12、t_into_list(s); //插入鏈表</p><p><b> }</b></p><p><b> }</b></p><p> in.close();</p><p><b> }</b></p><p> void insert_
13、into_list(Student st){</p><p> struct list*curr,*ne;</p><p> curr=(struct list*)new(struct list); //申請空間</p><p> curr->student=st;</p><p><b> ne=head;</
14、b></p><p> if(head==NULL){//如果頭指針為空插入第一條數(shù)據(jù)</p><p> head=curr;</p><p> curr->next=NULL;</p><p><b> }</b></p><p><b> else</
15、b></p><p> {while(ne->next!=NULL) ne=ne->next;//遍歷結(jié)構(gòu)體,直到尾</p><p> ne->next=curr;</p><p> curr->next=NULL;</p><p><b> }</b></p>&l
16、t;p><b> }</b></p><p> Txt文件才的儲存形式如下:</p><p> 所以,能正確的讀取所有數(shù)據(jù)在于字符串的分割,當然用此種方法讀到的數(shù)據(jù)全是字符串,只是本系統(tǒng)為學生通訊系統(tǒng),并不需要其他類型的數(shù)據(jù),如有必要,字符串也可以轉(zhuǎn)化。</p><p> 就這樣,當文件按行讀取完畢時,鏈表中的每個結(jié)構(gòu)體都包含有一
17、個不同的學生類對象,至此,鏈表已初始化完畢。</p><p> 在程序接下來的運行過程中,對數(shù)據(jù)的操作就是直接操作鏈表的節(jié)點。</p><p> 下面對系統(tǒng)功能進行介紹:</p><p><b> 登陸系統(tǒng):</b></p><p> 通過歡迎界面后,將進入登陸方式選擇界面,如圖:</p><
18、p> 若選擇以普通用戶身份登錄系統(tǒng),會出現(xiàn)以下界面:</p><p> 普通用戶的功能包括:1.增加數(shù)據(jù);2.查詢數(shù)據(jù);3.瀏覽數(shù)據(jù);4.數(shù)據(jù)統(tǒng)計</p><p> 增加數(shù)據(jù)功能的界面如下:</p><p> 用戶根據(jù)系統(tǒng)提示,對單個學生信息進行逐項輸入,按回車鍵結(jié)束輸入。除姓名與學號外,其他信息只要直接按回車鍵就可以跳過輸入,系統(tǒng)將保存為空。對信息的
19、輸入還要有一定的規(guī)范性,如學號與電話為純數(shù)字;姓名長度最多只有四個字;性別若有,只能為男或女,系統(tǒng)會自動對輸入的信息進行校驗,包括規(guī)范性校驗與數(shù)據(jù)是否重復校驗。</p><p> 若無法通過校驗,數(shù)據(jù)不會保存。</p><p><b> 其關(guān)鍵代碼如下:</b></p><p><b> 規(guī)范性校驗:</b><
20、/p><p> bool Student::check_tel_xuehao(){ //學號與電話檢查函數(shù)</p><p> if(xuehao.size()==0){ //如果學號為空,返回false</p><p> return false;</p><p><b> }</b></p>&
21、lt;p> if(!check_string(xuehao)||!check_string(tel)){ //如果學號中處在數(shù)字以外的字符,返回false</p><p> cout<<"學號或電話輸入有誤!"<<endl;</p><p> return false;</p><p><b>
22、}</b></p><p> return true;</p><p><b> }</b></p><p> bool check_string(string a){ //檢測字符串中是否只包含數(shù)字</p><p><b> char b;</b></p>&l
23、t;p> for(int i=0;i<a.size();i++)</p><p><b> {</b></p><p> b=a.at(i);</p><p> if(b>'9'||b<'0')return false;</p><p><b>
24、 }</b></p><p> return true;</p><p><b> }</b></p><p> bool Student::check_name_other(){ //姓名檢測函數(shù)</p><p> if(name.size()==0||name.size()>10){
25、 //如果姓名為空或者姓名長度過長</p><p> cout<<"姓名輸入有誤!"<<endl;</p><p> return false;</p><p><b> }</b></p><p><b> else</b></p>
26、<p> return true;</p><p><b> }</b></p><p> bool Student::check_sex(){ //此為性別檢測函數(shù),性別可以為空,可以為男,也可以為女,但不可以為其他字符,或者返回false</p><p> if(sex.size()>2||(sex.size(
27、)>0&&(sex.compare("男")&&sex.compare("女")))){</p><p> cout<<"性別輸入錯誤!"<<endl;</p><p> return false;</p><p><b> }&
28、lt;/b></p><p><b> else</b></p><p> return true;</p><p><b> }</b></p><p> 數(shù)據(jù)是否重復校驗代碼如下:</p><p> struct list* User::check_rep
29、eat(string key,int type){ //此函數(shù)也可用于數(shù)據(jù)查詢,key代表要查詢的關(guān)鍵字。type=1 表示按姓名查找,type=2 表示按學號查找</p><p> struct list*ne;</p><p> ne=head; //注意這個head不能空,要初始化</p><p><b> int com;</b&g
30、t;</p><p> while(ne!=NULL){ //遍歷列表</p><p><b> com=0;</b></p><p> if((type==1||type==0)&&!key.compare(ne->student.name))com++; //對比姓名</p><p>
31、if((type==2||type==0)&&!key.compare(ne->student.xuehao))com++;//對比學號</p><p> if(com>0){ //若m>0,證明原有數(shù)據(jù)中含有被檢數(shù)據(jù),或者的話,將會返回NULL。</p><p> return ne;</p><p><b>
32、}</b></p><p> if(ne->next==NULL)break;</p><p> ne=ne->next;</p><p><b> }</b></p><p> cout<<endl;</p><p> return NULL;<
33、;/p><p><b> }</b></p><p> 數(shù)據(jù)查詢功能界面如下:</p><p> 進行數(shù)據(jù)查詢時,可輸入任何字符,只要學生信息中任何一項包含輸入的關(guān)鍵字,該信息都會被顯示出來,如上圖,分別輸入了“女”,“B105”,進行查詢,結(jié)果信息都完整的顯示了出來,以下是進行信息查詢的關(guān)鍵代碼:</p><p>
34、 void User::find_info(){</p><p> string key; //關(guān)鍵字</p><p> struct list*ne; //結(jié)構(gòu)體指針</p><p> int find; //找到的數(shù)據(jù)量</p><p><b> int com;</b></p>&
35、lt;p> char s; //選擇</p><p><b> FIND:</b></p><p> system("cls");</p><p> cout<<"請輸入要查詢的關(guān)鍵字:";</p><p><b> cin>>k
36、ey;</b></p><p> ne=head; //注意這個head不能空,要初始化</p><p><b> find=0;</b></p><p> show_table_head();</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針所指的學生
37、類,然后進行每項數(shù)據(jù)的對比</p><p><b> com=0;</b></p><p> if(check_string(ne->student.name,key))com++; //如果相關(guān)信息內(nèi)包含關(guān)鍵字,com++,下同</p><p> if(check_string(ne->student.banji,key))
38、com++;</p><p> if(check_string(ne->student.dizhi,key))com++;</p><p> if(check_string(ne->student.sex,key))com++;</p><p> if(check_string(ne->student.tel,key))com++;</
39、p><p> if(check_string(ne->student.xuehao,key))com++;</p><p> if(com>0){ //即至少有一項匹配,則橫排顯示</p><p><b> find++;</b></p><p> ne->student.show_info(fi
40、nd);</p><p><b> }</b></p><p> if(ne->next==NULL)break; //指針指向尾部,退出</p><p> ne=ne->next;</p><p><b> }</b></p><p> cout&
41、lt;<'\n'<<"找到"<<find<<"條數(shù)據(jù)!\n"<<endl;</p><p> cout<<"是否繼續(xù)查找(y/n)?";</p><p><b> cin>>s;</b></p>&
42、lt;p> if(s=='y') goto FIND;</p><p><b> }</b></p><p><b> 數(shù)據(jù)瀏覽功能:</b></p><p> 此功能可以顯示所有存入的數(shù)據(jù),界面如下:</p><p> 在數(shù)據(jù)顯示時,主要用的技術(shù)就是對結(jié)構(gòu)體鏈表進行
43、遍歷,指針指向結(jié)構(gòu)體的學生類對象,然后調(diào)用該類的自身數(shù)據(jù)顯示函數(shù),這樣就可顯示所有數(shù)據(jù)。關(guān)鍵代碼如下:</p><p> void User::show_all(){ //顯示所有信息</p><p> system("cls"); //清屏</p><p> struct list*ne; //鏈表指針</p><
44、p> ne=head; //指向頭指針</p><p><b> int i=1;</b></p><p> show_table_head();//顯示表頭</p><p> while(ne!=NULL) //遍歷鏈表</p><p><b> {</b></p>
45、;<p> ne->student.show_info(i); //橫排顯示學生信息</p><p><b> i++;</b></p><p> if(ne->next==NULL) break; //如果到達尾指針,退出</p><p> ne=ne->next; //指針指向下一位</p&g
46、t;<p><b> }</b></p><p> system("pause");</p><p><b> }</b></p><p> void Student::show_info(int i){ //橫行顯示信息</p><p> cout<
47、;<setw(4)<<i;</p><p> cout<<setw(8)<<name;</p><p> cout<<setw(14)<<tel;</p><p> cout<<setw(14)<<xuehao;</p><p> cout<
48、;<setw(6)<<sex;</p><p> cout<<setw(9)<<banji;</p><p> cout<<setw(7)<<dizhi<<endl;</p><p><b> }</b></p><p><b>
49、; 數(shù)據(jù)統(tǒng)計功能:</b></p><p> 數(shù)據(jù)可以按照三種方式進行統(tǒng)計,即 按性別、按班級,按住址。</p><p> 計時,對應條目相等的數(shù)據(jù)會顯示在同體列表下,并會顯示數(shù)據(jù)總數(shù)。一下截圖是按住址統(tǒng)計的部分結(jié)果:</p><p><b> 以下是關(guān)鍵代碼:</b></p><p> void
50、User::tongji_info(){</p><p><b> TONGJI:</b></p><p> system("cls");</p><p><b> char s;</b></p><p> cout<<"選擇您可以統(tǒng)計方式:\n\t
51、1.按性別統(tǒng)計\n\t2.按住址統(tǒng)計\n\t3.按班級統(tǒng)計\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n請選擇:";</p><p><b> cin>>s;</b></p><p> if(s=='1'){</p><p> find_info(1);</p>&
52、lt;p><b> }</b></p><p> else if(s=='2'){</p><p> find_info(2);</p><p><b> }</b></p><p> else if(s=='3'){</p><p
53、> find_info(3);</p><p><b> }</b></p><p><b> else{</b></p><p> err_show();</p><p><b> }</b></p><p> cout<<
54、;"\n繼續(xù)還是回主菜單[1_or_2]:";</p><p><b> cin>>s;</b></p><p> if(s=='1') goto TONGJI;</p><p><b> }</b></p><p> void User::f
55、ind_info(int type){</p><p> tyhead=NULL;</p><p> struct list*ne; //結(jié)構(gòu)體list指針</p><p> ne=head; //注意這個head不能空,要初始化</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針所指的學
56、生類,然后進行每項數(shù)據(jù)的對比</p><p> string key;</p><p> if(type==1){</p><p> key=ne->student.sex;</p><p><b> }</b></p><p> else if(type==2){</p&g
57、t;<p> key=ne->student.dizhi;</p><p><b> }</b></p><p><b> else{</b></p><p> key=ne->student.banji;</p><p><b> }</b>
58、;</p><p> if(!contain(key)){</p><p><b> add(key);</b></p><p><b> }</b></p><p> if(ne->next==NULL)break; //指針指向尾部,退出</p><p>
59、; ne=ne->next;</p><p><b> }</b></p><p> struct typelist*ne2;</p><p> ne2=tyhead;</p><p> system("cls");</p><p> while(ne2!=N
60、ULL){ //遍歷鏈表typelist</p><p> show_table_head(); //表頭顯示函數(shù)</p><p> string key;</p><p> key=ne2->atype;</p><p> if(key.size()==0){</p><p><b>
61、key="其他";</b></p><p> cout<<key<<":"<<see_list(type,key,true)<<"人\n";</p><p><b> }</b></p><p><b> el
62、se</b></p><p><b> {</b></p><p> cout<<key<<":"<<see_list(type,key,false)<<"人\n";</p><p><b> }</b></p&
63、gt;<p> if(ne2->next==NULL)break; //指針指向尾部,退出</p><p> ne2=ne2->next;</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b
64、></p><p> int see_list(int type,string key,bool nullinfo){ //type條目類型,key表示此條目下的數(shù)據(jù),此函數(shù)用于返回某項包含相同數(shù)據(jù)的數(shù)目</p><p> struct list*ne; //結(jié)構(gòu)體list指針</p><p> ne=head; //注意這個head不能空,要初始化&
65、lt;/p><p> int find=0;</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針所指的學生類,然后進行每項數(shù)據(jù)的對比</p><p><b> int i=0;</b></p><p> if(type==1){</p><p>
66、if(!ne->student.sex.compare(key)||((ne->student.sex.size())==0&&nullinfo)) //檢查性別是否匹配</p><p><b> {</b></p><p><b> find++;</b></p><p> ne-&g
67、t;student.show_info(find);</p><p><b> }</b></p><p><b> }</b></p><p> else if(type==2){</p><p> if(!ne->student.dizhi.compare(key)||((ne-&
68、gt;student.dizhi.size()==0)&&nullinfo)) //檢查地址是否匹配</p><p><b> {</b></p><p><b> find++;</b></p><p> ne->student.show_info(find);</p><
69、;p><b> }</b></p><p><b> }</b></p><p><b> else{</b></p><p> if(!ne->student.banji.compare(key)||((ne->student.banji.size()==0)&&a
70、mp;nullinfo)) //檢查班級是否匹配</p><p><b> {</b></p><p><b> find++;</b></p><p> ne->student.show_info(find);</p><p><b> }</b></p
71、><p><b> }</b></p><p> if(ne->next==NULL)break; //指針指向尾部,退出</p><p> ne=ne->next;</p><p><b> }</b></p><p> return find;<
72、;/p><p><b> }</b></p><p> void add(string key){</p><p> struct typelist*curr,*ne; //結(jié)構(gòu)體typelist指針</p><p> curr=(struct typelist*)new(struct typelist); //申請
73、空間</p><p> curr->atype=key;</p><p> ne=tyhead; //ne指向頭指針,如果初始化數(shù)據(jù)時,文件中有數(shù)據(jù),此時頭指針一定不為空</p><p> if(tyhead==NULL){//若鏈表為空</p><p> tyhead=curr; //頭指針指向current&l
74、t;/p><p> curr->next=NULL; //current為第一數(shù)據(jù),表頭的next指針為空</p><p><b> }</b></p><p> else //如果頭指針不為空</p><p><b> {</b></p><p> wh
75、ile(ne->next!=NULL) //遍歷鏈表,直到ne指針指向尾部</p><p><b> {</b></p><p> ne=ne->next;</p><p><b> }</b></p><p> ne->next=curr; //尾指針的next指針指向c
76、urrent,此時current已插入鏈表</p><p> curr->next=NULL; //current位于鏈表尾部,其next指針當為NULL</p><p><b> }</b></p><p><b> }</b></p><p> bool contain(stri
77、ng key){</p><p> struct typelist*ne; //結(jié)構(gòu)體指針typelist</p><p> ne=tyhead;</p><p> while(ne!=NULL){ //遍歷鏈表</p><p> if(!ne->atype.compare(key))return true;</p&
78、gt;<p> if(ne->next==NULL)break; //指針指向尾部,退出</p><p> ne=ne->next;</p><p><b> }</b></p><p> return false;</p><p><b> }</b><
79、;/p><p> 若選擇以管理員身份登錄系統(tǒng)</p><p> 則會出現(xiàn)管理員界面:</p><p> 當正確輸入用戶名與密碼后,方可進行功能操作。</p><p> 其中,增加數(shù)據(jù)、查詢數(shù)據(jù)、瀏覽數(shù)據(jù)與數(shù)據(jù)統(tǒng)計功能與普通用戶的代碼實現(xiàn)相同,因為管理員類繼承與普通用戶類,所以此函數(shù)直接繼承。在此不多作描述。下面介紹刪除數(shù)據(jù)與修改數(shù)據(jù)功能。
80、</p><p><b> 數(shù)據(jù)修改</b></p><p> 進行數(shù)據(jù)修改時,需要先輸入正確的學號或姓名,在找到數(shù)據(jù)后,可按提示進行修改,次系統(tǒng)有一個方便的地放就是若不想修改某項數(shù)據(jù),可直接按回車鍵,如下圖。關(guān)鍵代碼實現(xiàn)如下:</p><p> void Manager::edit_info(){</p><p>
81、; string key; //關(guān)鍵字</p><p><b> char s;</b></p><p> struct list*xiu;</p><p><b> EDIT:</b></p><p> system("cls");</p><p
82、> Student temp; //用于做緩存的學生類對象</p><p> cout<<"\n請輸入要修改的條目關(guān)鍵字:";</p><p> cin.ignore(1024,'\n');</p><p> getline(cin,key);</p><p> if(((xi
83、u=check_repeat(key,1))!=NULL )|| ((xiu=check_repeat(key,2))!=NULL)){</p><p><b> bool f;</b></p><p> xiu->student.show_info(); //以下為數(shù)據(jù)錄入</p><p> cout<<"
84、\n請輸入新數(shù)據(jù),若不必修改,請直接按回車鍵:\n";</p><p> cout<<"請輸入姓名:";</p><p> getline(cin,temp.name);</p><p> cout<<"請輸入電話:";</p><p> getline(cin
85、,temp.tel);</p><p> cout<<"請輸入學號:";</p><p> getline(cin,temp.xuehao);</p><p> cout<<"請輸入性別:";</p><p> getline(cin,temp.sex);</p&g
86、t;<p> cout<<"請輸入班級:";</p><p> getline(cin,temp.banji);</p><p> cout<<"請輸入住址:";</p><p> getline(cin,temp.dizhi);</p><p><b
87、> //以下為數(shù)據(jù)檢查</b></p><p> if(temp.name.size()>0){ //若重輸了姓名</p><p> if(check_repeat(temp.name,1)!=NULL)goto WRONG; //檢查未通過</p><p> }else temp.name=xiu->student.nam
88、e;</p><p> if(temp.xuehao.size()>0){</p><p> if(check_repeat(temp.xuehao,1)!=NULL) goto WRONG;</p><p> }else temp.xuehao=xiu->student.xuehao;</p><p> if(temp.
89、sex.size()==0){</p><p> temp.sex=xiu->student.sex;</p><p><b> }</b></p><p> if(temp.tel.size()==0){</p><p> temp.tel=xiu->student.tel;</p>
90、<p><b> }</b></p><p> if(temp.banji.size()==0){</p><p> temp.banji=xiu->student.banji;</p><p><b> }</b></p><p> if(temp.dizhi.size(
91、)==0){</p><p> temp.dizhi=xiu->student.dizhi;</p><p><b> }</b></p><p> if(temp.check_name_other()&&(temp.check_sex()&&temp.check_tel_xuehao())){ //
92、數(shù)據(jù)規(guī)范性檢查</p><p> xiu->student=temp; // 對指針下數(shù)據(jù)進行修改</p><p> cout<<"\n修改成功!"<<endl;</p><p> edit_flag=true;</p><p> cout<<"\n修改后的數(shù)
93、據(jù)為:"<<endl;</p><p> xiu->student.show_info();</p><p><b> goto ASK;</b></p><p><b> }</b></p><p> else goto WRONG;</p>&l
94、t;p><b> }</b></p><p><b> else{</b></p><p> err_show();</p><p> cout<<"無效的數(shù)據(jù),是否繼續(xù)(y/n)?"</p><p><b> cin>>s;&l
95、t;/b></p><p> if(s=='y') {</p><p> goto EDIT;</p><p><b> }</b></p><p><b> goto ASK;</b></p><p><b> }</b>
96、;</p><p><b> WRONG:</b></p><p> err_show();</p><p> cout<<"\n錯誤!未修改數(shù)據(jù)!"<<endl;</p><p><b> ASK:</b></p><p>
97、; cout<<"\n繼續(xù)還是回主菜單[1_or_2]:";</p><p><b> cin>>s;</b></p><p> if(s=='1')goto EDIT;</p><p><b> }</b></p><p><
98、;b> 數(shù)據(jù)刪除</b></p><p> 刪除數(shù)據(jù)需要先輸入學號或姓名,數(shù)據(jù)的刪除本質(zhì)上就是鏈表節(jié)點的刪除。</p><p><b> 截圖如下:</b></p><p><b> 關(guān)鍵代碼如下:</b></p><p> int Manager::del_info()
99、{ //刪除信息</p><p> string m; //刪除的關(guān)鍵字</p><p> struct list*la,*ne;</p><p><b> char s;</b></p><p><b> DEL:</b></p><p> system(
100、"cls");</p><p><b> ne=head;</b></p><p> if(head==NULL){ //如果數(shù)據(jù)為空</p><p> err_show();</p><p> cout<<"\n空鏈表!不可進行下一步操作!"<<
101、endl;</p><p><b> goto ASK;</b></p><p><b> }</b></p><p> cout<<"輸入要刪除的學號或姓名:";</p><p> cin.ignore(50,'\n');</p>
102、<p> getline(cin,m);</p><p> if(!m.compare(head->student.name)||!m.compare(head->student.xuehao)){ //如果姓名或?qū)W號的所對對應的學生對象位于鏈表頭部,則需要改變頭指針,頭指針指向內(nèi)容將要刪除</p><p> head=ne->next; //改變
103、頭指針</p><p> ne->student.show_info(); //顯示信息</p><p> cout<<"\n確認刪除(y/n)?";</p><p><b> cin>>s;</b></p><p> if(s=='y'){<
104、;/p><p> delete ne; //刪除</p><p> edit_flag=true; //信息已被修改,改變標志</p><p> cout<<"\n數(shù)據(jù)已刪除!"<<endl;</p><p><b> }</b></p><p>
105、 else cout<<"\n數(shù)據(jù)未刪除!"<<endl;</p><p><b> }</b></p><p> else{ //要刪除的信息不位于頭部while(ne!=NULL&&(m.compare(ne->student.name)&&m.compare(ne-&g
106、t;student.xuehao))){ //遍歷結(jié)構(gòu)體,并進行學號或姓名的匹配</p><p><b> la=ne;</b></p><p> if(ne->next==NULL)break;</p><p> ne=ne->next;</p><p><b> }</b>&
107、lt;/p><p> if(!m.compare(ne->student.name)||!m.compare(ne->student.xuehao)){ //若學號或姓名匹配,則進行刪除</p><p> ne->student.show_info(); //顯示要刪除的信息</p><p> cout<<"\n確認刪除(
108、y/n)?";</p><p><b> cin>>s;</b></p><p> if(s=='y'){</p><p> la->next=ne->next;</p><p> delete ne;</p><p> edit_fla
109、g=true;</p><p> cout<<"\n數(shù)據(jù)已刪除!"<<endl;</p><p><b> }</b></p><p> else cout<<"\n數(shù)據(jù)未刪除!"<<endl;</p><p><b>
110、; }</b></p><p><b> else {</b></p><p> err_show();</p><p> cout<<"\n此數(shù)據(jù)不存在!"<<endl;</p><p><b> }</b></p>
111、<p><b> }</b></p><p><b> ASK:</b></p><p> cout<<"\n繼續(xù)還是回主菜單[1_or_2]:";</p><p><b> cin>>s;</b></p><p>
112、 if(s=='1') goto DEL;</p><p><b> return 1;</b></p><p><b> }</b></p><p> 除此之外,系統(tǒng)還有個主題選擇能,只是對系統(tǒng)起美化作用,與課題要求無關(guān),在此不多做介紹。</p><p> (3)調(diào)試及問
113、題解決</p><p> 至始至終,程序面臨最大問題就是在功能選擇時,如果進行不正當?shù)妮斎耄赡軙斐蓢乐氐南到y(tǒng)崩潰,如輸入選項時,只要求輸入單個字符,如果輸入漢字,或者其他多個字符時,系統(tǒng)也許就要崩潰。當然,如果不是故意為之,按系統(tǒng)提示操作,一切保證都很順利。這個問題的確有一個很好的辦法解決,那就是只輸入字符串,用</p><p> getline(cin,str)(注意,它不同于c
114、in.getline( ) ) 函數(shù)來接受字符串輸入,這個函數(shù)的特點是只把回車鍵當作字符串結(jié)束標志,這就有了輸入空數(shù)據(jù)的可能,更可以減少不必要的錯誤。這樣,即使有人惡意“虐待”系統(tǒng),也不會造成崩潰。</p><p> 我在做設計時,想過把這種方法貫穿整個工程,但這樣做開銷太大,對一些簡單的選項輸入不需要這么強的糾錯功能,因為估計沒人會無聊到去挑戰(zhàn)系統(tǒng)忍耐崩潰的程度。但是在輸入關(guān)鍵數(shù)據(jù)時,如果不按規(guī)則輸入,系統(tǒng)是
115、絕對不會崩潰,相反如果繼續(xù)不規(guī)范輸入的話,它會提示到人崩潰。其關(guān)鍵代碼在上面的“增加數(shù)據(jù)”功能時已經(jīng)給出。</p><p> 另外,本系統(tǒng)為學生通訊管理系統(tǒng),所以并不涉及到數(shù)據(jù)的運算,于是我把所有數(shù)據(jù)都以字符串的形式封裝到CStudent(學生類)中,其實也不太算是封裝,因為我沒給學生類設置私有數(shù)據(jù),但這樣,可以節(jié)省大量代碼,因為可以直接調(diào)用對象的數(shù)據(jù),不同再調(diào)用成員函數(shù)或者是友元函數(shù),而且,調(diào)用具有任意性。也
116、許按課本上說,這具有不安全因素,但考慮到這是我個人的控制臺應用程序,安全問題盡在個人找握,就沒照實了給封裝下去。</p><p><b> 三、心得體會</b></p><p> 這次課程設計,我從十五周開始考慮與構(gòu)思,十六周完成了代碼實現(xiàn)與調(diào)試,十七周完成所有的細節(jié)工作,至此,程序設計已全部完成。從一開始思路還是比較清晰的,因為這半年來,我接觸JAVA比較多,同
117、樣是面向?qū)ο螅?C++與java好多地方都是互通的,所以按照java工程的創(chuàng)建思路來做C++課題,在一定程度上還是比較順利的。當然,這中間我也走了不少彎路,或許是習慣了java,一開始還是感覺c++“麻煩”,尤其是c++異常撲捉那部分,始終是搞不太懂,所以在程序中就沒用的上,然而java中,異常撲捉是經(jīng)常需要使用的,它幾乎體現(xiàn)在每一個工程中。</p><p> 入學這一年來,從接觸計算機語言開始,我始終都沒間斷
118、過對它的學習,C++也好,java也好,大大小小的代碼寫過不少了,最難的那部分始終是算法,從構(gòu)思到解決問題,這中間要做很多細致的工作,關(guān)于算法,在課本上自然體現(xiàn)的是很少,但接觸一個實際項目時,這方面就不得不多多考慮。 這次課程設計,因為做的是控制臺應用程序,所以對課程學習的檢驗多于它的實用意義,我從一開始就跟自己定了標準:代碼既要簡單,又要細致;程序操作不能過于繁瑣,但又要功能全面。寫代碼前,我看過上屆同學寫過的課程設計, 代碼量的確是
119、很大,但代碼運行起來還是有很多的bug。而且“界面”不太友好。當然,也包括網(wǎng)上的一些文檔也存在某些問題。</p><p> 從一開始,我感覺我的程序的出發(fā)點就應該把它做的像一個桌面應用程序,既然是通訊錄,它就應該像通訊錄的樣子,就如我們手機上的那樣,只要你操作正確,按自然(我強調(diào)是自然,這就要求操做要按一定的自然規(guī)則來,當然,如果是無意為之,在程序的糾錯范圍內(nèi),還是不會造成系統(tǒng)崩潰的)規(guī)則來,它就能順利運行。而
120、且看起來,任何需要顯示的東西,都要顯示在合適的地方,這就是顯示的美化問題,不屬于代碼與算法,這一點,我設計了兩天,就為了讓程序顯得好看些,在代碼完成后做這些,還是可取的。</p><p> 至此,我已經(jīng)完全由個人完成了課程設計,兩個多星期的忙碌就要告一段落, 但是C++的學習我還遠遠學的不夠,C++的強大時毋庸置疑的,做為計科專業(yè)的學生,今后三年的學習無疑都要與C++有關(guān)。我喜歡這個專業(yè),也熱衷于計算機語言的學
121、習,我今后努力的方向也就是把專業(yè)所學用于實際項目,編程的路漫而長,我輩相信天道酬勤。</p><p><b> 四、源代碼</b></p><p> 1. Class.h,聲明所有的類,且定義結(jié)構(gòu)體:</p><p> #include<string></p><p> #include<io
122、stream></p><p> #include<fstream></p><p> #include<iomanip></p><p> #include<vector></p><p> using namespace std;</p><p> ///////
123、//////////////////////////////////////////</p><p> class User //用戶類,權(quán)限只限于查找數(shù)據(jù),查看數(shù)據(jù)</p><p><b> {</b></p><p><b> public:</b></p><p><b>
124、 User(){</b></p><p> init_all_info();//初始化所有數(shù)據(jù)</p><p><b> }</b></p><p><b> ~User();</b></p><p> struct list* check_repeat(string key,i
125、nt type); //檢測數(shù)據(jù)是否重復,主要是檢測姓名與學號</p><p> void insert_info(); //增加數(shù)據(jù)</p><p> void init_all_info(); //初始化所有數(shù)據(jù)</p><p> void show_all(); //顯示所有數(shù)據(jù)</p><p> void find_info(
126、); //查找數(shù)據(jù)</p><p> void tongji_info();</p><p> void find_info(int type); //根據(jù)指定方式查找數(shù)據(jù)</p><p><b> };</b></p><p> /////////////////////////////////////////
127、//////</p><p> class Manager:public User //管理員類,用戶類的派生類,</p><p><b> {</b></p><p><b> public:</b></p><p> Manager(){</p><p> in
128、it_id_info(); //初始化賬號系統(tǒng)</p><p> init_all_info(); //初始化所有數(shù)據(jù)</p><p><b> }</b></p><p> ~Manager();</p><p> //void show_all(); //顯示所有數(shù)據(jù),不再重載,直接繼承</p>
129、<p> ///void find_info(); //查找數(shù)據(jù),不再重載,直接繼承</p><p> //void insert_info(); //增加數(shù)據(jù)</p><p> int del_info();//刪除數(shù)據(jù)</p><p> void edit_info();//修改數(shù)據(jù)</p><p> voi
130、d set_ID_pass();//設置賬號與密碼</p><p> //struct list* check_repeat(string key,int type); //檢測數(shù)據(jù)是否重復,主要是檢測姓名與學號</p><p> bool check_id_info(); //檢查賬號與密碼</p><p><b> public:</b&
131、gt;</p><p> void init_id_info();//初始化所有數(shù)據(jù)</p><p> string password; //密碼</p><p> string id; //賬號</p><p><b> };</b></p><p> ///////////////
132、///////////////////////////////////////////</p><p> class Student{</p><p><b> public:</b></p><p><b> Student()</b></p><p><b> {</b&
133、gt;</p><p><b> }</b></p><p> bool set_info(); //設置信息</p><p> void show_info(int i);//顯示信息</p><p> void show_info();//顯示信息</p><p> bool ch
134、eck_name_other();//檢查姓名,主要是檢查姓名長度是否規(guī)范</p><p> bool check_tel_xuehao();//檢查學號或電話是否規(guī)范</p><p> bool check_sex();//檢查性別是否規(guī)范</p><p><b> public:</b></p><p> s
135、tring name;//姓名</p><p> string sex;//性別,如:男</p><p> string xuehao;//學號</p><p> string dizhi;//地址,如:北四B110</p><p> string tel;//電話</p><p> strin
136、g banji;//班級號,如:計科</p><p><b> };</b></p><p> /////////////////////////////////////////////////////</p><p> struct list</p><p><b> {</b><
137、/p><p> Student student; //數(shù)據(jù)為一個學生類</p><p> struct list *next; //指針</p><p><b> };</b></p><p> struct typelist</p><p><b> {</b>
138、;</p><p> string atype; //數(shù)據(jù)為字符串</p><p> struct typelist*next; //指針</p><p><b> };</b></p><p> /////////////////////////////////////////////////</p
139、><p> extern struct list*head; //列表頭指針</p><p> extern struct typelist*tyhead; //類型列表頭指針</p><p> extern const char *thems; //控制臺語句指針,含義不提也罷</p><p> extern string at
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設計-學生管理系統(tǒng)
- c++學生管理系統(tǒng)課程設計
- c++課程設計-學生考勤管理系統(tǒng)
- c++課程設計---學生學籍管理系統(tǒng)
- c++課程設計完-----學生管理系統(tǒng)
- c++課程設計----學生成績管理系統(tǒng)
- c++課程設計----學生成績管理系統(tǒng)
- 學生成績管理系統(tǒng)c++課程設計
- c++課程設計---學生信息管理系統(tǒng)
- c++課程設計-學生成績管理系統(tǒng)
- c++課程設計學生學籍成績管理系統(tǒng)
- c++課程設計---學生成績管理系統(tǒng)
- c++課程設計---學生成績管理系統(tǒng)
- c++課程設計——學生成績管理系統(tǒng)
- c++課程設計報告(學生學籍管理系統(tǒng))
- c++課程設計報告(學生學籍管理系統(tǒng))
- c++課程設計--學生成績管理系統(tǒng)
- c++學生成績管理系統(tǒng)課程設計
- c++課程設計--學生成績管理系統(tǒng)
- c++課程設計——學生信息管理系統(tǒng)課程設計報告
評論
0/150
提交評論