面向?qū)ο蟪绦蛟O(shè)計(jì)A總結(jié)_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)A總結(jié)_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)A總結(jié)_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)A總結(jié)_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)A總結(jié)_第5頁
已閱讀5頁,還剩115頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

面向?qū)ο?/p>

程序設(shè)計(jì)A主講:張冀E-mail:ijgnahz123@163.comTel學(xué)與統(tǒng)計(jì)學(xué)院*第一章緒論3不同進(jìn)位記數(shù)制間的轉(zhuǎn)換

——R進(jìn)制→十進(jìn)制各位數(shù)字與它的權(quán)相乘,其積相加。例如:(11111111.11)2=1×27+1×26+1×25+1×24

+1×23+1×22+1×21+1×20+1×2-1+1×2-2

=(255.75)10(3506.2)8=3×83+5×82+0×81+6×80+2×8-1

=(1862.25)10(0.2A)16=2×16-1+10×16-2=(0.1640625)10信息的表示與存儲4不同進(jìn)位記數(shù)制間的轉(zhuǎn)換

——十進(jìn)制→R進(jìn)制十進(jìn)制整數(shù)轉(zhuǎn)換成R進(jìn)制的整數(shù)“除R取余”法,例如:268余數(shù)

234┄┄┄┄┄┄┄┄┄┄┄0低位

217┄┄┄┄┄┄┄┄┄┄┄028┄┄┄┄┄┄┄┄┄┄┄124┄┄┄┄┄┄┄┄┄┄022┄┄┄┄┄┄┄┄┄┄021┄┄┄┄┄┄┄┄┄00┄┄┄┄┄┄┄┄┄1高位所以6810=10001002信息的表示與存儲5不同進(jìn)位記數(shù)制間的轉(zhuǎn)換

——十進(jìn)制→R進(jìn)制十進(jìn)制小數(shù)轉(zhuǎn)換成R進(jìn)制小數(shù)“乘R取整”法,例如:高位

0.3125×2=0.6250.625×2=1.250.25×2=0.50.5×2=1.0所以0.312510=0.01012

信息的表示與存儲6不同進(jìn)位記數(shù)制間的轉(zhuǎn)換

——二、八、十六進(jìn)制的相互轉(zhuǎn)換每位八進(jìn)制數(shù)相當(dāng)于三位二進(jìn)制數(shù)每位十六進(jìn)制數(shù)相當(dāng)于四位二進(jìn)制數(shù)(1011010.10)2=(001

011

010.100)2

=(132.4)8(1011010.10)2=(0101

1010.1000)2

=(5A.8)16(F7)16=(1111

0111)2=(11110111)2信息的表示與存儲7二進(jìn)制數(shù)的編碼表示:補(bǔ)碼計(jì)算機(jī)中的補(bǔ)碼表示法負(fù)數(shù)的補(bǔ)碼由該數(shù)反碼的末位加1求得對補(bǔ)碼再求補(bǔ)即得到原碼補(bǔ)碼運(yùn)算規(guī)則符號位可作為數(shù)值參加運(yùn)算減法運(yùn)算可轉(zhuǎn)換為加法運(yùn)算:加上一個負(fù)數(shù)等于加上該數(shù)的補(bǔ)碼補(bǔ)碼運(yùn)算的結(jié)果仍為補(bǔ)碼運(yùn)算結(jié)果溢出:負(fù)數(shù)之和得正數(shù),或正數(shù)之和得負(fù)數(shù)(-32)10=(11100000)2=(E0)16信息的表示與存儲8程序的開發(fā)過程編輯將源程序輸入到計(jì)算機(jī)中,生成后綴為cpp的磁盤文件。編譯將程序的源代碼轉(zhuǎn)換為機(jī)器語言代碼。連接將多個源程序文件以及庫中的某些文件連在一起,生成一個后綴為exe的可執(zhí)行文件。運(yùn)行調(diào)試程序的開發(fā)過程10本章主要內(nèi)容C++語言概述基本數(shù)據(jù)類型和表達(dá)式數(shù)據(jù)的輸入與輸出算法的基本控制結(jié)構(gòu)自定義數(shù)據(jù)類型11數(shù)據(jù)類型

—整型數(shù)據(jù)及取值范圍類型 說明符 位數(shù) 數(shù)值范圍 短整

short 16 -32768~32767基本

int 32 -231~(231-1)長整

long 32 -231~(231-1)無符號unsignedshort 16 0~65535unsigned

int 32 0~(232-1)unsignedlong 32 0~(232-1) 基本數(shù)據(jù)類型和表達(dá)式12#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;

int

num,total;floatv,r,h;num=10;total=num*PRICE;

cout<<total<<endl;

r=2.5;h=3.2;v=3.14159*r*r*h;

cout<<v<<endl;}

數(shù)據(jù)類型

——實(shí)型數(shù)據(jù)實(shí)型常量float4字節(jié)精度:3.4×10±387位有效數(shù)字double8字節(jié)精度:1.7×10±30815位有效數(shù)字longdouble8字節(jié)精度:1.7×10±30815位有效數(shù)字實(shí)型變量默認(rèn)為double型后綴F(或f)

