




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++程序設計
第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表結構體的概念打印學生成績單,格式如下:學號姓名語文成績數學成績英語成績.00001張三96948800003李四89707600004王五908778如何在程序中表示這組學生信息?可選方案用二維的數組來表示該方案不可行,因為這些信息有不同的類型每一列用一個一維數組來表示,這種方法稱為并聯數組。要保證每位學生信息的完整性和正確性很難為什么要使用記錄當我們考慮怎么邏輯地組織數據時,應該將一個人的所有信息項放在一起,即保持相關性。學號姓名語文成績數學成績英語成績.00001張三96948800003李四89707600004王五908778我
們
希
望
的
結
構學生一00001張三969488學生二00003李四897076學生三00004王五908778記錄在C++中稱為結構體結構體類型作用結構體類型允許程序員把一些分量聚合成一個整體,用一個變量表示。一個結構體的各個分量都有名字,把這些分量稱為成員(member)。由于結構體的成員可以是各種類型的,程序員能創建適合于問題的數據聚合。結構體的使用定義一個新的結構體類型定義新類型的變量訪問結構體變量第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表結構體類型的定義定義結構體類型中包括哪些分量格式:struct
結構體類型名{字段聲明;};如:struct
studentT{charno[10];charname[10];
int
chinese;
intmath;
int
english;};注意字段名可與程序中的變量名相同在不同的結構體中可以有相同的字段名結構體成員的類型可以是任意類型,當然也可以是結構體類型struct
dateT{ intmonth;
intday;
intyear;};struct
studentT{ ...
dateTbirthday;};
第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表結構體類型的變量結構體變量的定義結構體類型的引用指向結構體的指針動態分配結構體的空間結構體變量的定義結構體變量的定義和普通的變量定義一樣。如定義了結構體類型studentT,就可以定義結構體變量:
studentTstudent1;一旦定義了一個結構體類型的變量,系統在分配內存時就會分配一塊連續的空間,依次存放它的每一個分量。這塊空間總的名字就是結構體變量的名字。內部還有各自的名字
。
englishmathchinesenamenostudent1結構體變量的初始化studentTstudent1={“00001”,“張三”,87,90,77};
定義結構體類型的同時定義變量struct
結構體類型名{
字段聲明;}結構體變量;struct
結構體類型名{
字段聲明;};結構體類型名結構體變量;struct
studentT{charno[10];…}student1;struct
studentT{charno[10];…};studentTstudent1;studentTstudent2,student3;定義結構體類型的同時定義變量(cont.)struct
結構體類型名{
字段聲明;}結構體變量;struct{
字段聲明;}結構體變量;struct
studentT{charno[10];…}student1;studentTstudent2,student3;不能繼續定義變量struct{charno[10];…}student1;結構體類型的變量結構體變量的定義結構體類型的引用指向結構體的指針動態分配結構體的空間結構體變量的訪問成員的表示:
結構變量名.成員名
如:
如結構中還有結構,則一級一級用”.”分開,如如:student1.birthday.year對結構體類型變量的引用一般為引用他的成員結構變量的賦值結構體變量的賦值通常是通過對它的每一個成員的賦值而實現。如:輸入student1的內容可用:cin>>student1.no>>>>student1.chinese>>student1.math>>student1.english>>student1.birthday.year>>student1.birthday.month>>student1.birthday.day;同類型的結構變量之間可以相互賦值,如student1=student2;將student2的成員對應賦給student1的成員結構變量的賦值(cont.)同類型的結構變量之間可以相互賦值,如
student1=student2;將student2的成員對應賦給student1的成員student1.no=student2.no;=;student1.chinese=student2.chinese;…結構變量的輸出結構體變量的輸出通常是通過輸出它的每一個成員而實現。如:輸出student1的內容可用:cout<<student1.no<<<<student1.chinese<<student1.math<<student1.english<<student1.birthday.year<<student1.birthday.month<<student1.birthday.day;結構體類型的變量結構體變量的定義結構體類型的引用指向結構體的指針動態分配結構體的空間指向記錄的指針直接定義指針變量
studentT*sp;也可以在定義結構體類型的同時定義指向結構體的指針struct
結構體類型名{
字段聲明;}*結構體指針;通過指針操作記錄給結構體指針賦值,如:
sp=&student1;(*指針).成員
如:(*sp).name
指針->成員如:sp->namestudent1.成員
->是所有運算符中優先級最高的
通常程序員習慣使用第二種方法結構體指針的引用:結構體類型的變量結構體變量的定義結構體類型的引用指向結構體的指針動態分配結構體的空間動態分配結構體的空間指向結構體指針的另一種用法是存儲動態申請到的內存的首地址。用法和申請普通的動態變量一樣。如:
studentT*sp;sp=newstudentT;第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表
結構體數組用于描述個體的集合定義格式:
studentT
studentArray[SIZE];結構體數組的引用引用數組的某一成員的成員
studentArray[3].name數組成員之間相互賦值
studentArray[4]=studentArray[2]結構數組的初始化
studentTstudentArray[5]={{“00001”,張三“,80,90,98},{…},{…},{…}};統計候選人得票。設有三個候選人,每次輸入一個得票的候選人編號(1-3),要求最后輸出各人得票結果。
struct
personT{intid;
intcount;}leader[3]={1,0,2,0,3,0};
intmain(){inti,j,inputID;for(i=1;i<=10;++i){cin>>inputID;if(inputID<1||inputID>3){cout<<“廢票”;continue;}leader[inputID-1].count+=1;}
cout<<endl;for(i=0;i<3;++i)
cout<<leader[i].id<<““<<leader[i].count);return0;}
例:輸出通訊錄
#include<iostream>#include<iomanip>usingnamespacestd;struct
personT{charname[10];charsex;charaddr[30];
int
phonenum;};constintMAX=100;intmain(){personT
p[MAX];
inti,num=0;
cout<<"姓名性別地址電話(@表示結束):\n";while(num<100){
cin>>p[num].name;if(p[num].name[0]=='@')break;
cin>>p[num].sex>>p[num].addr>>p[num].phonenum;
++num;}cout<<"Name"<<"Sex\t\t"<<"Addr\t\t\t"<<"PhoneNum\n";
cout<<setiosflags(ios::left);for(i=0;i<num;++i)
cout<<setw(10)<<p[i].name<<p[i].sex<<'\t‘<<setw(30)<<p[i].addr<<'\t'<<p[i].phonenum<<endl;return0;}指針與結構體數組與普通的指針一樣,指向結構體的指針也能夠用來指向一個結構體數組。此時,對指針加1就是加了該結構體的大小。第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表voidswap2(int*a,int*b){
inttemp;temp=*a;*a=*b;*b=temp;}voidswap1(inta,intb){
inttemp;temp=a;a=b;b=temp;}intmain(){intx=4,y=6;
swap1(x,y);
cout<<“x=“<<x<<“y=“<<y<<endl;}swap2(&x,&y);swap3(x,y);voidswap3(int&a,int&b){
inttemp;temp=a;a=b;b=temp;}結構體作為參數傳遞盡管結構體和數組一樣也有許多分量組成,但結構體的傳遞和普通內置類型是一樣的。它是將實際參數中的每個分量復制到形式參數的每個分量中。結構體的傳遞voidPrintPerson(PersonTp)指向結構體的指針作為參數因為結構體是值傳遞,當希望把函數內部對結構體的修改返回給主調函數時,可以用指針傳遞或引用傳遞由于結構體一般占用的內存量都比較大,值傳遞既浪費空間又浪費時間。因此可用指針傳遞或引用傳遞指針傳遞形式比較繁瑣,所以C++通常用引用傳遞引用傳遞的問題是函數中可以修改實際參數,要控制函數中不能修改實際參數,可以加const限定指向結構體的指針作為參數和普通的指針傳遞一樣,函數中可以通過指針訪問主調函數的記錄減少函數調用時的數據傳遞量voidPrintPerson(personT&p);voidPrintPerson(const
personT&p);結構體傳遞的實例設計一函數,打印學生信息設計一:值傳遞voidPrintStudent(studentTs){cout<<s.no<<‘\t’<<<<‘\t’<<s.chinese<<‘\t’<<s.math<<‘\t’<<s.english<<endl;}缺點:浪費時間空間設計二:指針傳遞或引用傳遞voidPrintStudent(studentT*s){cout<<s->no<<‘\t’<<s->name<<‘\t’<<s->chinese<<‘\t’<<s->math<<‘\t’<<s->english<<endl;}voidPrintStudent(studentT&s){cout<<s.no<<‘\t’<<<<‘\t’<<s.chinese<<‘\t’<<s.math<<‘\t’<<s.english<<endl;}缺點:不安全設計三:C++的常規做法voidPrintStudent(const
studentT&s){cout<<s.no<<‘\t’<<<<‘\t’<<s.chinese<<‘\t’<<s.math<<‘\t’<<s.english<<endl;}特點:節約內存,提高函數調用速度,可靠返回結構體類型的函數一個函數返回一個結構體。如:personT
GetPersonData(){personTperson;…….return(person);}返回的是一個結構體的復制。在主調函數中必須有這樣的程序段:voidmain(){personTp1,p2;p1=GetPersonData();}返回結構體引用的函數函數返回一個結構體的引用。如:personT&GetPersonData(void){personT*person=newpersonT;…….return(*person);}本質上返回的是結構體的地址。在主調函數中可以有這樣的程序段:main(){personT&p1=GetPersonData();…}
函數中返回的結構體不能是局部變量第8章數據封裝—結構體結構體的概述結構體類型的定義結構體類型的變量結構體數組結構體作為函數的參數鏈表單鏈表鏈表的概念鏈表的存儲鏈表的操作鏈表的應用循環鏈表單鏈表nilhead只指出后繼關系的鏈表…單鏈表nilhead頭結點只指出后繼關系的鏈表…雙鏈表
head循環鏈表
head同時存儲前趨和后繼……單鏈表鏈表的概念鏈表的存儲鏈表的操作鏈表的應用循環鏈表單鏈表的存儲struct
linkRec{
datatypedata;
linkRec*next;};單鏈表鏈表的概念鏈表的存儲鏈表的操作鏈表的應用循環鏈表單鏈表操作—插入申請空間輸入數據放入申請到的空間鏈入p后在結點p后插入一個結點
headptmp…tmp=newlinkRec;//創建一個新節點tmp->data=x;//把x放入新節點的數據成員中tmp->next=p->next;//把新節點和p的下一成員相連p->next=tmp;//把p和新節點連接起來
單鏈表操作—刪除把結點p后的結點刪除headpdelPtrdelPtr=p->next;p->next=delPtr->next;deletedelPtr;
單鏈表操作--建立定義頭指針:linkRec*head;建立頭結點申請空間設為頭結點head單鏈表操作--建立(續)逐個從鍵盤輸入數據,存入鏈表
接受輸入申請空間輸入數據放入申請到的空間鏈入鏈表尾置鏈表結束標志headabcd^head=newlinkRec;rear=head;cin>>in_data;while(輸入未結束){p=newlinkRec;p->data=in_data;rear->next=p;rear=p;
cin>>in_data;}rear->next=NULL;
單鏈表操作—輸出headabcd^p=head->next;while(p!=NULL){cout<<p->data;p=p->next;}
創建并訪問一個帶頭結點的、存儲整型數據的單鏈表,數據從鍵盤輸入,0為輸入結束標志。#include<iostream>usingnamespacestd;
struct
linkRec{
intdata;
linkRec*next;};intmain(){intx;//存放輸入的值
linkRec*head,*p,*rear;
head=rear=newlinkRec;
while(true){//創建鏈表的其他結點
cin>>x;if(x==0)break;p=newlinkRec; p->data=x;rear->next=p;rear=p; }
rear->next=NULL; //設置rear為表尾,其后沒有結點了
//讀鏈表
cout<<"鏈表的內容為:\n";p=head->next;while(p!=NULL){cout<<p->data<<'\t';p=p->next;}
cout<<endl;
return0;}單鏈表鏈表的概念鏈表的存儲鏈表的操作鏈表的應用循環鏈表鏈表的應用合并二個有序鏈表
A1356274B981C187654329struct
lk{intdata;
lk*next;};
struct
lk*merge(struct
lk*a,struct
lk*b){struct
lk*c,*p;if(a->data<b->data){c=a;a=a->next;}else{c=b;b=b->next;}p=c;while(a!=NULL&&b!=NULL){if(a->data<b->data){p->next=a;a=a->next;}else{p->next=b;b=b->next;}p=p->next;}if(a==NULL)p->next=b;elsep->next=a;return(c);}
單鏈表鏈表的概念鏈表的存儲鏈表的操作鏈表的應用循環鏈表例:n個人圍成一圈,從第一個人開始報數1、2、3。凡報到
3者退出圈子。找出最后留在圈子中的人的序號。
解。用循環鏈表
01243head當n=5時,其刪除的節點的順序為2,0,4,1,最后剩下的節點為3。
循環鏈表的應用—約瑟夫環structnode{intdata;node*next;};intmain(){node*head,*p,*q;//head為鏈表頭
intn,i;//輸入n
cout<<"\ninputn:";cin>>n;//建立鏈表
head=p=newnode;p->data=0;//p指向表尾
for(i=1;i<n;++i){q=newnode;//q為當前正在創建的節點
q->data=i;p->next=q;p=q;//將q鏈入表尾
}p->next=head;//頭尾相連
//刪除過程
q=head;while(q->next!=q)//只要表非空
{for(i=0;i<2;++i)//報數,
{p=q;q=p->next;}p->next=q->next;//繞過節點q
cout<<q->data<<'\t';//顯示被刪者的編號
deleteq; //回收被刪者的空間
q=p->next;//讓q指向報1的節點
}//打印結果
cout<<"\n最后剩下:"<<q->data<<endl;return0;}
鏈表總結實現較復雜插入、刪除效率高,但查找第i個元素效率低無表滿的問題適合于動態表總結本章介紹了結構體作用:處理更復雜的數據使用:定義類型定義變量鏈表選擇題鏈表結點的結構類型為。
struct
linkRec{intdata;linkRec*next;};如果指針rear指向尾結點,將節點p鏈入表尾,并將p作為新的表尾可用語句()
A、rear->next=p->next;rear=p;B、rear->next=p;rear=p;C、rear->next=rear;p->next=p;D、(*rear).next=rear;(*p).next=p;選擇題對結構體變量stu1中成員age的非法引用是()struct
studentT{
intnum;floatage;};studentTstu1,*p;p=&stu1;A.stu1.ageB.studentT.age
C.p->ageD.(*p).age
第9章模塊化開發自頂向下的分解模塊劃分庫的設計與實現庫的應用猜硬幣的游戲功能:提供游戲指南;計算機隨機產生正反面,讓用戶猜,報告對錯結果。重復此過程,直到用戶不想玩了為止。這是一個猜硬幣正反面的游戲。我會扔一個硬幣,你來猜。如果猜對了,你贏,否則我贏。輸入你的選擇(0表示正面,1表示反面):1我贏了繼續玩嗎(Y或y)?y輸入你的選擇(0表示正面,1表示反面):6輸入你的選擇(0表示正面,1表示反面):1你贏了繼續玩嗎(Y或y)?nPressanykeytocontinue運行實例頂層分解程序要做兩件事:顯示程序指南;模擬玩游戲的過程。main(){
顯示游戲介紹;玩游戲;}主程序的兩個步驟是相互獨立的兩個,沒有什么聯系,因此可設計成兩個函數:voidprn_instruction()voidplay()intmain(){
prn_instruction();play();return0;}prn_instruction的實現prn_instruction函數的實現非常簡單,只要一系列的輸出語句把程序指南顯示一下就可以了voidprn_instruction(){cout<<"這是一個猜硬幣正反面的游戲.\n";
cout<<"我會扔一個硬幣,你來猜.\n";
cout<<"如果猜對了,你贏,否則我贏。\n";}play函數的實現play函數隨機產生正反面,讓用戶猜,報告對錯結果,然后詢問是否要繼續玩voidplay(){charflag=‘y’;while(flag==‘Y’||flag==‘y’)
{coin=生成正反面;
輸入用戶的猜測;
if(用戶猜測==coin)報告本次猜測結果正確;
else報告本次猜測結果錯誤;
}}play函數的細化生成正反面:如果用0表示正面,1表示反面,那么生成正反面就是隨機生成0和1兩個數。輸入用戶的猜測。如果不考慮程序的魯棒性,這個問題也可以直接用一個輸入語句即可。但想讓程序做得好一點,就必須考慮得全面一些。比如,用戶可以不守規則,既不輸入0也不輸入1,而是輸入一個其他值,程序該怎么辦?因此這個任務還可以進一步細化,所以再把它抽象成一個函數get_call_from_user。voidplay(){intcoin;charflag='Y';
srand(time(NULL));//設置隨機數種子
while(flag=='Y'||flag=='y'){coin=rand()%2;//生成扔硬幣的結果
if(get_call_from_user()==coin)cout<<"你贏了";elsecout<<"我贏了";
cout<<"\n繼續玩嗎(Y或y)?";
cin>>flag;}}get_call_from_user的實現該函數接收用戶輸入的一個整型數。如果輸入的數不是0或1,則重新輸入,否則返回輸入的值int
get_call_from_user(){intguess;//0=head,1=taildo{cout<<"\n輸入你的選擇(0表示正面,1表示反面):";
cin>>guess;}while(guess!=0&&guess!=1);returnguess;}第9章模塊化開發自頂向下的分解模塊劃分庫的設計與實現庫的應用模塊劃分當程序變得更長的時候,要在一個單獨的源文件中處理如此眾多的函數會變得困難把程序再分成幾個小的源文件。每個源文件都包含一組相關的函數。一個源文件被稱為一個模塊。模塊劃分標準:塊內聯系盡可能大,塊間聯系盡可能小
石頭、剪刀、布游戲游戲規則布覆蓋石頭石頭砸壞剪刀剪刀剪碎布游戲的過程為:游戲者選擇出石頭、剪子或布,計算機也隨機選擇一個,輸出結果,繼續游戲,直到游戲者選擇結束為止。在此過程中,游戲者也可以閱讀游戲指南或看看當前戰況。第一層的分解while(用戶輸入!=quit){switch(用戶的選擇)
{casepaper,rock,scissor:機器選擇;評判結果;報告結果;
casegame:顯示目前的戰況;
casehelp:顯示幫助信息;
default:報告錯誤;
}}顯示戰況;函數抽取獲取用戶輸入selection_by_player獲取機器輸入selection_by_machine評判結果compare報告結果并記錄結果信息report顯示目前戰況prn_game_status顯示幫助信息prn_help六個函數枚舉類型的定義為了提高程序的可讀性,我們定義兩個枚舉類型:
enum
p_r_s{paper,rock,scissor,game,help,quit};
enumoutcome{win,lose,tie,error};模塊劃分分成四個模塊:主模塊:main函數獲取選擇的模塊:selection_by_player和
selection_by_machine比較模塊:compare輸出模塊:report、prn_game_status和
prn_help函數select模塊的設計selection_by_player從鍵盤接收用戶的輸入并返回此輸入值。因此,原型為
p_r_s
selection_by_player();selection_by_machine函數由機器產生一個石頭、剪子、布的值,并返回。因此,原型為
p_r_s
selection_by_machine();compare模塊的設計compare函數比較用戶輸入的值和機器產生的值,確定輸贏。它要有兩個參數,都是p_r_s類型的,它也應該有一個返回值,就是判斷的結果。原型為:outcomecompare(p_r_s,p_r_s);
print模塊的設計prn_help顯示一個用戶輸入的指南,告訴用戶如何輸入他的選擇。因此,它沒有參數也沒有返回值。report函數報告輸贏結果,并記錄輸贏的次數。因此它必須有四個參數:輸贏結果、輸的次數、贏的次數和平局的次數,但沒有返回值。prn_game_status函數報告至今為止的戰況,因此需要三個參數:輸的次數、贏的次數和平的次數,但沒有返回值。print模塊的進一步考慮輸的次數、贏的次數和平局的次數在report和prn_game_status兩個函數中都出現。report函數修改這些變量的值,prn_game_status函數顯示這些變量的值。這三個函數的原型和用戶期望的原型不一致,用戶不希望原型中有參數。輸的次數、贏的次數和平局的次數和其他模塊的函數無任何關系,因此可作為該模塊的內部狀態。內部狀態可以作為該模塊的全局變量這樣report和prn_game_status函數中都不需要這三個參數了。頭文件的設計為方便起見,我們把所有的符號常量定義、類型定義和函數原型聲明寫在一個頭文件中,讓每個模塊都include這個頭文件。那么,每個模塊就不必要再寫那些函數的原型聲明了但這樣做又會引起另一個問題,當把這些模塊連接起來時,編譯器會發現這些類型定義、符號常量和函數原型的聲明在程序中反復出現多次。解決方法:需要用到一個新的編譯預處理命令:#ifndef
標識符…#endif
頭文件的格式#ifndef
_name_h#define_name_h
頭文件真正需要寫的內容#endif石頭、剪子、布游戲的頭文件//文件:p_r_s.h//本文件定義了兩個枚舉類型,聲明了本程序包括的所有函數原型#ifndefP_R_S#defineP_R_S
#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;
enum
p_r_s{paper,rock,scissor,game,help,quit};
enumoutcome{win,lose,tie,error};
outcomecompare(p_r_s
player_choice,p_r_s
machine_choice);voidprn_final_status();voidprn_game_status();voidprn_help();voidreport(outcomeresult);
p_r_s
selection_by_machine();
p_r_s
selection_by_player();#endif主模塊的實現//文件:main.cpp//石頭、剪子、布游戲的主模塊#include"p_r_s.h"int
main(void){outcomeresult;
p_r_s
player_choice,machine_choice;//seedtherandomnumbergenerator
srand(time(NULL));
while((player_choice=selection_by_player())!=quit)
switch(player_choice){casepaper:caserock:casescissor:
machine_choice=selection_by_machine();result=compare(player_choice,
machine_choice);
report(result);break;casegame:prn_game_status();break;casehelp:prn_help();break;default:
cout<<"PROGRAMMERERROR!\n\n";exit(1);}
prn_game_status();return0;}select模塊的實現//文件:select.cpp//包括機器選擇selection_by_machine和//玩家選擇selection_by_player函數的實現#include"p_r_s.h"p_r_s
selection_by_machine(){intselect=rand()%3;
cout<<"Iam";
switch(select){case0:cout<<"paper.";break;case1:cout<<"rock.";break;case2:cout<<"scissor.";break;
}return((p_r_s)select);}p_r_s
selection_by_player(){charc;
p_r_s
player_choice;
prn_help();//顯示輸入提示
cout<<"pleaseselect:";cin>>c;
switch(c){case'p':player_choice=paper;cout<<"youarepaper.";break;case'r':player_choice=rock;cout<<"youarerock.";break;case's':player_choice=scissor;cout<<"youarescissor.";break;case'g':player_choice=game;break;case'q':player_choice=quit;break;default:player_choice=help;break;
}returnplayer_choice;}compare模塊的實現//文件:compare.cpp
//包括compare函數的實現#include"p_r_s.h"outcomecompare(p_r_s
player_choice,p_r_s
machine_choice){outcomeresult;if(player_choice==machine_choice)returntie;
switch(player_choice){casepaper:result=(machine_choice==rock)?win:lose;break;caserock:result=(machine_choice==scissor)?win:lose;break;casescissor:result=(machine_choice==paper)?win:lose;break;default:cout<<"PROGRAMMERERROR:Unexpectedchoice!\n\n";
exit(1);}returnresult;}Print模塊的實現//文件:print.cpp//包括所有與輸出有關的模塊。//有prn_game_status,prn_help和report函數#include"p_r_s.h"int
win_cnt=0,lose_cnt=0,tie_cnt=0;//模塊的內部狀態voidreport(outcomeresult){switch(result){casewin:++win_cnt;
cout<<"Youwin.\n";break;caselose:++lose_cnt;
cout<<"Youlose.\n";break;
casetie:++tie_cnt;cout<<"Atie.\n";break;
default:
cout<<"PROGRAMMERERROR!\n\n";
exit(1);}}voidprn_game_status(){cout<<endl;
cout<<"GAMESTATUS:"<<endl;
cout<<"win:"<<win_cnt<<endl;
cout<<"Lose:"<<lose_cnt<<endl;cout<<"tie:"<<tie_cnt<<endl;
cout<<"Total:"<<win_cnt+lose_cnt+tie_cnt<<endl;}voidprn_help(){cout<<endl<<"Thefollowingcharacterscanbeused:\n"
<<"pforpaper\n"<<"rforrock\n"
<<"sforscissors\n"<<"gprintthegamestatus\n"<<"hhelp,printthislist\n"<<"qquitthegame\n";}第9章模塊化開發自頂向下的分解模塊劃分庫的設計與實現庫的應用設計自己的庫如果你的工作經常要用到一些特殊的工具,你可以設計自己的庫。一個庫應該有一個主題。一個庫中的函數都應該是處理同一類問題。如標準庫iostream包含輸入輸出功能,cmath包含數學運算函數。我們自己設計的庫也要有一個主題。設計一個庫還要考慮到它的通用性。庫中的功能應來源于某一應用,但不局限于該應用,而且要高于該應用。在某一應用程序中提取庫內容時應盡量考慮到兼容更多的應用,使其他應用程序也能共享這個庫。庫的設計和實現設計庫的接口:庫的用戶必須了解的內容,包括庫中函數的原型、這些函數用到的符號常量和自定義類型接口表現為一個頭文件設計庫中的函數的實現:表現為一個源文件庫的這種實現方法稱為信息隱藏隨機函數庫的設計庫的功能在9.1中,用到了隨機生成0和1在9.2中,用到了隨機生成0和2在自動出題中,用到了隨機生成0和3及隨機生成0到9用一個函數概括:生成low到high之間的隨機數
intRandomInteger(intlow,inthigh)
初始化函數RandomInit()實現設置隨機數種子的功能在9.1節中,設計了一個擲硬幣的程序。該程序用到了隨機數的一些特性。如果我們的工作經常需要用到隨機數,我們可以把隨機數的應用寫成一個庫。接口文件頭文件的格式:與石頭、剪子、布游戲中的頭文件格式一樣。頭文件中,每個函數聲明前應該有一段注釋,告訴用戶如何使用這些函數。庫接口的設計//文件:Random.h//隨機函數庫的頭文件#ifndef_random_h#define_random_h//函數:RandomInit//用法:RandomInit()//作用:此函數初始化隨機數種子voidRandomInit();//函數:RandomInteger//用法:n=RandomInteger(low,high)//作用:此函數返回一個low到high之間的隨機數,包括low和highint
RandomInteger(intlow,inthigh);#endif庫的實現庫的實現文件和頭文件的名字是相同的。如頭文件為Random.h,則實現文件為Random.cpp。實現文件的格式:注釋:這一部分簡單介紹庫的功能。include此cpp文件所需的頭文件。每個實現要包含自己的頭文件,以便編譯器能檢查函數定義和函數原型聲明的一致性。每個函數的實現代碼。在每個函數實現的前面也必須有一段注釋。//文件:Random.cpp//該文件實現了Random庫#include<cstdlib>#include<ctime>#include"Random.h"http://函數:RandomInit//該函數取當前系統時間作為隨機數發生器的種子voidRandomInit(){
srand(time(NULL));}//函數:RandomInteger
intRandomInteger(intlow,inthigh){return(low+rand()/(high–low+1));}第9章模塊化開發自頂向下的分解模塊劃分庫的設計與實現庫的應用庫的應用--龜兔賽跑動物跑動類型占用時間跑動量烏龜快走50%向前走3點后滑20%向后退6點慢走30%向前走一點兔子睡覺20%不動大后滑20%向后退9點快走10%向前走14點小步跳30%向前走3點慢后滑20%向后退2點龜兔賽跑解題思路分別用變量tortoise和hare代表烏龜和兔子的當前位置時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥品采購投訴管理制度
- 藥店保健食品管理制度
- 藥店援助藥品管理制度
- 營運客車安全管理制度
- 設備健康指標管理制度
- 設備施工過程管理制度
- 設備物資安全管理制度
- 設備維護養護管理制度
- 設備隱患整改管理制度
- 設計公司薪酬管理制度
- (正式版)JTT 1497-2024 公路橋梁塔柱施工平臺及通道安全技術要求
- ISO15614-1 2017 金屬材料焊接工藝規程及評定(中文版)
- MOOC 園林植物遺傳育種學-北京林業大學 中國大學慕課答案
- 抖音種草方案
- 抖音來客商家門店經營
- 術后鎮痛慢性疼痛癌性疼痛診療標準規范及作業流程
- 2022AHA-ACC-HFSA心衰管理指南解讀
- 智慧能源管理云平臺方案智慧能源綜合服務方案智慧能源管理系統方案38-82
- 《小石潭記》教學實錄及反思特級教師-王君
- 24年海南生物會考試卷
- 水泥混凝土道路耐久性提升技術
評論
0/150
提交評論