版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 一 課程設(shè)計(jì)目的及要求</p><p><b> 學(xué)生通訊系統(tǒng)</b></p><p> 學(xué)生通信錄信息包括:姓名、學(xué)號(hào)、年齡、性別、家庭住址、聯(lián)系電話、寢室號(hào)等信息?,F(xiàn)要求編寫程序來完成如下功能:</p><p> 學(xué)生通信錄信息的輸入</p><p> 學(xué)生的通信錄信息刪除和修改<
2、/p><p> 學(xué)生的通信錄信息查詢和統(tǒng)計(jì)功能</p><p> 學(xué)生的通信錄信息輸出顯示。</p><p> 二 課程設(shè)計(jì)具體實(shí)現(xiàn)</p><p><b> 1.總體設(shè)計(jì)</b></p><p><b> 2.詳細(xì)設(shè)計(jì)</b></p><p>
3、 在進(jìn)行系統(tǒng)的各項(xiàng)功能介紹之前,有必要先說一下我所選的課程項(xiàng)設(shè)計(jì)的主要思路。</p><p> 這個(gè)系統(tǒng)的核心部分就是結(jié)構(gòu)體鏈表,它貫穿整個(gè)程序。一切數(shù)據(jù)的增、刪、查、改都要以它為支撐。整個(gè)程序其實(shí)就是在操作一張很大的鏈表。我在15周時(shí)就已經(jīng)開始考慮課程設(shè)計(jì)題目,當(dāng)時(shí)是想先做一個(gè)關(guān)于面向過程的課題,立馬就考慮的先用結(jié)構(gòu)體鏈表做為數(shù)據(jù)的容器。而且已經(jīng)做成型了。后來老師您把題目給改了,要求都用面向?qū)ο笞?,我是考慮
4、過用vector或者是list來做數(shù)據(jù)的容器的,但想想程序幾經(jīng)初成型,就不改變?nèi)萜髁?,就直接把類的?duì)象做為結(jié)構(gòu)體的數(shù)據(jù)部分,程序當(dāng)然也有較大改動(dòng),但基本框架是沒有變的。</p><p> 先來說鏈表的構(gòu)造,在主菜單下選擇功能之前,鏈表就已經(jīng)認(rèn)構(gòu)造完畢,程序按行讀取文本文件,每讀一行,便對(duì)其進(jìn)行分割。分割出來的字符串為學(xué)生類對(duì)象對(duì)應(yīng)的每一項(xiàng)信息。在分割字符串時(shí),我按字符‘@’進(jìn)行分割(當(dāng)然,在數(shù)據(jù)存儲(chǔ)時(shí)也是按行存
5、儲(chǔ),且每項(xiàng)信息以‘@’分開),其關(guān)鍵代碼如下:</p><p> void read_info(){ //讀取文件</p><p> head=NULL;</p><p> Student s; //構(gòu)造學(xué)生類對(duì)象</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;//賦予學(xué)號(hào)</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; //賦予班級(jí)</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){ //判斷學(xué)號(hào)與姓名是否為空</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); //申請(qǐng)空間</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文件才的儲(chǔ)存形式如下:</p><p> 所以,能正確的讀取所有數(shù)據(jù)在于字符串的分割,當(dāng)然用此種方法讀到的數(shù)據(jù)全是字符串,只是本系統(tǒng)為學(xué)生通訊系統(tǒng),并不需要其他類型的數(shù)據(jù),如有必要,字符串也可以轉(zhuǎn)化。</p><p> 就這樣,當(dāng)文件按行讀取完畢時(shí),鏈表中的每個(gè)結(jié)構(gòu)體都包含有一
17、個(gè)不同的學(xué)生類對(duì)象,至此,鏈表已初始化完畢。</p><p> 在程序接下來的運(yùn)行過程中,對(duì)數(shù)據(jù)的操作就是直接操作鏈表的節(jié)點(diǎn)。</p><p> 下面對(duì)系統(tǒng)功能進(jìn)行介紹:</p><p><b> 登陸系統(tǒng):</b></p><p> 通過歡迎界面后,將進(jìn)入登陸方式選擇界面,如圖:</p><
18、p> 若選擇以普通用戶身份登錄系統(tǒng),會(huì)出現(xiàn)以下界面:</p><p> 普通用戶的功能包括:1.增加數(shù)據(jù);2.查詢數(shù)據(jù);3.瀏覽數(shù)據(jù);4.數(shù)據(jù)統(tǒng)計(jì)</p><p> 增加數(shù)據(jù)功能的界面如下:</p><p> 用戶根據(jù)系統(tǒng)提示,對(duì)單個(gè)學(xué)生信息進(jìn)行逐項(xiàng)輸入,按回車鍵結(jié)束輸入。除姓名與學(xué)號(hào)外,其他信息只要直接按回車鍵就可以跳過輸入,系統(tǒng)將保存為空。對(duì)信息的
19、輸入還要有一定的規(guī)范性,如學(xué)號(hào)與電話為純數(shù)字;姓名長度最多只有四個(gè)字;性別若有,只能為男或女,系統(tǒng)會(huì)自動(dòng)對(duì)輸入的信息進(jìn)行校驗(yàn),包括規(guī)范性校驗(yàn)與數(shù)據(jù)是否重復(fù)校驗(yàn)。</p><p> 若無法通過校驗(yàn),數(shù)據(jù)不會(huì)保存。</p><p><b> 其關(guān)鍵代碼如下:</b></p><p><b> 規(guī)范性校驗(yàn):</b><
20、/p><p> bool Student::check_tel_xuehao(){ //學(xué)號(hào)與電話檢查函數(shù)</p><p> if(xuehao.size()==0){ //如果學(xué)號(hào)為空,返回false</p><p> return false;</p><p><b> }</b></p>&
21、lt;p> if(!check_string(xuehao)||!check_string(tel)){ //如果學(xué)號(hào)中處在數(shù)字以外的字符,返回false</p><p> cout<<"學(xué)號(hào)或電話輸入有誤!"<<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){ //檢測(cè)字符串中是否只包含數(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(){ //姓名檢測(cè)函數(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(){ //此為性別檢測(cè)函數(shù),性別可以為空,可以為男,也可以為女,但不可以為其他字符,或者返回false</p><p> if(sex.size()>2||(sex.size(
27、)>0&&(sex.compare("男")&&sex.compare("女")))){</p><p> cout<<"性別輸入錯(cuò)誤!"<<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ù)是否重復(fù)校驗(yàn)代碼如下:</p><p> struct list* User::check_rep
29、eat(string key,int type){ //此函數(shù)也可用于數(shù)據(jù)查詢,key代表要查詢的關(guān)鍵字。type=1 表示按姓名查找,type=2 表示按學(xué)號(hào)查找</p><p> struct list*ne;</p><p> ne=head; //注意這個(gè)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++; //對(duì)比姓名</p><p>
31、if((type==2||type==0)&&!key.compare(ne->student.xuehao))com++;//對(duì)比學(xué)號(hào)</p><p> if(com>0){ //若m>0,證明原有數(shù)據(jù)中含有被檢數(shù)據(jù),或者的話,將會(huì)返回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> 進(jìn)行數(shù)據(jù)查詢時(shí),可輸入任何字符,只要學(xué)生信息中任何一項(xiàng)包含輸入的關(guān)鍵字,該信息都會(huì)被顯示出來,如上圖,分別輸入了“女”,“B105”,進(jìn)行查詢,結(jié)果信息都完整的顯示了出來,以下是進(jìn)行信息查詢的關(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<<"請(qǐng)輸入要查詢的關(guān)鍵字:";</p><p><b> cin>>k
36、ey;</b></p><p> ne=head; //注意這個(gè)head不能空,要初始化</p><p><b> find=0;</b></p><p> show_table_head();</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針?biāo)傅膶W(xué)生
37、類,然后進(jìn)行每項(xiàng)數(shù)據(jù)的對(duì)比</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){ //即至少有一項(xiàng)匹配,則橫排顯示</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í),主要用的技術(shù)就是對(duì)結(jié)構(gòu)體鏈表進(jìn)行
43、遍歷,指針指向結(jié)構(gòu)體的學(xué)生類對(duì)象,然后調(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); //橫排顯示學(xué)生信息</p><p><b> i++;</b></p><p> if(ne->next==NULL) break; //如果到達(dá)尾指針,退出</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)計(jì)功能:</b></p><p> 數(shù)據(jù)可以按照三種方式進(jìn)行統(tǒng)計(jì),即 按性別、按班級(jí),按住址。</p><p> 計(jì)時(shí),對(duì)應(yīng)條目相等的數(shù)據(jù)會(huì)顯示在同體列表下,并會(huì)顯示數(shù)據(jù)總數(shù)。一下截圖是按住址統(tǒng)計(jì)的部分結(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)計(jì)方式:\n\t
51、1.按性別統(tǒng)計(jì)\n\t2.按住址統(tǒng)計(jì)\n\t3.按班級(jí)統(tǒng)計(jì)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n請(qǐng)選擇:";</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; //注意這個(gè)head不能空,要初始化</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針?biāo)傅膶W(xué)
56、生類,然后進(jìn)行每項(xiàng)數(shù)據(jù)的對(duì)比</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ù)用于返回某項(xiàng)包含相同數(shù)據(jù)的數(shù)目</p><p> struct list*ne; //結(jié)構(gòu)體list指針</p><p> ne=head; //注意這個(gè)head不能空,要初始化&
65、lt;/p><p> int find=0;</p><p> while(ne!=NULL){ //遍歷鏈表,指針每移一位都要調(diào)出指針?biāo)傅膶W(xué)生類,然后進(jìn)行每項(xiàng)數(shù)據(jù)的對(duì)比</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)) //檢查班級(jí)是否匹配</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); //申請(qǐng)
73、空間</p><p> curr->atype=key;</p><p> ne=tyhead; //ne指向頭指針,如果初始化數(shù)據(jù)時(shí),文件中有數(shù)據(jù),此時(shí)頭指針一定不為空</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,此時(shí)current已插入鏈表</p><p> curr->next=NULL; //current位于鏈表尾部,其next指針當(dāng)為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> 則會(huì)出現(xiàn)管理員界面:</p><p> 當(dāng)正確輸入用戶名與密碼后,方可進(jìn)行功能操作。</p><p> 其中,增加數(shù)據(jù)、查詢數(shù)據(jù)、瀏覽數(shù)據(jù)與數(shù)據(jù)統(tǒng)計(jì)功能與普通用戶的代碼實(shí)現(xiàn)相同,因?yàn)楣芾韱T類繼承與普通用戶類,所以此函數(shù)直接繼承。在此不多作描述。下面介紹刪除數(shù)據(jù)與修改數(shù)據(jù)功能。
80、</p><p><b> 數(shù)據(jù)修改</b></p><p> 進(jìn)行數(shù)據(jù)修改時(shí),需要先輸入正確的學(xué)號(hào)或姓名,在找到數(shù)據(jù)后,可按提示進(jìn)行修改,次系統(tǒng)有一個(gè)方便的地放就是若不想修改某項(xiàng)數(shù)據(jù),可直接按回車鍵,如下圖。關(guān)鍵代碼實(shí)現(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; //用于做緩存的學(xué)生類對(duì)象</p><p> cout<<"\n請(qǐng)輸入要修改的條目關(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請(qǐng)輸入新數(shù)據(jù),若不必修改,請(qǐng)直接按回車鍵:\n";</p><p> cout<<"請(qǐng)輸入姓名:";</p><p> getline(cin,temp.name);</p><p> cout<<"請(qǐng)輸入電話:";</p><p> getline(cin
85、,temp.tel);</p><p> cout<<"請(qǐng)輸入學(xué)號(hào):";</p><p> getline(cin,temp.xuehao);</p><p> cout<<"請(qǐng)輸入性別:";</p><p> getline(cin,temp.sex);</p&g
86、t;<p> cout<<"請(qǐng)輸入班級(jí):";</p><p> getline(cin,temp.banji);</p><p> cout<<"請(qǐng)輸入住址:";</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; // 對(duì)指針下數(shù)據(jù)進(jìn)行修改</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錯(cuò)誤!未修改數(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ù)需要先輸入學(xué)號(hào)或姓名,數(shù)據(jù)的刪除本質(zhì)上就是鏈表節(jié)點(diǎn)的刪除。</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空鏈表!不可進(jìn)行下一步操作!"<<
101、endl;</p><p><b> goto ASK;</b></p><p><b> }</b></p><p> cout<<"輸入要?jiǎng)h除的學(xué)號(hào)或姓名:";</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號(hào)的所對(duì)對(duì)應(yīng)的學(xué)生對(duì)象位于鏈表頭部,則需要改變頭指針,頭指針指向內(nèi)容將要?jiǎng)h除</p><p> head=ne->next; //改變
103、頭指針</p><p> ne->student.show_info(); //顯示信息</p><p> cout<<"\n確認(rèn)刪除(y/n)?";</p><p><b> cin>>s;</b></p><p> if(s=='y'){<
104、;/p><p> delete ne; //刪除</p><p> edit_flag=true; //信息已被修改,改變標(biāo)志</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{ //要?jiǎng)h除的信息不位于頭部while(ne!=NULL&&(m.compare(ne->student.name)&&m.compare(ne-&g
106、t;student.xuehao))){ //遍歷結(jié)構(gòu)體,并進(jìn)行學(xué)號(hào)或姓名的匹配</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)){ //若學(xué)號(hào)或姓名匹配,則進(jìn)行刪除</p><p> ne->student.show_info(); //顯示要?jiǎng)h除的信息</p><p> cout<<"\n確認(rè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)還有個(gè)主題選擇能,只是對(duì)系統(tǒng)起美化作用,與課題要求無關(guān),在此不多做介紹。</p><p> (3)調(diào)試及問
113、題解決</p><p> 至始至終,程序面臨最大問題就是在功能選擇時(shí),如果進(jìn)行不正當(dāng)?shù)妮斎?,可能?huì)造成嚴(yán)重的系統(tǒng)崩潰,如輸入選項(xiàng)時(shí),只要求輸入單個(gè)字符,如果輸入漢字,或者其他多個(gè)字符時(shí),系統(tǒng)也許就要崩潰。當(dāng)然,如果不是故意為之,按系統(tǒng)提示操作,一切保證都很順利。這個(gè)問題的確有一個(gè)很好的辦法解決,那就是只輸入字符串,用</p><p> getline(cin,str)(注意,它不同于c
114、in.getline( ) ) 函數(shù)來接受字符串輸入,這個(gè)函數(shù)的特點(diǎn)是只把回車鍵當(dāng)作字符串結(jié)束標(biāo)志,這就有了輸入空數(shù)據(jù)的可能,更可以減少不必要的錯(cuò)誤。這樣,即使有人惡意“虐待”系統(tǒng),也不會(huì)造成崩潰。</p><p> 我在做設(shè)計(jì)時(shí),想過把這種方法貫穿整個(gè)工程,但這樣做開銷太大,對(duì)一些簡(jiǎn)單的選項(xiàng)輸入不需要這么強(qiáng)的糾錯(cuò)功能,因?yàn)楣烙?jì)沒人會(huì)無聊到去挑戰(zhàn)系統(tǒng)忍耐崩潰的程度。但是在輸入關(guān)鍵數(shù)據(jù)時(shí),如果不按規(guī)則輸入,系統(tǒng)是
115、絕對(duì)不會(huì)崩潰,相反如果繼續(xù)不規(guī)范輸入的話,它會(huì)提示到人崩潰。其關(guān)鍵代碼在上面的“增加數(shù)據(jù)”功能時(shí)已經(jīng)給出。</p><p> 另外,本系統(tǒng)為學(xué)生通訊管理系統(tǒng),所以并不涉及到數(shù)據(jù)的運(yùn)算,于是我把所有數(shù)據(jù)都以字符串的形式封裝到CStudent(學(xué)生類)中,其實(shí)也不太算是封裝,因?yàn)槲覜]給學(xué)生類設(shè)置私有數(shù)據(jù),但這樣,可以節(jié)省大量代碼,因?yàn)榭梢灾苯诱{(diào)用對(duì)象的數(shù)據(jù),不同再調(diào)用成員函數(shù)或者是友元函數(shù),而且,調(diào)用具有任意性。也
116、許按課本上說,這具有不安全因素,但考慮到這是我個(gè)人的控制臺(tái)應(yīng)用程序,安全問題盡在個(gè)人找握,就沒照實(shí)了給封裝下去。</p><p><b> 三、心得體會(huì)</b></p><p> 這次課程設(shè)計(jì),我從十五周開始考慮與構(gòu)思,十六周完成了代碼實(shí)現(xiàn)與調(diào)試,十七周完成所有的細(xì)節(jié)工作,至此,程序設(shè)計(jì)已全部完成。從一開始思路還是比較清晰的,因?yàn)檫@半年來,我接觸JAVA比較多,同
117、樣是面向?qū)ο螅?C++與java好多地方都是互通的,所以按照java工程的創(chuàng)建思路來做C++課題,在一定程度上還是比較順利的。當(dāng)然,這中間我也走了不少彎路,或許是習(xí)慣了java,一開始還是感覺c++“麻煩”,尤其是c++異常撲捉那部分,始終是搞不太懂,所以在程序中就沒用的上,然而java中,異常撲捉是經(jīng)常需要使用的,它幾乎體現(xiàn)在每一個(gè)工程中。</p><p> 入學(xué)這一年來,從接觸計(jì)算機(jī)語言開始,我始終都沒間斷
118、過對(duì)它的學(xué)習(xí),C++也好,java也好,大大小小的代碼寫過不少了,最難的那部分始終是算法,從構(gòu)思到解決問題,這中間要做很多細(xì)致的工作,關(guān)于算法,在課本上自然體現(xiàn)的是很少,但接觸一個(gè)實(shí)際項(xiàng)目時(shí),這方面就不得不多多考慮。 這次課程設(shè)計(jì),因?yàn)樽龅氖强刂婆_(tái)應(yīng)用程序,所以對(duì)課程學(xué)習(xí)的檢驗(yàn)多于它的實(shí)用意義,我從一開始就跟自己定了標(biāo)準(zhǔn):代碼既要簡(jiǎn)單,又要細(xì)致;程序操作不能過于繁瑣,但又要功能全面。寫代碼前,我看過上屆同學(xué)寫過的課程設(shè)計(jì), 代碼量的確是
119、很大,但代碼運(yùn)行起來還是有很多的bug。而且“界面”不太友好。當(dāng)然,也包括網(wǎng)上的一些文檔也存在某些問題。</p><p> 從一開始,我感覺我的程序的出發(fā)點(diǎn)就應(yīng)該把它做的像一個(gè)桌面應(yīng)用程序,既然是通訊錄,它就應(yīng)該像通訊錄的樣子,就如我們手機(jī)上的那樣,只要你操作正確,按自然(我強(qiáng)調(diào)是自然,這就要求操做要按一定的自然規(guī)則來,當(dāng)然,如果是無意為之,在程序的糾錯(cuò)范圍內(nèi),還是不會(huì)造成系統(tǒng)崩潰的)規(guī)則來,它就能順利運(yùn)行。而
120、且看起來,任何需要顯示的東西,都要顯示在合適的地方,這就是顯示的美化問題,不屬于代碼與算法,這一點(diǎn),我設(shè)計(jì)了兩天,就為了讓程序顯得好看些,在代碼完成后做這些,還是可取的。</p><p> 至此,我已經(jīng)完全由個(gè)人完成了課程設(shè)計(jì),兩個(gè)多星期的忙碌就要告一段落, 但是C++的學(xué)習(xí)我還遠(yuǎn)遠(yuǎn)學(xué)的不夠,C++的強(qiáng)大時(shí)毋庸置疑的,做為計(jì)科專業(yè)的學(xué)生,今后三年的學(xué)習(xí)無疑都要與C++有關(guān)。我喜歡這個(gè)專業(yè),也熱衷于計(jì)算機(jī)語言的學(xué)
121、習(xí),我今后努力的方向也就是把專業(yè)所學(xué)用于實(shí)際項(xiàng)目,編程的路漫而長,我輩相信天道酬勤。</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); //檢測(cè)數(shù)據(jù)是否重復(fù),主要是檢測(cè)姓名與學(xué)號(hào)</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(); //初始化賬號(hào)系統(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();//設(shè)置賬號(hào)與密碼</p><p> //struct list* check_repeat(string key,int type); //檢測(cè)數(shù)據(jù)是否重復(fù),主要是檢測(cè)姓名與學(xué)號(hào)</p><p> bool check_id_info(); //檢查賬號(hào)與密碼</p><p><b> public:</b&
131、gt;</p><p> void init_id_info();//初始化所有數(shù)據(jù)</p><p> string password; //密碼</p><p> string id; //賬號(hào)</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(); //設(shè)置信息</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();//檢查學(xué)號(hào)或電話是否規(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;//學(xué)號(hào)</p><p> string dizhi;//地址,如:北四B110</p><p> string tel;//電話</p><p> strin
136、g banji;//班級(jí)號(hào),如:計(jì)科</p><p><b> };</b></p><p> /////////////////////////////////////////////////////</p><p> struct list</p><p><b> {</b><
137、/p><p> Student student; //數(shù)據(jù)為一個(gè)學(xué)生類</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; //控制臺(tái)語句指針,含義不提也罷</p><p> extern string at
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設(shè)計(jì)-學(xué)生管理系統(tǒng)
- c++學(xué)生管理系統(tǒng)課程設(shè)計(jì)
- c++課程設(shè)計(jì)-學(xué)生考勤管理系統(tǒng)
- c++課程設(shè)計(jì)---學(xué)生學(xué)籍管理系統(tǒng)
- c++課程設(shè)計(jì)完-----學(xué)生管理系統(tǒng)
- c++課程設(shè)計(jì)----學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)----學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)c++課程設(shè)計(jì)
- c++課程設(shè)計(jì)---學(xué)生信息管理系統(tǒng)
- c++課程設(shè)計(jì)-學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)學(xué)生學(xué)籍成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)---學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)---學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)——學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- c++學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- c++課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- c++課程設(shè)計(jì)報(bào)告(學(xué)生學(xué)籍管理系統(tǒng))
- c++課程設(shè)計(jì)報(bào)告(學(xué)生學(xué)籍管理系統(tǒng))
- c++課程設(shè)計(jì)——學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論