為float型后綴L(或l)

為longdouble

型基本數(shù)據(jù)類型和表達(dá)式13

數(shù)據(jù)類型

——字符型數(shù)據(jù)(一)字符常量單引號括起來的一個字符,

如:'a','D','?','$'字符變量用來存放字符常量

例:charc1,c2;

c1='a';

c2='A';字符數(shù)據(jù)在內(nèi)存中的存儲形式以ASCII碼存儲,占1字節(jié),用7個二進(jìn)制位基本數(shù)據(jù)類型和表達(dá)式14字符數(shù)據(jù)的使用方法字符數(shù)據(jù)和整型數(shù)據(jù)之間可以運(yùn)算。字符數(shù)據(jù)與整型數(shù)據(jù)可以互相賦值。字符串常量例:"CHINA"

"a"

'a'所以:charc;

c="a";CHINA\0a

\0aPage14

數(shù)據(jù)類型

——字符型數(shù)據(jù)(二)基本數(shù)據(jù)類型和表達(dá)式15

數(shù)據(jù)類型

——布爾型數(shù)據(jù)布爾型變量的說明:

例:boolflag;布爾型數(shù)據(jù)的取值:

只有false

和true

兩個值基本數(shù)據(jù)類型和表達(dá)式16

數(shù)據(jù)類型

——常量與變量#include<iostream>usingnamespacestd;intmain(){

constintPRICE=30;

int

num,total;floatv,r,h;

num=10;total=num*PRICE;

cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;

cout<<v<<endl;}常量變量變量先聲明后使用符號常量基本數(shù)據(jù)類型和表達(dá)式17

數(shù)據(jù)類型

——變量初始化例:

inta=3;

doublef=3.56;

charc='a';

intc(5);Page17基本數(shù)據(jù)類型和表達(dá)式181、算數(shù)運(yùn)算符與表達(dá)式2、賦值運(yùn)算符與賦值表達(dá)式3、逗號運(yùn)算和逗號表達(dá)式4、邏輯運(yùn)算與邏輯表達(dá)式5、條件運(yùn)算符與條件表達(dá)式6、sizeof運(yùn)算符7、位運(yùn)算8、運(yùn)算符優(yōu)先級與結(jié)合性9、混合運(yùn)算時數(shù)據(jù)類型的轉(zhuǎn)換Page18基本數(shù)據(jù)類型和表達(dá)式運(yùn)算符與表達(dá)式19運(yùn)算符優(yōu)先級++,--,sizeof*,/,%+,-==,!=位運(yùn)算&&||?:賦值運(yùn)算逗號運(yùn)算低高基本數(shù)據(jù)類型和表達(dá)式20簡單的輸入、輸出向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)輸出例:intx;

cout<<"x="<<x;從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入例:intx;

cin>>x;21順序結(jié)構(gòu)分支結(jié)構(gòu)(if、switch)循環(huán)結(jié)構(gòu)(while、dowhile、for)算法的基本控制結(jié)構(gòu)22一般形式switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2┆case常量表達(dá)式n:語句ndefault:語句n+1}switch語句執(zhí)行順序以case中的常量表達(dá)式值為入口標(biāo)號,由此開始順序執(zhí)行。因此,每個case分支最后應(yīng)該加break語句。每個常量表達(dá)式的值不能相同,次序不影響執(zhí)行結(jié)果??梢允嵌鄠€語句,但不必用{}??梢允钦?、字符型、枚舉型算法的基本控制結(jié)構(gòu)23while語句形式while(表達(dá)式)語句

可以是復(fù)合語句,其中必須含有改變條件表達(dá)式值的語句。執(zhí)行順序先判斷表達(dá)式的值,若為true時,執(zhí)行語句。算法的基本控制結(jié)構(gòu)24do-while語句一般形式do語句while(表達(dá)式)可以是復(fù)合語句,其中必須含有改變條件表達(dá)式值的語句。執(zhí)行順序先執(zhí)行循環(huán)體語句,后判斷條件。

表達(dá)式為true時,繼續(xù)執(zhí)行循環(huán)體與while語句的比較:While語句執(zhí)行順序

先判斷表達(dá)式的值,為true時,再執(zhí)行語句算法的基本控制結(jié)構(gòu)25for語句語法形式for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句

循環(huán)前先求解為true時執(zhí)行循環(huán)體每次執(zhí)行完循環(huán)體后求解算法的基本控制結(jié)構(gòu)26枚舉類型—enum只要將需要的變量值一一列舉出來,便構(gòu)成了一個枚舉類型。枚舉類型的聲明形式如下:enum

