版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、0西安交通大學(xué)計(jì)算機(jī)教學(xué)實(shí)驗(yàn)中心數(shù)據(jù)的抽象與封裝計(jì)算機(jī)程序設(shè)計(jì)(C+)內(nèi)容提要多種數(shù)據(jù)特征的封裝結(jié)構(gòu)體結(jié)構(gòu)結(jié)構(gòu)變量結(jié)構(gòu)數(shù)組結(jié)構(gòu)指針公用體枚舉類(lèi)型多種數(shù)據(jù)特征和函數(shù)的封裝類(lèi)類(lèi)對(duì)象構(gòu)造函數(shù)與析構(gòu)函數(shù)類(lèi)的組合多文件結(jié)構(gòu)16.1多種數(shù)據(jù)特征的封裝結(jié)構(gòu)體在描述某些事物時(shí),有時(shí)只用一種數(shù)據(jù)類(lèi)型往往很難處理,如手機(jī)通話記錄中的信息就有多種數(shù)據(jù)類(lèi)型,對(duì)方電話號(hào)碼可以用字符數(shù)組或者字符串,持續(xù)時(shí)間可以用整型(以秒計(jì)時(shí))、浮點(diǎn)型、雙精度類(lèi)型中的一種,如果只是將這兩類(lèi)信息定義為相互獨(dú)立的簡(jiǎn)單變量,是很難反映它們之間的內(nèi)在聯(lián)系的,在C語(yǔ)言中,可以使用結(jié)構(gòu)將多種數(shù)據(jù)信息封裝在一起。26.1.1結(jié)構(gòu)結(jié)構(gòu)是C語(yǔ)言中一種新的
2、構(gòu)造數(shù)據(jù)類(lèi)型,它能把有內(nèi)在聯(lián)系的不同類(lèi)型的數(shù)據(jù)統(tǒng)一成一個(gè)整體,使它們相互關(guān)聯(lián);同時(shí),結(jié)構(gòu)又是一個(gè)變量的集合,可以按照對(duì)基本數(shù)據(jù)類(lèi)型的操作方法單獨(dú)使用其成員變量。3結(jié)構(gòu)體定義struct 結(jié)構(gòu)體名 類(lèi)型名1 成員名表1; 類(lèi)型名2 成員名表2; 類(lèi)型名n 成員名表n;;4嵌套定義例子struct time int hour,minute,second;struct day int year,month,date;struct conversion char phonenumber11;int duration;struct day occurrentday;struct time occurre
3、nttime;66.1.2結(jié)構(gòu)變量如同C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型一樣,在定義了結(jié)構(gòu)類(lèi)型后,還需要定義結(jié)構(gòu)類(lèi)型的變量,然后才能通過(guò)結(jié)構(gòu)變量來(lái)操作和訪問(wèn)結(jié)構(gòu)的數(shù)據(jù)。7結(jié)構(gòu)變量初始化struct conversion char phonenumber11;int duration;struct day occurrentday;struct time occurrenttime;account1=“1111111111”,120,2012,8,8,16,15,30;9結(jié)構(gòu)變量使用結(jié)構(gòu)變量成員的引用結(jié)構(gòu)體變量名.成員名結(jié)構(gòu)變量的整體賦值結(jié)構(gòu)變量1=結(jié)構(gòu)變量2結(jié)構(gòu)變量作為函數(shù)參數(shù)結(jié)構(gòu)變量可以作為函數(shù)參數(shù)以及
4、函數(shù)的返回值10【例6-1】查找是否有指定電話號(hào)碼的通話記錄【問(wèn)題分析】表示通話記錄【算法描述】錄入通話記錄,按照電話號(hào)碼尋找相匹配的通話記錄11int main() /主函數(shù)char temp11;cout”請(qǐng)輸入對(duì)方的電話號(hào)碼”temp;if(strcmp(account1.phonenumber,temp)=0) /比較電話號(hào)碼cout”find”tempendl;coutaccount1.durationendl; /打印結(jié)構(gòu)體的成員coutaccount1.occurrentday.year”t”;coutaccount1.occurrentday.month”t”;cout acc
5、ount1.occurrentday.dateendl;coutaccount1.occurrenttime.hour”t”;coutaccount1.occurrenttime. minute”t”;cout account1.occurrenttime.second endl;13elsecout”not find”tempendl;return 0;14【思路擴(kuò)展】如果將結(jié)構(gòu)變量的初始化過(guò)程改寫(xiě)成從鍵盤(pán)輸入各成員的值再賦值給各成員,應(yīng)該如何修改?如果將查找過(guò)程編寫(xiě)成函數(shù),又該如何修改?166.1.3結(jié)構(gòu)數(shù)組一個(gè)結(jié)構(gòu)變量只能表示一個(gè)實(shí)體的信息,例如account1只能表示1條通話記錄,如果
6、有許多相同類(lèi)型的實(shí)體,就需要使用結(jié)構(gòu)數(shù)組,例如100條通話記錄,由于每條記錄的基本信息都是相同的,就可以將這些具有相同結(jié)構(gòu)類(lèi)型的變量組織起來(lái),形成一個(gè)結(jié)構(gòu)數(shù)組。結(jié)構(gòu)數(shù)組是結(jié)構(gòu)與數(shù)組的結(jié)合,與普通數(shù)組的不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)類(lèi)型的數(shù)據(jù),包含各個(gè)成員。17結(jié)構(gòu)數(shù)組定義struct conversion char phonenumber11;int duration;struct time occurrentday;struct time occurrenttime;account100;18結(jié)構(gòu)數(shù)組初始化struct conversion account100=“1111111111
7、”,11,2012,8,8,16,15,30,“2222222222”,22, 2012,8,8,16,15,30;19結(jié)構(gòu)數(shù)組使用結(jié)構(gòu)數(shù)組成員的引用結(jié)構(gòu)數(shù)組名下標(biāo).結(jié)構(gòu)成員名結(jié)構(gòu)數(shù)組元素的整體賦值結(jié)構(gòu)數(shù)組元素i=結(jié)構(gòu)數(shù)組元素j20【例6-2】詞頻統(tǒng)計(jì):輸入一系列英文單詞,單詞之間用空格隔開(kāi),用“xyz”表示結(jié)束輸入,統(tǒng)計(jì)輸入過(guò)哪些單詞以及各單詞出現(xiàn)的次數(shù),統(tǒng)計(jì)時(shí),區(qū)分大小寫(xiě)字母,最后按單詞的字典順序輸出單詞和出現(xiàn)次數(shù)的對(duì)照表?!締?wèn)題分析】字典的組成【算法描述】統(tǒng)計(jì)不同單詞出現(xiàn)的次數(shù)21void Sort(WordList list,int count) /排序函數(shù)for(int i=0;ii
8、;j=j-1)if(strcmp(listj-1.word,listj.word)0)WordList tmp;tmp=listj-1;listj-1=listj;listj=tmp;23int main() /主函數(shù)WordList list5000;int i,num=0;char temp50;cout”請(qǐng)輸入一系列英語(yǔ)單詞,以xyz表示輸入結(jié)束”temp;while(strcmp(temp,”xyz”)!=0)for(i=0;i指向結(jié)構(gòu)數(shù)組的指針結(jié)構(gòu)數(shù)組元素.成員名結(jié)構(gòu)數(shù)組元素-成員名結(jié)構(gòu)指針名-成員名(*結(jié)構(gòu)指針名).成員名結(jié)構(gòu)指針作為函數(shù)參數(shù)28【例6-3】利用帶結(jié)構(gòu)指針的函數(shù)實(shí)現(xiàn)
9、通話記錄的輸入、輸出和查找等功能?!締?wèn)題分析】輸入、輸出和查找函數(shù)【算法描述】批量錄入通話記錄,再按照電話號(hào)碼尋找相匹配的通話記錄。29【源程序】#include /包含基本輸入輸出庫(kù)頭文件using namespace std; /使用名字空間struct time /時(shí)間結(jié)構(gòu)體int hour,minute,second;struct day /日期結(jié)構(gòu)體int year,month,date;struct conversion /通話記錄結(jié)構(gòu)體char phonenumber11;int duration;struct day occurrentday;struct time occur
10、renttime;void input(struct conversion *);/輸入函數(shù)聲明void print(struct conversion);/輸出函數(shù)聲明struct conversion find(struct conversion *, char tempnumber11);30int main() /主函數(shù)char temp11;struct conversion account1,account5; /結(jié)構(gòu)體變量、數(shù)組input(account); /調(diào)用輸入函數(shù)couttemp; /輸入要查找的電話號(hào)碼account1=find(account,temp); /調(diào)用查
11、找函數(shù)if(strcmp(account1.phonenumber,0000000000)!=0) /判斷是否找到print(account1); /找到則顯示elsecoutnot findendl;return 0; /主函數(shù)結(jié)束31void input(struct conversion *p)/批量輸入通話記錄 cout請(qǐng)輸入5個(gè)人的通話記錄(電話、時(shí)長(zhǎng)、日期、時(shí)間)n;for(int i=0;ipi.phonenumberpi.duration;cinpi.occurrentday.yearpi.occurrentday.monthpi.occurrentday.date; cinp
12、i.occurrenttime.hourpi.occurrenttime.minutepi.occurrenttime.second;32void print(struct conversion q) /輸出指定結(jié)構(gòu)變量的全部成員信息coutq.phonenumbertq.durationendl;coutq.occurrentday.yeart ;coutq.occurrentday.montht ;cout q.occurrentday.dateendl;coutq.occurrenttime.hourt;coutq.occurrenttime. minutet;cout q.occurr
13、enttime.second endl;33struct conversion find(struct conversion *p,char tempnumber11)/查找指定電話struct conversion r=0000000000;/結(jié)構(gòu)變量部分成員初始化for(int i=0;i5;i+)if(strcmp(pi.phonenumber,tempnumber)=0)r=pi; /結(jié)構(gòu)變量的整體賦值return r;34【運(yùn)行結(jié)果】請(qǐng)輸入5個(gè)人的通話記錄(電話、時(shí)長(zhǎng)、日期、時(shí)間)1111111111 120 2012 8 8 8 8 82222222222 130 2012 8 9
14、 8 8 93333333333 140 2012 8 1 8 8 84444444444 150 2012 9 9 9 9 95555555555 160 2012 9 9 9 9 9input the phonenumber:33333333333333333333 1402012 8 18 8 835【思路擴(kuò)展】什么情況下在函數(shù)中使用結(jié)構(gòu)變量或者結(jié)構(gòu)指針作為函數(shù)參數(shù)較好?366.1.5公用體結(jié)構(gòu)體與共用體的本質(zhì)區(qū)別只要在于存儲(chǔ)方式,結(jié)構(gòu)體的每個(gè)成員各自占用分配給自己的存儲(chǔ)單元,各自擁有自己的地址,結(jié)構(gòu)體類(lèi)型分配的內(nèi)存空間大小就是各成員所占存儲(chǔ)單元的總和。共用體的各個(gè)成員則占用共同的存儲(chǔ)單
15、元,具有相同的首地址,占用存儲(chǔ)單元最多的成員的長(zhǎng)度就是共用體的長(zhǎng)度。37公用體的定義union 公用體名類(lèi)型1 成員名1;類(lèi)型2 成員名2;類(lèi)型n 成員名n;38共用體變量定義單獨(dú)定義union postion pos1,pos2,*p;混合定義union postionint grand;char title20; pos1,pos2,*p;39公用體變量初始化共用體變量或數(shù)組在初始化時(shí),只能對(duì)它的第一個(gè)成員賦值,對(duì)多個(gè)成員賦值是不允許的union postion pos1=1;/正確union postion pos2=1,2;/正確union postion pos2=1,lector,
16、2,lector;/錯(cuò)誤40共用體變量的使用共用體變量的引用共用體變量名.成員共用體變量指針.成員公用體變量的整體賦值共用體變量1=共用體變量241【例6-4】學(xué)校人事信息管理:批量輸入和輸出學(xué)生或者教師信息,包括姓名、年齡、職業(yè)和職位等信息,每位學(xué)生或者教師都包含前3項(xiàng)信息,但對(duì)學(xué)生而言,其第4項(xiàng)信息表示年級(jí);對(duì)教師而言,其第4項(xiàng)信息表示職稱(chēng)?!締?wèn)題分析】學(xué)校人事信息的表示【算法描述】輸入和輸出學(xué)校人事信息。42【源程序】#include /包含基本輸入輸出庫(kù)頭文件using namespace std; /使用名字空間union postionint grand;char title20;
17、struct personchar name20;int age;char job10;postion pos;43int main() /主函數(shù)person p3;int i;for(i=0;pi.agepi.job;if(strcmp(pi.job,”student”)=0)cin pi.pos.grand;elsecin pi.pos.title;cout”*”endl;44cout”name”t”age”t”job”t”grand/title”endl;for(i=0;i3;i+)”t”pi.age”t”pi.job”t”;if(strcmp(pi
18、.job,”student”)=0)cout pi.pos.grandendl;elsecout pi.pos.titleendl;return 0;/程序結(jié)束,45【運(yùn)行結(jié)果】tom 21 student 3john 19 teacher professorrose 19 student 1*name age job grand/titletom 21 student 3john 19 teacher professorrose 19 student 146【思路擴(kuò)展】結(jié)構(gòu)體類(lèi)型中包含共用體類(lèi)型的定義會(huì)在哪些情況中出現(xiàn)?共用體類(lèi)型中包含結(jié)構(gòu)體類(lèi)型的定義會(huì)在哪些情況中出現(xiàn)?476.1.6枚舉類(lèi)
19、型在一些實(shí)際的應(yīng)用中,有些變量的取值常常被限定在一個(gè)有限范圍內(nèi),如一個(gè)星期只有7天,一年只有12個(gè)月等。C語(yǔ)言提供的“枚舉”類(lèi)型能夠在類(lèi)型定義時(shí)列舉出所有可能的取值,將枚舉類(lèi)型變量的取值限定在取值范圍內(nèi)。由于枚舉變量只能取一個(gè)值,不能再分解為任何基本類(lèi)型,因此枚舉類(lèi)型只是一種基本數(shù)據(jù)類(lèi)型,而不是構(gòu)造類(lèi)型。48枚舉的定義enum 枚舉名 枚舉常量表49枚舉變量的定義單獨(dú)定義enum color temp;混合定義enum color red,yellow,blue,white,black temp;無(wú)類(lèi)型定義enum red,yellow,blue,white,black temp;50枚舉變量
20、的使用可以把枚舉常量賦值給枚舉變量,但不能直接把元素的序號(hào)賦值給枚舉變量。51【例6-5】五色球的組合:口袋中有紅、黃、藍(lán)、白、黑5種顏色的小球若干,如果每次都從口袋中取出3個(gè)不同顏色的小球,共有多少種組合?試輸出每種組合的3種顏色?!締?wèn)題分析】小球顏色的表示【算法描述】使用窮舉法測(cè)試符合三種顏色要求的每種組合。52#include /包含基本輸入輸出庫(kù)頭文件using namespace std; /使用名字空間int main() /主函數(shù)enum colorred,yellow,blue,white,black;int count=0;int temp;for(int i=red;i=b
21、lue;+i)/第一次取球for(int j=i+1;j=black;+j)/第二次取球for(int k=j+1;k=black;k+)/第三次取球+count;53for(int t=0;t3;+t)/輸出每次組合中3次取球的顏色switch(t)case 0:temp=I;break;case 1:temp=j;break;case 2:temp=k;break;default:cout”impossiblen”;switch(enum color)temp)case red:cout”red”t”;break;case yellow:cout”yellow”t”;break;case
22、blue:cout”blue”t”;break;case white:cout”white”t”;break;case black:cout”black”t”;break;default:cout”impossiblen”;54cout”n”;cout”共有”count”種組合”成員變量或成員函數(shù)對(duì)象的整體賦值對(duì)象1=對(duì)象2對(duì)象作為函數(shù)的形式參數(shù)67【例6-6】定義手機(jī)類(lèi)mobile,包括電話號(hào)碼mynumber變量以及初始化函數(shù)init、撥打電話函數(shù)dial、接聽(tīng)電話函數(shù)answer、掛斷電話函數(shù)hangup?!締?wèn)題分析】手機(jī)類(lèi)的定義?!舅惴枋觥慷xmobile類(lèi)68【源程序】#inclu
23、de using namespace std;class mobileprivate:char mynumber11;/機(jī)主的電話號(hào)碼public:void init(char number11=”0000000000”)/隱式定義的內(nèi)聯(lián)函數(shù)strcpy(mynumber,number);void dial();/撥打電話void answer(char othernumber11);/接聽(tīng)電話void hangup();/掛斷電話;69void mobile:dial()cout”Dialing number is”mynumberendl;cout”Dialing on.”endl;voi
24、d mobile:answer(char othernumber11)cout”Answering number is”othernumberendl;cout”Answering in.”endl;inline void mobile:hangup()/顯示定義的內(nèi)聯(lián)函數(shù)cout”Hanging up.”endl;70int main()mobile m1;m1.init(”1111111111”);/對(duì)象對(duì)成員函數(shù)init的使用m1.dial();m1.hangup();m1.answer(”2222222222”);m1.hangup();return 0;71運(yùn)行結(jié)果Dialing n
25、umber is1111111111Dialing on.Hanging up.Answering number is2222222222Answering in.Hanging up.72【思路擴(kuò)展】日常生活中,還有哪些事物可以定義為類(lèi)?73【例6-7】定義手機(jī)類(lèi)mobile,包括電話號(hào)碼mynumber變量,定義初始化函數(shù)init、撥打電話函數(shù)dial、接聽(tīng)電話函數(shù)answer、掛斷電話函數(shù)hangup,要求dial和init用對(duì)象作為函數(shù)的參數(shù),實(shí)現(xiàn)與【例6-6】相同的功能。【問(wèn)題分析】函數(shù)dial和init的定義【算法描述】定義mobile類(lèi)和能夠使用該類(lèi)對(duì)象的普通函數(shù)dial和ini
26、t74【源程序】#include using namespace std;class mobilepublic:char mynumber11;/機(jī)主的電話號(hào)碼;void init(mobile &m)/隱式定義的內(nèi)聯(lián)函數(shù)cinm.mynumber;void dial(mobile m)/撥打電話cout”Dialing number is”m.mynumberendl;cout”Dialing on.”endl;75void answer(char othernumber11)/接聽(tīng)電話cout”Answering number is”othernumberendl;cout”Answeri
27、ng in.”endl;void hangup()/掛斷電話cout”Hanging up.”endl;76int main() /main functionmobile m1;init(m1);dial(m1);hangup();answer(”2222222222”);hangup(); return 0;77【運(yùn)行結(jié)果】1111111111Dialing number is1111111111Dialing on.Hanging up.Answering number is2222222222Answering in.Hanging up.78【思路擴(kuò)展】【例6-6】與【例6-7】的區(qū)別
28、有哪些?79對(duì)象與指針指向?qū)ο蟮闹羔橆?lèi)名 *對(duì)象指針名;指向?qū)ο蟪蓡T的指針?lè)祷刂殿?lèi)型名(類(lèi)名:*指針變量名)(參數(shù)表);指針變量名=類(lèi)名:成員函數(shù)名;指向?qū)ο蟮闹羔樅椭赶驅(qū)ο蟪蓡T的指針都只能訪問(wèn)公有成員。this指針存放對(duì)象的起始地址80【例6-8】利用指向?qū)ο蟮闹羔樢约爸赶驅(qū)ο蟪蓡T函數(shù)指針完成手機(jī)mobile類(lèi)中撥打、接聽(tīng)等函數(shù)的調(diào)用。【問(wèn)題分析】指向?qū)ο蟮闹羔?、指向?qū)ο蟪蓡T變量的指針以及指向?qū)ο蟪蓡T函數(shù)指針的使用【算法描述】在mobile類(lèi)中使用指向?qū)ο蟮闹羔樅椭赶驅(qū)ο蟪蓡T函數(shù)指針81【源程序】#include using namespace std;class mobilepublic:
29、char mynumber11;void init(char number11=”0000000000”)/隱式定義的內(nèi)聯(lián)函數(shù)strcpy(mynumber,number);void dial();/撥打電話void answer(char othernumber11);/接聽(tīng)電話void hangup();/掛斷電話;82void mobile:dial()cout”Dialing number is”mynumberendl;cout”Dialing on.”endl;void mobile:answer(char othernumber11)cout”Answering number i
30、s”othernumberendl;cout”Answering in.”endl;void mobile:hangup()/顯示定義的內(nèi)聯(lián)函數(shù)cout”Hanging up.”init(”1111111111”);p1-dial();p1- hangup();p1- answer(”2222222222”);p1- hangup();char *p2;p2=m1.mynumber;cout*p2endl;84void(mobile:*p3)(char number11);void(mobile:*p4)();void(mobile:*p5)(char othernumber11);void(
31、mobile:*p6)();p3=mobile:init;p4=mobile:dial;p5=mobile:answer;p6=mobile:hangup;(m1.*p3)(”1111111111”);(m1.*p4)();(m1.*p6)();(m1.*p5)(”2222222222”);(m1.*p6)();return 0;85【運(yùn)行結(jié)果】Dialing number is1111111111Dialing on.Hanging up.Answering number is2222222222Answering in.Hanging up.1Dialing number is111111
32、1111Dialing on.Hanging up.Answering number is2222222222Answering in.Hanging up.86【思路擴(kuò)展】指向?qū)ο蟮闹羔槨⒅赶驅(qū)ο蟪蓡T變量的指針以及指向?qū)ο蟪蓡T函數(shù)指針會(huì)在哪些情況中使用?876.2.3構(gòu)造函數(shù)構(gòu)造函數(shù)在對(duì)象被創(chuàng)建時(shí)利用特定的值構(gòu)造對(duì)象,將對(duì)象初始化為一個(gè)特定的狀態(tài)??截悩?gòu)造函數(shù)使用一個(gè)已經(jīng)存在的對(duì)象(由拷貝構(gòu)造函數(shù)的參數(shù)指定),去初始化同類(lèi)的一個(gè)新對(duì)象。析構(gòu)函數(shù)用于完成對(duì)象被刪除前的一些善后工作88構(gòu)造函數(shù)類(lèi)名( 形參列表 )函數(shù)體89拷貝構(gòu)造函數(shù)類(lèi)名(類(lèi)名 &對(duì)象名)函數(shù)體;90析構(gòu)函數(shù)類(lèi)名() 函數(shù)體91
33、【例6-9】定義mobile類(lèi),僅成員變量mynumber以及構(gòu)造函數(shù)和析構(gòu)函數(shù)。【問(wèn)題分析】定義構(gòu)造函數(shù)和析構(gòu)函數(shù)【算法描述】定義帶構(gòu)造函數(shù)和析構(gòu)函數(shù)的mobile類(lèi)。92【源程序】#include using namespace std;class mobilepublic:char mynumber11;mobile();/不帶參數(shù)的構(gòu)造函數(shù)mobilemobile(char number11);/ 帶參數(shù)的構(gòu)造函數(shù)mobilemobile();mobile:mobile()strcpy(mynumber,”0000000000”);coutmynumberendl;93mobile:m
34、obile(char number11)strcpy(mynumber,number);coutmynumberendl;mobile()cout”Turn off the phone”endl;int main()mobile m1;return 0;94【運(yùn)行結(jié)果】0000000000Turn off the phone956.2.4類(lèi)的組合組合類(lèi)名:類(lèi)名(形參表):內(nèi)嵌對(duì)象1(形參表),內(nèi)嵌對(duì)象2(形參表),.類(lèi)的初始化引用循環(huán)依賴(lài)向前引用96【例6-10】定義具有GSM和CDMA兩種發(fā)射制式的mobile類(lèi)【問(wèn)題分析】?jī)?nèi)嵌對(duì)象的使用【算法描述】在mobile類(lèi)中使用內(nèi)嵌對(duì)象、構(gòu)造函數(shù)和
35、析構(gòu)函數(shù)97【源程序】#include using namespace std;class mobilecdmaprivate:char mynumber11;/機(jī)主的電話號(hào)碼public:mobile(char number11)/初始化mynumber=number;cout”Turn on the mobile”mynumberendl;mobile()cout”Turn off the mobile”mynumberendl;98class mobileprivate:char mynumber11;/機(jī)主的電話號(hào)碼mobilecdma core;/CDMA內(nèi)核,內(nèi)嵌對(duì)象public:
36、mobile(char *number,char *number1):core(number1)/初始化strcpy(mynumber,number);cout”Turn on the mobile”mynumberendl;mobile()cout”Turn off the mobile”mynumberendl;99int main()mobile m1(”1111111111”,”2222222222”);return 0;100【運(yùn)行結(jié)果】Turn on the mobile2222222222Turn on the mobile1111111111Turn off the mobil
37、e1111111111Turn off the mobile22222222221016.2.5多文件結(jié)構(gòu)一般把類(lèi)和成員變量的定義放在一個(gè).h文件,把成員函數(shù)和靜態(tài)成員的定義放在.cpp文件中,主函數(shù)放在另外的一個(gè).cpp文件中。102【例6-11】使用多文件結(jié)構(gòu)組織mobile類(lèi)?!締?wèn)題分析】源文件劃分【算法分析】mobile類(lèi)的多文件結(jié)構(gòu)103.h/mobil.h文件放mobile的定義#ifndef MOBILE_H#define MOBILE_Hclass mobileprivate:char mynumber11;/機(jī)主的電話號(hào)碼public:mobile(char number11
38、);/構(gòu)造函數(shù)void dial();/撥打電話void answer(char othernumber11);/接聽(tīng)電話void hangup();/掛斷電話mobile();/析構(gòu)函數(shù)#endif104.cpp/mobile.cpp文件放mobile成員函數(shù)的定義#include #include mobile.husing namespace std;mobile:mobile(char number11)/初始化strcpy(mynumber,number);cout”Turn on the mobile”mynumberendl;mobile:mobile()cout”Turn of
39、f the mobile”mynumberendl;105void mobile:dial()cout”Dialing number is”mynumberendl;cout”Dialing on.”endl;void mobile:answer(char othernumber11)cout”Answering number is”othernumberendl;cout”Answering in.”endl;void mobile:hangup()cout”Hanging up.”endl;106.cpp/main.cpp放主函數(shù)#include mobile.h#include usin
40、g namespace std;int main()mobile m1(”1111111111”);m1.dial();m1.hangup();m1.answer(”2222222222”);m1.hangup();return 0;107【運(yùn)行結(jié)果】Turn on the mobile1111111111Dialing number is1111111111Dialing on.Hanging up.Answering number is2222222222Answering in.Hanging up.Turn off the mobile1111111111108【思路擴(kuò)展】在什么情況下
41、會(huì)使用類(lèi)的多文件結(jié)構(gòu)?109【例6-12】對(duì)每個(gè)學(xué)生的成績(jī)進(jìn)行判斷,找出有不及格的課程,然后顯示該同學(xué)的學(xué)號(hào)姓名以及不及格課程的名稱(chēng)和分?jǐn)?shù)?!締?wèn)題分析】定義結(jié)構(gòu)體的數(shù)據(jù)類(lèi)型student,其成員分別是學(xué)號(hào)、姓名和一個(gè)數(shù)組,該數(shù)組用來(lái)保存5門(mén)課的成績(jī),初始化時(shí)給出每個(gè)學(xué)生的學(xué)號(hào)、姓名和各門(mén)課程的成績(jī)?!舅惴枋觥吭趯W(xué)生成績(jī)結(jié)構(gòu)體數(shù)組中查找不及格信息。110【源程序】#include using namespace std;int main() struct studentchar stno9;char stname20; int score5;111student stud10=08091101
42、,張品,76,87,69,76,78, 08091102,李利,97,67,79,45,90, 08091103,應(yīng)一利,54,69,76,79,56, 08091104,周勤,87,88,97,99,76, 08091105,吳風(fēng),69,56,98,34,32, 08091106,趙強(qiáng),77,87,99,65,76, 08091107,李力平,91,67,67,87,65, 08091108,張軍利,87,45,77,56,79, 08091109,馮紅,100,69,89,89,76, 08091110,孫李,99,76,97,96,79 ;char course520=數(shù)學(xué),物理,化學(xué),
43、英語(yǔ),計(jì)算機(jī); int i,j,cnt;cout每個(gè)同學(xué)的成績(jī):endl;cout 學(xué)號(hào)t姓名t數(shù)學(xué)t物理t化學(xué)t英語(yǔ)t計(jì)算機(jī)endl;cout=endl;112for(i=0;i10;i+)coutstudi.stnotstudi.stnamet;for(j=0;j5;j+)coutstudi.scorejt;coutendl;cout=endl;cout不及格同學(xué)的課程和成績(jī)?nèi)缦拢篹ndl;/ 處理不及格分?jǐn)?shù)for(i=0;i10;i+) cnt=0;113for(j=0;j5;j+)if(studi.scorej0) cout“姓名:”studi.stname“ 學(xué)號(hào):”studi.st
44、no“ 不及格門(mén)數(shù):cntendl; cout=endl;for(j=0;j5;j+)if(studi.scorej60)coutcoursej:studi.scorejendl; cout=endl;return 0;114【運(yùn)行結(jié)果】每個(gè)同學(xué)的成績(jī): 學(xué)號(hào) 姓名 數(shù)學(xué) 物理 化學(xué) 英語(yǔ) 計(jì)算機(jī)=08091101 張品 76 87 69 76 7808091102 李利 97 67 79 45 9008091103 應(yīng)一利 54 69 76 79 5608091104 周勤 87 88 97 99 7608091105 吳風(fēng) 69 56 98 34 3208091106 趙強(qiáng) 77 87 9
45、9 65 7608091107 李力平 91 67 67 87 6508091108 張軍利 87 45 77 56 7908091109 馮紅 100 69 89 89 7608091110 孫李 99 76 97 96 79=115不及格同學(xué)的課程和成績(jī)?nèi)缦拢盒彰豪罾?學(xué)號(hào):08091102 不及格門(mén)數(shù):1=英語(yǔ):45=姓名:應(yīng)一利 學(xué)號(hào):08091103 不及格門(mén)數(shù):2=數(shù)學(xué):54計(jì)算機(jī):56=姓名:吳風(fēng) 學(xué)號(hào):08091105 不及格門(mén)數(shù):3=物理:56英語(yǔ):34計(jì)算機(jī):32116=姓名:張軍利 學(xué)號(hào):08091108 不及格門(mén)數(shù):2=物理:45英語(yǔ):56=117【思路擴(kuò)展】如果要求
46、找出5門(mén)課程都及格的同學(xué),程序應(yīng)該如何修改?118【例6-13】定義公民類(lèi)Citizen,其中Citizen類(lèi)所包括的內(nèi)容有:身份證號(hào)id、姓名name、性別gende、年齡age;、籍貫birthplace、家庭住址familyAddress等變量,至少兩種構(gòu)造函數(shù),析構(gòu)函數(shù),修改這六個(gè)變量值的函數(shù)set,輸入和顯示公民信息的函數(shù)input和output。【問(wèn)題分析】成員函數(shù)的實(shí)現(xiàn)。【算法描述】定義Citizen類(lèi)119【源程序】#include #include using namespace std;class Citizenpublic:Citizen ()set( 1234 , 張一
47、 , m, 18 , 陜西省 , 西安市 );Citizen (char id,char name,char gender,int age,char birthplace,char familyAddress)set( id,name,gender,age,birthplace,familyAddress );Citizen ()120void set (char id,char name,char gender,int age,char birthplace,char familyAddress)strcpy(this-id,id) ;strcpy(this-name,name) ;this
48、-gender=gender ;this-age=age ;strcpy(this-birthplace,birthplace) ;strcpy(this-familyAddress,familyAddress) ;121void input()cout請(qǐng)輸入以下數(shù)據(jù):endl ;cout身份證號(hào)t ;cout姓名t ;cout性別t ;cout年齡t ;cout籍貫t ;cout家庭住址this-id ;cinthis-name ;cinthis-gender ;cinthis-age ;cinthis-birthplace ;cinthis-familyAddress ;122void o
49、utput()cout身份證號(hào)t ;cout姓名t ;cout性別t ;cout年齡t ;cout籍貫t ;cout家庭住址endl ;coutidt ;coutnamet ;coutgendert ;coutaget ;coutbirthplacet ;coutfamilyAddressid,id) ;char * getID()return this-id ;126(2) 可否把全部成員函數(shù)定義在類(lèi)之外,比如對(duì)于set函數(shù)的定義可以改為以下形式:在類(lèi)中進(jìn)行聲明:void set (char id,char name,char gender,int age,char birthplace,c
50、har familyAddress);在類(lèi)外進(jìn)行定義:void Citizen:set (char id,char name,char gender,int age,char birthplace,char familyAddress)strcpy(this-id,id) ;strcpy(this-name,name) ;this-gender=gender ;this-age=age ;strcpy(this-birthplace,birthplace) ;strcpy(this-familyAddress,familyAddress) ;127【例6-14】定義學(xué)生成績(jī)信息類(lèi)Info,包括
51、學(xué)號(hào)Id、姓名Name、程序設(shè)計(jì)課程成績(jī)Programing、計(jì)算機(jī)網(wǎng)絡(luò)課程成績(jī)Network、數(shù)據(jù)庫(kù)課程成績(jī)Database,總分Total以及設(shè)置信息函數(shù)函數(shù)Set_info、取程序設(shè)計(jì)課程成績(jī)函數(shù)Get_Pro、取計(jì)算機(jī)網(wǎng)絡(luò)課程成績(jī)函數(shù)Get_Net、取數(shù)據(jù)庫(kù)課程成績(jī)函數(shù)Get_Dat、取總分成績(jī)函數(shù)Get_Tol、顯示信息函數(shù)Show。編寫(xiě)程序顯示3門(mén)課程總分從高到低的排名和每門(mén)課程成績(jī)都大于85分的學(xué)生名單?!締?wèn)題分析】定義Info類(lèi)以及在主程序中按要求獲取對(duì)象的信息。【算法描述】對(duì)已賦值的類(lèi)對(duì)象按總分排序并查找滿足條件的類(lèi)對(duì)象。128【源程序】#include #include u
52、sing namespace std;class Infoint Id;char Name20;int Programming;int Network;int Database;int Total;129public:void Set_info(int id,char *name,int programming,int network,int database);int Get_Pro();int Get_Net();int Get_Dat();int Get_Tol();void Show();void Info:Set_info(int id,char *name,int programm
53、ing,int network,int database)Id=id;strcpy(Name,name);Programming=programming;Network=network;Database=database;Total=programming+network+database;130int Info:Get_Pro()return Programming;int Info:Get_Net()return Network;int Info:Get_Dat()return Database;int Info:Get_Tol()return Total;void Info:Show()
54、coutId”t”;coutName”t”;coutProgramming”t”;coutNetwork”t”;coutDatabase”t”;coutTotalendl;131int main()const int COUNT=5;int i=0,j=0;int id;char name20;int programming;int network;int database;Info studentCOUNT,tmp;cout”請(qǐng)輸入學(xué)生成績(jī)的信息”endl;cout”學(xué)號(hào) 姓名 程序設(shè)計(jì) 計(jì)算機(jī)網(wǎng)絡(luò) 數(shù)據(jù)庫(kù)”endl;for(i=0;iidnameprogrammingnetworkdata
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同履約擔(dān)保函
- 2025年度綠色生態(tài)園區(qū)建設(shè)廉潔施工協(xié)議書(shū)樣本2篇
- 2025年文化產(chǎn)業(yè)發(fā)展公司編劇勞動(dòng)合同模板3篇
- 2024年特色餐館轉(zhuǎn)讓協(xié)議2篇
- 2024年電子競(jìng)技賽事組織合同標(biāo)的賽事規(guī)模與權(quán)益分配
- 2024年美團(tuán)簡(jiǎn)易版交易協(xié)議范本版B版
- 2024年紙張銷(xiāo)售長(zhǎng)期合作協(xié)議3篇
- 2025版知識(shí)產(chǎn)權(quán)維權(quán)援助合同規(guī)范模板
- 二零二五年度LNG運(yùn)輸船舶安全管理體系認(rèn)證合同2篇
- 2024年金屬材料購(gòu)銷(xiāo)合同
- 遠(yuǎn)程銀行行業(yè)背景分析
- 如何提高孩子的注意力和專(zhuān)注力
- 2022-2023學(xué)年海南省??谑兄攸c(diǎn)中學(xué)八年級(jí)(上)期末物理試卷(含解析)
- 2019-2020學(xué)年四川省南充市九年級(jí)(上)期末數(shù)學(xué)試卷
- 膽石癥教案完
- 護(hù)士個(gè)人優(yōu)點(diǎn)和缺點(diǎn)(六篇)
- DIN-EN-ISO-2409-CN國(guó)際標(biāo)準(zhǔn)文檔
- 教師管理培訓(xùn)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)
- 公務(wù)員面試輔導(dǎo)(共75張PPT)
- 2021年新高考語(yǔ)文Ⅰ卷真題現(xiàn)代文閱讀《石門(mén)陣》解析
- 老化測(cè)試記錄表
評(píng)論
0/150
提交評(píng)論