枚舉類型名{變量值列表};例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};自定義數(shù)據(jù)類型例題1:運(yùn)算符+、=、*、>=中,優(yōu)先級最高的運(yùn)算符是(

)。A.+B.=C.*D.>=例題2:下列說法正確的是(

)。A.cout<<”\n”是一個語句,它能在屏幕上顯示”\n”B.\68代表的是字符D。C.1E+5的寫法正確,它表示余割整型常量。D.0x10相當(dāng)于020。D根據(jù)C++語言對運(yùn)算符優(yōu)先級的規(guī)則,以上運(yùn)算符優(yōu)先級從低到高的次序?yàn)?、>=、+、*。C分號是語句的已部分,且\n是轉(zhuǎn)義字符;\68代表了八進(jìn)制的6、8,而八進(jìn)制中沒有數(shù)字8;1E+5是實(shí)型常量;十六進(jìn)制的10相當(dāng)于十進(jìn)制的16,相當(dāng)于八進(jìn)制的20。例題3:下列不合法的變量名為(

)。A.intB.int1C.name_1D.Name0例題4:已知a=4,b=6,c=8,d=9,則“(a++,b>a++&&c>d)?++d:a<b”值為(

)。A.9B.6C.8D.0填空題例題5:如果s是int型變量,且s=6,則下面s%2+(s+1)%2表達(dá)式的值為____。課后:2-23、2-24*A根據(jù)變量名命名要求,變量名只能由大小寫字母、數(shù)字、下劃線組成,且系統(tǒng)關(guān)鍵字不能作為變量名。D1%運(yùn)算符是求余運(yùn)算,得到的結(jié)果是相除后的余數(shù)。表達(dá)式轉(zhuǎn)換為6%2+(6+1)%2=0+7%2=1第三章函數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)A30本章主要內(nèi)容函數(shù)的聲明和調(diào)用函數(shù)間的參數(shù)傳遞內(nèi)聯(lián)函數(shù)帶默認(rèn)形參值的函數(shù)函數(shù)重載C++系統(tǒng)函數(shù)31函數(shù)定義的語法形式類型標(biāo)識符函數(shù)名(形式參數(shù)表){

語句序列}函數(shù)的聲明與使用是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若無返回值,則為無參函數(shù),寫Void函數(shù)的定義voidprintstar(void){……}有參還是無參?32遞歸調(diào)用函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。遞歸過程的兩個階段:遞推:

4!=4×3!→3!=3×2!→2!=2×1!→1!=1×0!→0!=1未知已知回歸:4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1未知已知函數(shù)的聲明與使用33例3-8求n!分析:計(jì)算n!的公式如下:這是一個遞歸形式的公式,應(yīng)該用遞歸函數(shù)實(shí)現(xiàn)。函數(shù)的聲明與使用源程序:#include<iostream>usingnamespacestd;longfac(intn){longf;if(n<0)

cout<<"n<0,dataerror!"<<endl;

elseif(n==0)f=1;elsef=fac(n-1)*n;

return(f);}34intmain(){longfac(intn);

intn;longy;

cout<<"Enterapositiveinteger:";

cin>>n;y=fac(n);

cout<<n<<"!="<<y<<endl;}運(yùn)行結(jié)果:Enterapositiveinteger:88!=403203536函數(shù)的參數(shù)傳遞機(jī)制

——傳遞參數(shù)值在函數(shù)被調(diào)用時才分配形參的存儲單元。實(shí)參可以是常量、變量或表達(dá)式。實(shí)參類型必須與形參相符。傳遞時是傳遞參數(shù)值,即單向傳遞。函數(shù)的聲明與使用37例3-12輸入兩個整數(shù)交換后輸出#include<iostream>usingnamespacestd;voidSwap(int&a,int&b);intmain(){ intx(5),y(10);

cout<<"x="<<x<<"y="<<y<<endl;

Swap(x,y);

cout<<"x="<<x<<"y="<<y<<endl; return0;}voidSwap(int&a,int&b){ intt; t=a; a=b; b=t;}函數(shù)的聲明與使用運(yùn)行結(jié)果:x=5y=10x=10y=538內(nèi)聯(lián)函數(shù)聲明與使用聲明時使用關(guān)鍵字inline。編譯時在調(diào)用處用函數(shù)體進(jìn)行替換,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。對內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口聲明。內(nèi)聯(lián)函數(shù)39默認(rèn)形參值的說明次序默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時實(shí)參取代形參是從左向右的順序。例:int

add(int

x,inty=5,intz=6);//正確int

add(intx=1,inty=5,intz);//錯誤int

add(intx=1,inty,intz=6);//錯誤帶默認(rèn)形參值的函數(shù)40重載函數(shù)的聲明C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。方便使用,便于記憶。例:形參類型不同int

add(int

x,inty);floatadd(float

x,floaty);形參個數(shù)不同int

add(int

x,inty);int

add(int

x,int

y,intz);

函數(shù)重載41注意事項(xiàng)不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果的誤解、混淆。這樣不好:int

add(int

x,int

y);int

add(int

a,int

b);編譯器不以形參名來區(qū)分int

add(int

x,inty);voidadd(int

x,inty);編譯器不以返回值來區(qū)分int

add(int

x,inty){returnx+y;}floatadd(float

x,floaty){returnx-y;}

函數(shù)重載重載函數(shù)的形參必須不同:個數(shù)不同或類型不同。編譯程序?qū)⒏鶕?jù)實(shí)參和形參的類型及個數(shù)的最佳匹配來選擇調(diào)用哪一個函數(shù)。例1:以下敘述正確的是_。A.建立內(nèi)聯(lián)函數(shù)的主要目的是提高程序的執(zhí)行效率B.建立內(nèi)聯(lián)函數(shù)的主要目的是減少程序文件所占用的內(nèi)存C.內(nèi)聯(lián)函數(shù)的參數(shù)傳遞關(guān)系與一般函數(shù)的參數(shù)傳遞關(guān)系不同D.任意函數(shù)均可定義成為內(nèi)聯(lián)函數(shù)解:內(nèi)聯(lián)函數(shù)是使用更多的存儲空間,減少執(zhí)行時間,即采用空間換取時間,以提高程序執(zhí)行效率,當(dāng)多次調(diào)用同一內(nèi)聯(lián)函數(shù)時,程序會增大占用空間。除了在函數(shù)體內(nèi)含有循環(huán)語句、swich語句的函數(shù)和遞歸函數(shù)不能定義為內(nèi)聯(lián)函數(shù)以外,其余均可定義成內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)參數(shù)傳遞關(guān)系與一般的函數(shù)相同。A例2:下面程序的輸出結(jié)果為_#include<iostream.h>f(inta){intb=0;staticintc=3;b++;c++;return(a+b+c);}voidmain(){inta=2,I;for(I=0;I<3;I++)cout<<f(a)<<endl;}AA.7B.7C.7D.7

8

710

9

9

71311注:靜態(tài)局部變量c的特點(diǎn):在編譯時候只賦一次初值,以后每次調(diào)用函數(shù)時不再重新賦初值而是保留上次函數(shù)調(diào)用結(jié)束時的值例3:關(guān)于函數(shù)的聲明和定義正確的是_A.函數(shù)的聲明是必須的,只有這樣才能保證編譯系統(tǒng)對調(diào)用表達(dá)式和函數(shù)之間的參數(shù)進(jìn)行檢測,以確保參數(shù)的傳遞正確B.函數(shù)的定義和聲明可以合二為一,可以只有函數(shù)定義即可C.函數(shù)在聲明時,其參數(shù)標(biāo)識符可省略,但參數(shù)的類型、個數(shù)與順序不能省略D.函數(shù)的存儲類型為外部型,所以可以在其他函數(shù)中被調(diào)用,它在定義時象其他外部變量一樣,可以在其他函數(shù)內(nèi)定義解:函數(shù)的聲明并非必須,可以只要函數(shù)定義而不要聲明,但要注意符合一定條件,函數(shù)不可嵌套定義。C3-15編寫遞歸函數(shù)GetPower(intx,inty)計(jì)算x的y次冪,在主程序中實(shí)現(xiàn)輸入輸出。

解:源程序:#include<iostream.h>longGetPower(intx,inty);intmain(){intnumber,power;longanswer;cout<<"Enteranumber:";cin>>number;cout<<"Towhatpower?";cin>>power;answer=GetPower(number,power);cout<<number<<"tothe"<<power<<"thpoweris"<<answer<<endl;return0;}longGetPower(intx,inty){if(y==1)returnx;elsereturn(x*GetPower(x,y-1));}程序運(yùn)行輸出:Enteranumber:3Towhatpower?43tothe4thpoweris81第四章類與對象面向?qū)ο蟪绦蛟O(shè)計(jì)A

本章主要內(nèi)容4.1面向?qū)ο蟮乃枷耄矗睴OP的基本特點(diǎn)4.3類與對象4.4構(gòu)造函數(shù)與析構(gòu)函數(shù)4.5類的組合4.6類模板4.7面向?qū)ο髽?biāo)記4.3.1類的聲明形式

類是一種用戶自定義類型,聲明形式:class類名稱{public:

公有成員(外部接口)

private:

私有成員

protected:

保護(hù)型成員}類的成員classClock{public:

voidSetTime(int

NewH,int

NewM,

int

NewS);

voidShowTime();private:

int

Hour,Minute,Second;};成員數(shù)據(jù)成員函數(shù)4.3.4對象類的對象是該類的某一特定實(shí)體,即類類型的變量。聲明形式:

類名對象名;例:

ClockmyClock;類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問

public

屬性的成員構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個缺省形式的構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶缺省形參值的函數(shù)4.4構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)--由于類的封裝性,不能象普通變量一樣初始化

structSavings

{unsignedaccountNumber;

floatbalance;

};

SavingsA={1,2000.0};

SavingsB(2,3000.0);構(gòu)造函數(shù)舉例classClock{public:

Clock(int

NewH,int

NewM,int

NewS);//構(gòu)造函數(shù)

voidSetTime(int

NewH,int

NewM,int

NewS); voidShowTime();private:

int

Hour,Minute,Second;};構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(int

NewH,int

NewM,int

NewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對象時構(gòu)造函數(shù)的作用:voidmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。

c.ShowTime();}4.4.2拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。

作用:使用一個對象(參數(shù)指定的對象),去初始化一個正在被建立的同類型對象class類名{public:

類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//拷貝構(gòu)造函數(shù)

...};類名::類名(類名&對象名)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){函數(shù)體}例4-2拷貝構(gòu)造函數(shù)舉例(1)當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用它實(shí)現(xiàn)拷貝賦值。voidmain(void){PointA(1,2);PointB(A);//拷貝構(gòu)造函數(shù)被調(diào)用

cout<<B.GetX()<<endl;}拷貝構(gòu)造函數(shù)舉例(例4-2)

(2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實(shí)參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:voidfun1(Pointp){cout<<p.GetX()<<endl;}voidmain(){PointA(1,2);fun1(A);//調(diào)用拷貝構(gòu)造函數(shù)}

拷貝構(gòu)造函數(shù)舉例(例4-2)(3)當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Pointfun2(){PointA(1,2);returnA;//調(diào)用拷貝構(gòu)造函數(shù)}voidmain(){PointB;B=fun2();}4.4.3析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個缺省的析構(gòu)函數(shù)。組合的概念類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延械某橄蟮幕A(chǔ)上實(shí)現(xiàn)更復(fù)雜的抽象。4.5類的組合通過對復(fù)雜對象進(jìn)行分解、抽象,使我們能夠?qū)⒁粋€復(fù)雜對象理解為簡單對象的組合。分解得到復(fù)雜對象的部件對象,這些部件對象比它高層的復(fù)雜對象更容易理解和實(shí)現(xiàn)。然后由這些部件對象來“裝配”復(fù)雜對象。類組合的構(gòu)造函數(shù)設(shè)計(jì)原則:不僅要負(fù)責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。聲明形式:類名::類名(對象成員所需的形參,本類成員形參)

:對象1(參數(shù)),對象2(參數(shù)),{本類初始化}Point(intxx=0,intyy=0){x=xx;y=yy;}Distance::Distance(Point

a,Point

b,doublep):p1(a),p2(b){doublex=double(p1.GetX()-p2.GetX());doubley=double(p1.GetY()-p2.GetY());dist=sqrt(x*x+y*y);price=p;}4.6類模板template<模板參數(shù)表>類聲明使用類模板使用戶可以為類聲明一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值,能取任意類型(包括系統(tǒng)預(yù)定義的和用戶自定義的)。定義一個類模板與定義函數(shù)模板的格式類似,必須以關(guān)鍵字template開始,后面是尖括號括起來的模板參數(shù),然后是類名,其格式如下:

template<classType>class類名{

//...

};其中template是一個聲明模板的關(guān)鍵字,它表示聲明一個模板。關(guān)鍵字class表明后面的Type是模板參數(shù)。類模板Store<T>模板類Store<int>模板類Store<Student>模板類Store<double>實(shí)例化實(shí)例化4-14定義一個tree類,有成員ages,成員函數(shù)grow(intyears)對ages加上years,age()顯示tree對象的ages的值。解:#include<iostream.h>classTree{intages;public:Tree(intn=0);~Tree();voidgrow(intyears);voidage();};Tree::Tree(intn){ages=n;}Tree::~Tree(){age();}voidTree::grow(intyears){ages+=years;}voidTree::age(){cout<<"這棵樹的年齡為"<<ages<<endl;}voidmain(){Treet(12);t.age();t.grow(4);}程序運(yùn)行輸出:這棵樹的年齡為12這棵樹的年齡為16第五章

數(shù)據(jù)的共享與保護(hù)面向?qū)ο蟪绦蛟O(shè)計(jì)A

本章主要內(nèi)容作用域與可見性對象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員共享數(shù)據(jù)的保護(hù)友元編譯預(yù)處理命令多文件結(jié)構(gòu)和工程5.2對象的生存期對象從產(chǎn)生到結(jié)束的這段時間就是它的生存期。在對象生存期內(nèi),對象將保持它的值,直到被更新為止。5.2.1靜態(tài)生存期這種生存期與程序的運(yùn)行期相同。在文件作用域中聲明的對象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對象,要冠以關(guān)鍵字static

。例:staticinti;#include<iostream.h>int

i=5;//文件作用域intmain(){

cout<<"i="<<i<<endl;return0;}i具有靜態(tài)生存期例#include<iostream.h>//文件作用域intmain(){staticint

i=5;

cout<<"i="<<i<<endl;return0;}i具有靜態(tài)生存期5.2.2動態(tài)生存期塊作用域中聲明的對象是動態(tài)生存期的對象(習(xí)慣稱局部生存期對象)。開始于程序執(zhí)行到聲明點(diǎn)時,結(jié)束于命名該標(biāo)識符的作用域結(jié)束處。#include<iostream.h>voidfun();voidmain(){fun();fun();}voidfun(){static

int

a=1;

int

i=5;

a++;

i++;

cout<<"i="<<i<<",a="<<a<<endl;}運(yùn)行結(jié)果:i=6,a=2i=6,a=3i是動態(tài)生存期a是靜態(tài)生存期例5.4靜態(tài)成員全局對象不好,但復(fù)雜程序都是由許多程序員共同設(shè)計(jì)的,因此需要這種性質(zhì)的對象。使用類中的靜態(tài)數(shù)據(jù)成員——解決訪問權(quán)限控制問題。classemployee{private:

int

EmpNo;

intID;char*name;……}如:需統(tǒng)計(jì)雇員總數(shù),數(shù)據(jù)存放在什么地方?

一個類的所有對象具有相同的屬性。屬性值不同。類屬性;描述類的所有對象的共同特征的一個數(shù)據(jù)項(xiàng),對于任何對象實(shí)例。它的屬性值是相同的靜態(tài)數(shù)據(jù)成員用關(guān)鍵字static聲明該類的所有對象維護(hù)該成員的同一個拷貝必須在類外定義和初始化,用(::)來指明所屬的類。例5-4具有靜態(tài)數(shù)據(jù)成員的Point類#include<iostream.h>classPoint {public:

Point(intxx=0,int

yy=0){X=xx;Y=yy;countP++;}

Point(Point&p);

int

GetX(){returnX;}

int

GetY(){returnY;} voidGetC(){cout<<"Objectid="<<countP<<endl;}private:

intX,Y;

staticint

countP;統(tǒng)計(jì)對象的個數(shù)};Point::Point(Point&p){ X=p.X; Y=p.Y;

countP++;}int

Point::countP=0;voidmain() { PointA(4,5);

cout<<"PointA,"<<A.GetX()<<","<<A.GetY();

A.GetC(); PointB(A);

cout<<"PointB,"<<B.GetX()<<","<<B.GetY();

B.GetC(); }在類的聲明中僅僅對靜態(tài)數(shù)據(jù)成員進(jìn)行引用性說明,必須在文件作用域的某個地方使用類名限定進(jìn)行定義性說明,這時也可初始化。注意(1)用類名初始化(2)訪問控制屬性友元是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機(jī)制。通過將一個模塊聲明為另一個模塊的友元,一個模塊能夠引用到另一個模塊中本是被隱藏的信息??梢允褂糜言瘮?shù)和友元類。為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議盡量不使用或少使用友元。友元5.5.1友元函數(shù)友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù),在它的函數(shù)體中能夠通過對象名訪問private和protected成員作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。訪問對象中的成員必須通過對象名。5.5.2友元類若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員。聲明語法:將友元類名在另一個類中使用friend修飾說明。例2:classA{public:

voidDisplay(){cout<<x<<endl;}private:

intx;}classB{public:voidSet(inti);voidDisplay();private:

Aa;};friendclassB;voidB::Set(inti){a.x=i;}常類型

常類型的對象必須進(jìn)行初始化,而且不能被更新。常引用:被引用的對象不能被更新。const類型說明符&引用名常對象:必須進(jìn)行初始化,不能被更新。類名const對象名常數(shù)組:數(shù)組元素不能被更新(下一章介紹)。類型說明符const數(shù)組名[大小]...常指針:指向常量的指針(下一章介紹)。5.6共享數(shù)據(jù)的保護(hù)#include<iostream.h>voiddisplay(constdouble&r);intmain(){doubled=9.5;

display(d);return0;}voiddisplay(constdouble&r)//常引用做形參,在函數(shù)中不能更新r所引用的對象。{cout<<r<<endl;}例5-7常引用做形參5.6.1常引用:被引用的對象不能被更新。const類型說明符&引用名classA{public:

A(int

i,intj){x=i;y=j;}...private:

int

x,y;};Aconst

a(3,4);//a是常對象,不能被更新5.6.2常對象必須進(jìn)行初始化,不能被更新。

類名const對象名5.6.3用const修飾的對象成員1、常成員函數(shù)使用const關(guān)鍵字說明的函數(shù)。常成員函數(shù)不更新對象的數(shù)據(jù)成員。常成員函數(shù)說明格式:

類型說明符函數(shù)名(參數(shù)表)const;

這里,const是函數(shù)類型的一個組成部分,因此在實(shí)現(xiàn)部分也要帶const關(guān)鍵字。const關(guān)鍵字可以被用于參與對重載函數(shù)的區(qū)分通過常對象只能調(diào)用它的常成員函數(shù),其它成員函數(shù)不能調(diào)用。2、常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員。多文件問題//main.cpp#include”file1.h”#include”file2.h”voidmain(){….}//file1.h#include”head.h”….//file2.h#include”head.h”….//head.hclasspoint{….}//head.h#ifndefHEAD_H#defineHEAD_Hclasspoint{….}#endif5-3下面的程序的運(yùn)行結(jié)果是什么,實(shí)際運(yùn)行一下,看看與你的設(shè)想有何不同。#include<iostream.h>voidmyFunction();intx=5,y=7;intmain(){cout<<"xfrommain:"<<x<<"\n";cout<<"yfrommain:"<<y<<"\n\n";myFunction();cout<<"BackfrommyFunction!\n\n";cout<<"xfrommain:"<<x<<"\n";cout<<"yfrommain:"<<y<<"\n";return0;}voidmyFunction(){inty=10;cout<<"xfrommyFunction:"<<x<<"\n";cout<<"yfrommyFunction:"<<y<<"\n\n";}xfrommain:5yfrommain:7xfrommyFunction:5yfrommyFunction:10BackfrommyFunction!xfrommain:5yfrommain:7第六章

數(shù)組與指針面向?qū)ο蟪绦蛟O(shè)計(jì)A

本章主要內(nèi)容6.1數(shù)組6.2指針6.3動態(tài)存儲分配6.4字符串指針小結(jié)指針變量可以指向任何類型的對象,它指向數(shù)組、結(jié)構(gòu)、函數(shù),數(shù)組的數(shù)組元素,結(jié)構(gòu)的成員,函數(shù)的參數(shù)也都可以是指針類型。理解和構(gòu)造多種說明符:先撇開標(biāo)識符,按從右到左的順序逐個解釋每個說明符,如果有括號改變解釋的先后,先解釋括號內(nèi)再解釋括號外。例:int*p[5];5個元素的數(shù)組,每個元素為一指針,指針指向整型。即P為指針數(shù)組有5個整型指針的數(shù)組。int(*p)[5];是一個指針,指向含有5個元素的數(shù)組,每個元素是整型,P為指向含有5個整型數(shù)的數(shù)組指針。例:inti,*ip,f();*fp(),(*pf)(),*(*fp)();inta[5],*ap[5],(*pa)[5];i:整型ip:指向整型的指針f:返回值為整型的函數(shù)fp:返回整型指針的函數(shù),fp返回的是一個指向整型變量的指針pf:指向函數(shù)的指針,此函數(shù)返回整型pfp:指向函數(shù)的指針,此函數(shù)返回整型指針a:含5個整型元素的數(shù)組ap:指針數(shù)組,每個元素是指向整型的指針pa:指向整型數(shù)組的指針,該數(shù)組有5個整型的元素6.7動態(tài)內(nèi)存分配動態(tài)申請內(nèi)存操作符newnew類型名T(初值列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存。失?。?(NULL)釋放內(nèi)存操作符deletedelete指針P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。動態(tài)分配數(shù)組時應(yīng)注意:用new創(chuàng)建多維數(shù)組:new類型名T[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]…;如果內(nèi)存申請成功,new運(yùn)算返回一個指向新分配內(nèi)存首地址的指針,是一個T類型的數(shù)組,數(shù)組元素的個數(shù)為除最左邊一維外各位下標(biāo)表達(dá)式的乘積。例如:char(*fp)[3];fp=newchar[2][3];6.8用字符數(shù)組存儲和處理字符串字符數(shù)組的聲明和引用例:staticcharstr[8]={112,114,111,103,114,97,109,0};

staticcharstr[8]={'p','r','o','g','r','a','m','\0'};

staticcharstr[8]="program";

staticcharstr[]="program";字符串字符串常量,例如:"china"沒有字符串變量,用字符數(shù)組來存放字符串字符串以'\0'為結(jié)束標(biāo)志字符數(shù)組的初始化例6-19例6-20整行輸入字符串cin.getline(字符數(shù)組名St,字符個數(shù)N,結(jié)束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結(jié)束符(缺省為'\n')。讀入的字符串存放于字符數(shù)組St中。讀取但不存儲結(jié)束符。cin.get(字符數(shù)組名St,字符個數(shù)N,結(jié)束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結(jié)束符(缺省為'\n')。讀入的字符串存放于字符數(shù)組St中。

既不讀取也不存儲結(jié)束符。字符串處理函數(shù)strcat(連接),strcpy(復(fù)制),

strcmp(比較),strlen(求長度),

strlwr(轉(zhuǎn)換為小寫),

strupr(轉(zhuǎn)換為大寫)頭文件<string.h>6-26編寫一個矩陣轉(zhuǎn)置的函數(shù),矩陣的行數(shù)和列數(shù)在程序中由用戶輸入。

#include<iostream.h>voidmove(int*matrix1,int

m,intn){inti,j,k;Int*matrix2=newint[n*m];for(i=0;i<n;i++)for(j=0;j<m;j++){*(matrix2+i*m+j)=*(matrix1+j*m+i);cout<<*(matrix2+i*m+j)<<““;}cout<<endl;}voidmain(){intm,n,i,j;int*p;cout<<"請輸入矩陣的維數(shù):";cin>>m;cin>>n;p=newint[m*n];cout<<"輸入矩陣的元素"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cout<<"第"<<i+1<<"行第"<<j+1<<"個元素為:";cin>>p[i*m+j];}cout<<"輸入的矩陣的為:"<<endl;for(i=0;i<m;i++){for(j=0;j<n;j++)cout<<p[i*m+j]<<"";cout<<endl;}cout<<"轉(zhuǎn)置后的矩陣的為:"<<endl;move(p,m,n);Delete[]p;}第七章繼承與派生面向?qū)ο蟪绦蛟O(shè)計(jì)A

#include<iostream.h>classShape{public:Shape(){} ~Shape(){} virtualfloatGetArea(){return-1;}};classCircle:publicShape{public: Circle(floatradius):itsRadius(radius){} ~Circle(){} floatGetArea(){return3.14*itsRadius*itsRadius;}private: floatitsRadius;};7_5定義一個Shape基類,在此基礎(chǔ)上派生出Rectangle和Circle,二者都有GetArea()函數(shù)計(jì)算對象的面積。使用Rectangle類創(chuàng)建一個派生類Square。classRectangle:publicShape{public: Rectangle(floatlen,float

idth):itsLength(len),itsWidth(width){}; ~Rectangle(){}; floatGetArea(){return

itsLength*itsWidth;} floatGetLength(){return

itsLength;} floatGetWidth(){return

itsWidth;}private: floatitsWidth; floatitsLength;};classSquare:publicRectangle{public: Square(floatlen); ~Square(){}};Square::Square(floatlen):Rectangle(len,len){}voidmain(){ Shape*sp; sp=newCircle(5);

cout<<"theareaoftheCircleis"<<sp->GetArea()<<endl; deletesp; sp=newRectangle(4,6);

cout<<"theareaoftheRectangleis"<<sp->GetArea()<<endl;deletesp; sp=newSquare(5);

cout<<"theareaoftheSquareis"<<sp->GetArea()<<endl; deletesp;}theareaoftheCircleis78.5theareaoftheRectangleis24theareaoftheSquareis25Pressanykeytocontinue第八章多態(tài)性面向?qū)ο蟪绦蛟O(shè)計(jì)A

8_6#include<iostream.h>classRectangle{public: Rectangle();

Rectangle(intwidth,intlength); ~Rectangle(){}

int

GetWidth()const{return

itsWidth;}

int

GetLength()const{return

itsLength;}private:

int

itsWidth;

int

itsLength;};Rectangle::Rectangle(){

itsWidth=5;

itsLength=10;}Rectangle::Rectangle(int

width,intlength){

itsWidth=width;

itsLength=length;}voidmain(){ RectangleRect1;

cout<<"Rect1width:“

<<Rect1.GetWidth()<<endl;

cout<<"Rect1length:“

<<Rect1.GetLength()<<endl;

int

aWidth,aLength;

cout<<"Enterawidth:";

cin>>aWidth;

cout<<"\nEnteralength:";

cin>>aLength; RectangleRect2(aWidth,aLength);

cout<<"\nRect2width:"

<<Rect2.GetWidth()<<endl;

cout<<"\nRect2length:"

<<Rect2.GetLength()<<endl;}Rect1width:5Rect1length:10Enterawidth:50Enteralength:60Rect2width:50Rect2length:60Pressanykeytocontinue第九章群體類面向?qū)ο蟪绦蛟O(shè)計(jì)A

9_1#include<iostream.h>#include"9_1.h"voidmain(){

intn; doubleAverScore,TotalScore=0;

cout<<"請輸入學(xué)生人數(shù)";

cin>>n; Array<float>Score(n); for(inti=0;i<n;i++) {

cout<<"請輸入第"<<i+1<<"個學(xué)生的課程A成績(0~100):";

cin>>Score[i];

TotalScore+=Score[i]; }

AverScore=TotalScore/n;

cout<<"平均成績?yōu)?<<AverScore<<endl;}第十章

群體數(shù)據(jù)的組織面向?qū)ο蟪绦蛟O(shè)計(jì)A

3.本程序采用縮小區(qū)間的方法實(shí)現(xiàn)排序。縮小區(qū)間的方法是每次在區(qū)間范圍內(nèi)找一最小數(shù)與最大數(shù),將最小數(shù)與最大數(shù)分別置于該區(qū)間的最前面和最后面,然后從區(qū)間中去掉此最前最后的兩元素,再重復(fù)上述的過程,直至區(qū)間長度<=1為止。#include<iostream.h>voidmain(){____(1)_____;int

a[n],max,min,i,j,imax,imin,k;for(i=0;i<n;i++)cin>>a[i];for(i=0;i<n/2;i++){imax=i; max=a[i]; imin=i; min=max;for(j=i+1;___(2)_____;j++)if(a[j]<min) { min=a[j]; imin=j; }else{ if(a[j]>max) { max=a[j]; imax=j; } }if(__3)____) { a[imin]=a[i];a[i]=min;

if(i==imax)___(4)____;}if(imax!=(n-i-1)) { a[imax]=a[n-i-1]; a[n-i-1]=max;}} for(i=0;i<n;i++)cout<<a[i]<<""; }

(1)constintn=10(2)j<n-i(3)i!=imin

(4)imax=imin

輸入想查找的數(shù)據(jù)12數(shù)據(jù)為:12345678910111213141516171819200-858993460191091910141312是第12個數(shù)據(jù)Pressanykeytocontinue}第十一章

流類庫與輸入/輸出面向?qū)ο蟪绦蛟O(shè)計(jì)A

#include<fstream.h>classdog{public:

dog(intweight,longdays) {itsWeight=weight;

itsNumberDaysAlive=days; } ~dog(){}

int

GetWeight()const{return

itsWeight;} voidSetWeight(int

weight){itsWeight=weight;} longGetDaysAlive()const{return

itsNumberDaysAlive;} voidSetDaysAlive(long

days){itsNumberDaysAlive=days;}private:

int

itsWeight; longitsNumberDaysAlive;};11_6intmain(){ charfileName[80];

cout<<"Pleaseenterthefilename:";

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論