自學(xué)考試c程序設(shè)計(jì)c筆記(1-5)_第1頁
自學(xué)考試c程序設(shè)計(jì)c筆記(1-5)_第2頁
自學(xué)考試c程序設(shè)計(jì)c筆記(1-5)_第3頁
自學(xué)考試c程序設(shè)計(jì)c筆記(1-5)_第4頁
自學(xué)考試c程序設(shè)計(jì)c筆記(1-5)_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第一章認(rèn)識C++的對象

§1.1初識C++的函數(shù)和對象

1、混合型函數(shù)

C++以.cpp為文件擴(kuò)展名,有且只有一個名為main的主函數(shù),因保留了這

個面向過程的主函數(shù),所以被稱為混合型語言。

2、注釋方式

①從“/*”開始,到“*/”結(jié)束,如:/*...*/

②從開始到本行結(jié)束,如://……

3、輸入輸出對象

①提取操作:用提取操作符“>>”從cin輸入流中提取字符,如:cin?a.x;

②插入操作:用插入操作符“<<”向cout輸出流中插入字符,如:cout<<“we”;

cout?endl;

③使用標(biāo)準(zhǔn)輸入(鍵盤輸入)cin及標(biāo)準(zhǔn)輸出(屏幕輸出)cout前,要在主函數(shù)

前使用#include<iostream>將C++標(biāo)準(zhǔn)輸入輸出庫頭文件iostream將其包

括。

④換行操作:用語句coutCCendl;或cout<<“\n";實(shí)現(xiàn),其中endl可以插在

流的中間。

如:cout?a.x?endl?a.y<<endl;

4、使用命名空間

C++相比C而言,可以省略“.h”標(biāo)識頭文件,但必須使用語句using

namespacestd;來讓命名空間中的對象名稱曝光。因此一般的程序都要具有下

面的兩條語句:

#include<iostream>//包含頭文件

usingnamespacestd;〃使用命名空間

注意C++庫中代替C庫中頭文件的正確名稱,例如下面兩個語句效果一樣:

①#include<math.h>

②#include<cmath>

usingnamespacestd;

5、對象的定義和初始化

定義對象包括為它命名并賦予它數(shù)據(jù)類型,一般即使初值只用來表示該對象

尚未具有真正意義的值,也應(yīng)將每個對象初始化。

c++中利用構(gòu)造函數(shù)語法實(shí)現(xiàn)初始化,如:

Intz(0);〃等同于intz=0;

6、函數(shù)原型及其返回值

①c++使用變量和函數(shù)的基本規(guī)則都是:先聲明,后使用。變量有時也可邊聲

明邊使用,但必須聲明,否則出錯。

比如對函數(shù)的調(diào)用,要在主函數(shù)之前先對調(diào)用的函數(shù)進(jìn)行原型聲明,如:int

result(int,int);它向編譯系統(tǒng)聲明,后面有一個result函數(shù),該函數(shù)有

兩個整型類型的參數(shù),函數(shù)返回整型值。

函數(shù)聲明時,除了默認(rèn)參數(shù)(需給出默認(rèn)參數(shù)的默認(rèn)值)和內(nèi)聯(lián)函數(shù)(需給

出函數(shù)體及其內(nèi)語句)外,不需給出參數(shù)的變量名稱,如果給出,效果也一樣,

如:intresult(inta,intb);和上面的聲明效果一樣。

②除構(gòu)造函數(shù)與析構(gòu)函數(shù)外,函數(shù)都需要有類型聲明。

如intmain(),指出main是整數(shù)類型,返回值由return后面的表達(dá)式

決定,且表達(dá)式的值必須與聲明函數(shù)的類型一致。

如果函數(shù)確實(shí)不需要返回值,還可用void標(biāo)識,一旦使用void標(biāo)識,函數(shù)

體內(nèi)就不再需要使用return語句,否則會編譯出錯,但可使用return;語句。

③C++函數(shù)有庫函數(shù)(標(biāo)準(zhǔn)函數(shù),引用時函數(shù)名外加<>)和自定義函數(shù)(引用

時函數(shù)名外加“”)兩類。

7、const(常量)修飾符及預(yù)處理程序

①const修飾符:用于定義符號常量。

C中一般使用宏定義“#define”定義常量,而C++中除此外,建議使用

const代替宏定義,用關(guān)鍵字const修飾的標(biāo)識符稱為符號常量。

因const是放在語句定義之前的,因此可以進(jìn)行類型判別,這比用宏定義更

安全一些。如下面兩個語句是等同的,但是后者可以比前者避免一些很難發(fā)現(xiàn)的

錯誤。

#difineBOFSIZE100

constintBUFSIZE100;

常量定義也可使用構(gòu)造函數(shù)的初始化方法,如:

constintk(2);〃等同于constintk=2;

因被const修飾的變量的值在程序中不能被改變,所以在聲明符號常量時,

必須對符號常量進(jìn)行初始化,除非這個變量是用extern修飾的外部變量,如:

constintd;xconstintd=2;Mexternconstintd;M

const的用處不僅是在常量表達(dá)式中代替宏定義,如果一個變量在生存期內(nèi)

的值不會改變,就應(yīng)該用const來修飾這個變量,以提高程序安全性。

②預(yù)處理程序

C++的預(yù)處理程序不是C++編譯程序的一部分,它負(fù)責(zé)在編譯程序的其

他部分之前分析處理預(yù)處理語句,為與一般的C++語句區(qū)別,所有預(yù)處理語句

都以位于行首的符號“#”開始,作用是把所有出現(xiàn)的、被定義的名字全部替換

成對應(yīng)的“字符序列”。

預(yù)處理語句有三種:宏定義、文件包含(也成嵌入指令)和條件編譯。

文件包含是指一個程序把另一個指定文件的內(nèi)容包含進(jìn)來,書寫時可以使用

引號也可以使用尖括號,前者引用自己定義的包含文件,如:#include

"E:\prog\myfile.h",后者引用系統(tǒng)提供的包含文件,如標(biāo)準(zhǔn)輸入輸出是定義

在標(biāo)準(zhǔn)庫iostream中的,引用時要包括以下兩條語句:

#include<iostream>〃包含頭文件

usingnamespacestd;//使用命名空間

8、程序運(yùn)行結(jié)果

9、程序書寫格式

C++的格式和c一樣,都很自由,一行可以寫幾條語句,但也要注意以下

規(guī)則,增加可讀性:

①括號緊跟函數(shù)名后面,但在for和while后面,應(yīng)用一個空格與左括號隔

開;

②數(shù)學(xué)運(yùn)算符左右各留一個空格,以與表達(dá)式區(qū)別;

③在表示參數(shù)時,逗號后面留一個空格;

④在for、do…while和while語句中,合理使用縮進(jìn)、一對花括號和空行;

⑤適當(dāng)增加空行和程序注釋以增加可讀性;

⑥太長的程序分為兩行或幾行,并注意選取合適的分行和縮進(jìn)位置。

§1.2認(rèn)識C++面向過程編譯的特點(diǎn)

一、使用函數(shù)重載

c++允許為同一個函數(shù)定義幾個版本,從而使一個函數(shù)名具有多種功能,

這稱為函數(shù)重載。

假設(shè)有一個函數(shù)max,分別具有以下函數(shù)原型:

intmax(int,int);〃2個整型參數(shù)的函數(shù)原型

intmax(int,int,int);〃3個整型參數(shù)的函數(shù)原型

只要分別為不同參數(shù)的max編制相應(yīng)的函數(shù)體,就可以實(shí)現(xiàn)各自的功能。

二、新的基本數(shù)據(jù)類型及其注意事項(xiàng)

1、void是無類型標(biāo)識符,只能聲明函數(shù)的返回值類型,不能聲明變量。

2、C++還比C多了bool(布爾)型。

3、C++只限定int和short至少要有16位,而long至少32位,short不得

長于int,int不能長于long,VC++6.0規(guī)定int使用4字節(jié),這與C使用2

字節(jié)不同。

4、地址運(yùn)算符用來取對象存儲的首地址,對于數(shù)組,則數(shù)組名就是數(shù)組的

首地址。

如:intx=56;定義x,VC++6.0使用4個字節(jié)存儲對象56,假設(shè)存放的內(nèi)

存首地址用十六進(jìn)制表示為006AFDEC,則語句cout?&x;自動使用十六進(jìn)制輸

出存儲的首地址006AFDEC。

5、C++中的常量分三種,第一種為符號常量;第二種為整數(shù)常量,有4種類型,

分別為十進(jìn)制、長整型、八進(jìn)制、十六進(jìn)制,并用前綴和后綴進(jìn)行分類標(biāo)識;第

三種為浮點(diǎn)常量,有三種類型,分別為float型、longfloat型、double型,

并用后綴進(jìn)行分類識別。

符號常量

Cfloat型:后綴F(f),如3.2f、0.002f、52.48f

浮點(diǎn)常量\longfloat型:后綴L(l),如0.2L、4.5L、52.48L

常量<Idouble型:無后綴,如3.0、12.3、0.002

長整型:后綴L(1),如-456L、0L、2145857852L

整數(shù)常量I十進(jìn)制:無后綴,如-32、0、123

八進(jìn)制:前綴0(。),如0123、05、032737

、十六進(jìn)制:前綴OX(ox),如0x15,OxlA,Oxlf

16、C++與C一樣,也使用轉(zhuǎn)義序列。如:'\0'表示ASCII碼值為零的空字符

(NULL),'\101'表示字符A.

三、動態(tài)分配內(nèi)存

1、在使用指針時,如果不使用對象地址初始化指針,可以自己給它分配地址。

對于只存儲一個基本類型數(shù)據(jù)的指針,申請方式如下:

new類型名[size]〃申請可以存儲size個該數(shù)據(jù)類型的對象

不再使用時,必須使用delete指針名;來釋放已經(jīng)申請的存儲空間。

如:

double*p;〃聲明double型指針

p=newdouble[3]//分配3個double型數(shù)據(jù)的存儲空間

deletep;〃釋放已申請的存儲空間

2、C必須在可執(zhí)行語句之前集中聲明變量,而C++可以在使用對象時再聲明或

定義。

3、C++為結(jié)構(gòu)動態(tài)分配內(nèi)存一般格式為:

指針名=new結(jié)構(gòu)名;//分配

delete指針名;//釋放

例如給書中例1.1的Point結(jié)構(gòu)指針分配內(nèi)存:

p=newPoint;

當(dāng)不再使用這個空間時,必須使用deletep;釋放空間。

四、引用

1、引用簡單的說,就是為現(xiàn)有的對象起個別名,別名的地址與引用對象的

地址是一樣的。

引用的聲明方式為:數(shù)據(jù)類型&別名=對象名;,注意對象在引用前必

須先初始化,另外聲明中符號的位置無關(guān)緊要,比如int&a=x;、int&

a=x;和int&a=x;等效。

例:……

intx=56;〃定義并初始化x

int&a=x;〃聲明a是x的引用,二者地址相同

int&r=a;〃聲明r是a的引用,二者地址相同

r=25;〃改變r,則a和x都同步變化

2、所謂“引用”,就是將一個新標(biāo)識符和一塊已經(jīng)存在的存儲區(qū)域相關(guān)聯(lián)。

因此,使用引用時沒有分配新的存儲區(qū)域,它本身不是新的數(shù)據(jù)類型。

可以通過修改引用來修改原對象,但是不能有空引用,在程序中必須確保引

用是和一塊正確的存儲區(qū)域關(guān)聯(lián)。

引用通常用于函數(shù)的參數(shù)表中或作為函數(shù)的返回值。前者因?yàn)槭褂靡米鳛?/p>

函數(shù)參數(shù)不產(chǎn)生臨時對象,可提高程序執(zhí)行效率和安全性(§4.4.3),后者則是

因?yàn)橐米鳛楹瘮?shù)返回值可用于賦值運(yùn)算符的左邊。

3、引用實(shí)際上就是變量的別名,使用引用就如同直接使用變量一樣,引用

與變量名在使用的形式上完全一樣,引用只是作為一種標(biāo)識對象的手段。

但要注意,可以聲明指向變量或引用的指針,如:int*p=&x;M

int&a=x;int*p=&a;M;也可以聲明指針對指針的引用,如:int*&p2

=pl;M(式中pl、p2是指針,*聲明p2是指針,&聲明p2是pl的引用);

但不能聲明指針對變量的引用,如:int*&P=&x;x;不能聲明引用的引用,

如:int&&r=x;x;也不能直接聲明對數(shù)組的引用。

4、引用的作用與指針有相似之處,它會對內(nèi)存地址上存在的變量進(jìn)行修改,

但它不占用新的地址,從而節(jié)省開銷。二者除使用形式不同,本質(zhì)也不同:指針

是低級的直接操作內(nèi)存地址的機(jī)制,可由整型數(shù)強(qiáng)制類型轉(zhuǎn)換得到,功能強(qiáng)大但

易出錯;引用則是較高級的封裝了指針的特性,不直接操作內(nèi)存地址,不可由強(qiáng)

制類型轉(zhuǎn)換而得,安全性較高。

5、雖然不能直接定義對數(shù)組的引用,但可以通過typedef來間接的建立對

數(shù)組的引用。如:

typedefintarray[10];〃定義int型數(shù)組類型array

arraya={12,34,...);〃定義array型數(shù)組a

array&b=a;〃定義數(shù)組a的引用b

五、對指針使用const限定符

1、變量的指針、指向變量的指針變量、指針變量指向的變量

變量的指針就是變量的地址,存放變量地址的變量是指針變量,為了表示指

針變量和它所指向的變量之間的聯(lián)系,在程序中用“*”符號表示“指向”。例如

用P代表指針變量,來存放變量a所在的內(nèi)存地址,則*p代表指針變量指向的

變量,也就是變量a,且|下面等式成立

p=&a*p=*&a=a&*p=&a(*p)++=a++

2、左值和右值

左值是指某個對象的表達(dá)式,必須是可變的。左值表達(dá)式在賦值語句中即可

作為左操作數(shù),也可作為右操作數(shù),如:x=56;和丫=*;,而右值56就只能

作為右操作數(shù),不能作為左操作數(shù)。

某些運(yùn)算符如指針運(yùn)算符“*”和取首地址運(yùn)算符也可產(chǎn)生左值,例

如P是一個指針類型的表達(dá)式,則“*P”是左值表達(dá)式,代表由P指向的對象,

且可通過“*p=”改變這個對象的值;“&P”也是左值表達(dá)式,代表由P指向的

對象的首地址,且可通過“&p=”改變這個指針的指向。

3、指向常量的指針(constint*p=&x;"*p="的操作不成立)

指向常量的指針是在非常量指針聲明前面使用const,如:constint*p;,

它告訴編譯器,*p是常量,不能將*p作為左值進(jìn)行操作,即限定了“*p=”的

操作,所以稱為指向常量的指針。如:

constinty=58;

constint*pl=&y;〃指向常量的指針指向常量y,y不能作為左值

intx=45;

constint*p=&x;〃只能通過左值x間接改變*p的值

上式中*P不能作為左值,但可以通過“x=”改變X的值,間接改變*p的值,

即const僅是限制使用*P的方式,*P仍然可以作為右值使用,還可以通過運(yùn)算

符&改變指針?biāo)赶虻牡刂?,但不能改變指針?biāo)赶虻膬?nèi)存地址中的內(nèi)容。

4、常量指針(int*constp=&x;"p="的操作不成立)

把const限定符放在*號的右邊,就可使指針本身成為一個const,即常量

指針。如:

intx=5;

int*constp=&x;

式中的指針本身是常量,編譯器要求給它一個初始化值,這個值在指針的整

個生存期中都不會改變,編譯器把P看作常量地址,所以不能作為左值,即“P

=”不成立,也就是說不能改變指針P所指向的地址。但這個內(nèi)存地址里的內(nèi)容

可以使用間接引用運(yùn)算符*改變其值,例如語句*P=56;將上面的x的值改變

為56。

4、指向常量的常量指針

也可以聲明指針本身和所指向的對象都不能改變的“指向常量的常量指針”,

這時必須要初始化指針。如:

intx=2;

constint*constp=&x;

語句告訴編譯器,*p和p都是常量,都不能作為左值,即“*p="和“p=”

兩操作均不成立,這種指針限制和“*”運(yùn)算符,在實(shí)際中很少用。

六、泛型算法應(yīng)用于普通數(shù)組

1、數(shù)組中元素及位置的關(guān)系

如inta[]={5,6,7,8);

則數(shù)組中各元素分別為:a[0]=5,a[1]=6,a[2]=7,a[3]=8.a為數(shù)組

的起始地址,各元素的位置分別是:a+1位置為5,a+2位置為6,a+3位置

為7,a+4位置為8。對數(shù)組按元素位置進(jìn)行操作時,不包括起始位置,如:語

句sort(a+1,a+4);,只對從a+1位置(不含a+1位置的元素)起到a

+4位置(含a+4位置的元素)為止的各元素進(jìn)行操作,即a+2,a+3,a+4

三個位置上的三個元素,而不是a+1~a+4四個位置上的所有4個元素。

注意式中的a+1并不是地址a加上一個字節(jié)后的地址,而是a+1xd得到

的地址,其中d是元素類型占用的字節(jié)數(shù),比如C++中整型數(shù)占用4個字節(jié),

則a+1位置上元素的地址就是地址a加上4個字節(jié)后得到的地址。

2、數(shù)組不能作為整體輸出,C++引入STL庫提供的泛型算法,大大簡化數(shù)

組操作。所謂泛型算法,就是提供的操作與元素的類型無關(guān)。

3、對數(shù)組內(nèi)容進(jìn)行升嘉、輸出、反轉(zhuǎn)和復(fù)制等操作需要包含頭文件

<algorithm>;對數(shù)組內(nèi)容進(jìn)行降嘉和檢索等操作需要包含頭文件〈functional〉。

4、假設(shè)一維數(shù)組a和b的長度均為Len,數(shù)據(jù)類型為Type,則對數(shù)組內(nèi)容

的相關(guān)操作和語句如下:

①數(shù)據(jù)內(nèi)容反轉(zhuǎn):

reverse(a,a+Len);〃數(shù)組元素反轉(zhuǎn)排列

②復(fù)制數(shù)組內(nèi)容:

copy(a,a+Len,b);〃將數(shù)組a的內(nèi)容原樣復(fù)制到數(shù)組b

reverse-copy(a,a+Len,b);〃逆向復(fù)制數(shù)組a中內(nèi)容到數(shù)組b

③數(shù)組升嘉排序:

sort(a,a+Len);〃默認(rèn)排序方式是升嘉

④數(shù)組降嘉排序:

sort(b,b+Len,greater<Type>());〃數(shù)組降嘉■排序

⑤檢索查找數(shù)組內(nèi)容:

find(a,a+Len,value);//查找數(shù)組a中是否存在值為value的元素

find函數(shù)返回的是位置指針,一般使用判別語句輸出查找的內(nèi)容,如:

Type*x=find(a,a+Len,value);〃x是類型為type的指針

if(x==a+Len)cout<<“沒有值為value的數(shù)組元素”;

elsecout?"有值為va1ue的數(shù)組元素”;

⑥輸出數(shù)組的內(nèi)容

copy(a,a+Len,ostream.iterator<Type>(cout,"字符串"));

可將ostreani-iterator簡單理解為輸出流操作符,<Type>表示數(shù)組元素的數(shù)據(jù)

類型,本語句將數(shù)組內(nèi)容按正向送往屏幕,輸出方式是將每個元素與“字符串”

的內(nèi)容組合在一起連續(xù)輸出。如果使用空格"”或換行符“\n”,可以按格式輸

出。也可將數(shù)組內(nèi)容按逆向方式送往屏幕,語句為:

reverse-copy(a,a+Len,ostream.iterator<Type>(cout,"字符串"));

‘反轉(zhuǎn):reverse

關(guān)復(fù)制:copy,reverse-copy(逆向復(fù)制)

鍵<排序:sort(默認(rèn)升嘉,尾部加greater<Type>()為降事)

字檢索:find

、輸出:copy(尾部必須加ostreamiterator〈Yype>(cout,"字符串"))

七、數(shù)據(jù)的簡單輸入輸出格式

1、C++提供了兩種格式控制方式,一種是使用iso.base類提供的接口,

另一種是使用一種稱為操控符的特殊函數(shù),操控符的特點(diǎn)是可直接包含在輸入和

輸出表達(dá)式中,因此更為方便,不帶形式參數(shù)的操控符定義在頭文件<iostream>

中,帶形式參數(shù)的操控符定義在頭文件<iomanip>中。

在使用操控符時,一是要正確包含它們,二是只有與符號“<<”或“>>”連

接時才起作用,三是無參數(shù)的操控符函數(shù)不能帶有“()”號。

2、常用操控符及其作用

格式含義作用

dec設(shè)置轉(zhuǎn)換基數(shù)為十進(jìn)制輸入/輸出

oct設(shè)置轉(zhuǎn)換基數(shù)為八進(jìn)制輸入/輸出

hex設(shè)置轉(zhuǎn)換技術(shù)為十六進(jìn)制輸入/輸出

endl輸出一個換行符并刷新流輸出

Setprecision(n)設(shè)置浮點(diǎn)數(shù)輸出精度n輸出

Setw(n)設(shè)置輸出數(shù)據(jù)字段寬度輸出

Setfill('字符,)設(shè)置ch為填充字符輸出

Setiosflags(flag)設(shè)置flag指定的標(biāo)志位輸出

resetiosflags(flag)清除flag指定的標(biāo)志位輸出

上表中操控符使用時,后四個操控符必須包含頭文件<ionlanip》,其中后兩

個操控符的參數(shù)flag是引用C++的類ios_base里定義的枚舉常量,要使用限

定符“::”,下面的表中是幾個常用的ios_base定義的枚舉常量,另外flag可

由多個常量“或”起來使用,如:setiosflags(ios.base::showpointIios.

base::fixed)o

參數(shù)flag常引用的枚舉常量及其含義

常量名含義

ios.base::left輸出數(shù)據(jù)按輸出域左邊對齊輸出

ios.base::right輸出數(shù)據(jù)按輸出域右邊對齊輸出

ios.base::showpos在正數(shù)前添加一個“+”號

ios.base::showpoint浮點(diǎn)輸出時必須帶有一個小數(shù)點(diǎn)

ios.base::scientific使用科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù)

ios.base::fixed使用定點(diǎn)形式表示浮點(diǎn)數(shù)

3、操控符使用實(shí)例

①使用setw設(shè)置輸出寬度

#include<iostream>

#include<iomanip>

usingnamespacestd;

voidmain(){

cout<<setfi11('*')

<<setw(0)?15?endl

<<setw⑴?15?endl

<<setw(2)?15?endl

<<setw⑶?15?endl

<<setw(4)?15?endl;

cout<<setw(16)<<setfi11(4*0?"”<<endl;

cout<<setiosflags(ios_base::right)//設(shè)置標(biāo)志位

<<setw⑸?1

<<setw⑸?2

?setw(5)<<3;

cout<<resetiosflags(ios.base::right);//清除標(biāo)志位

cout<<setiosflags(ios.base::left)

<<setw⑸?1

<<setw(5)?2

<<setw(5)?3<<endl;}

程序輸出結(jié)果為:

15

15

15

*15

**15

****2****2****3

l****2****3****

如上所示,setw(n)只對在后面緊接著的那個元素有效;當(dāng)域?qū)抧比后面

要顯示元素的位數(shù)少時,則不起作用,即不影響顯示;使用填充字符時,n比后

面要顯示元素的位數(shù)大1時,才發(fā)生填充作用;要顯示15個“*”號,必須取n

=16,同時setfill后面使用“”才能全部填充為設(shè)定字符“*",否則將全部

填充為空格;如果在程序中使用了設(shè)置標(biāo)志,只有在清除設(shè)置標(biāo)志之后,才能進(jìn)

行新的設(shè)置。

②使用setprecition設(shè)置浮點(diǎn)數(shù)輸出精度

constdoublePI=3.141592;

voidmain(){

cout<<setprecition(0)?PI?endl

<<setprecition(1)?PI?endl

<<setprecition⑵?PI?endl

<<setprecition(3)?PI?endl

<<setprecition(7)?PI?endl;

程序輸出結(jié)果為:

3.14159

3

3.1

3.14

3.141592

注意使用setprecition(intn)設(shè)定顯示小數(shù)位數(shù)時,小數(shù)點(diǎn)本身也占1位,

。等于不設(shè),由系統(tǒng)決定(默認(rèn)為最多輸出5位小數(shù)),1代表顯示整數(shù)數(shù)字,2

才顯示小數(shù)點(diǎn)后面的一位數(shù)。因系統(tǒng)只輸出5位小數(shù),所以為了將6位小數(shù)全部

輸出,最后一行必須設(shè)置7位才行。

③使用dec、oct、hex設(shè)置轉(zhuǎn)換基數(shù)為不同進(jìn)制

intb=100;

cout<<,,Dec:,,<<dec?b<<endl//十進(jìn)制格式輸出

<<,,Hex:,,<<hex?b<<endl//十六進(jìn)制格式輸出

<<"Oct:,,<<oct<<b<<endl;〃八進(jìn)制格式輸出

cout<<b?endl

<<"Inputb=";

cin?b;〃輸入100

cout<<b?endl;

cout<<dec?setiosflags(ios-base::showpos)?b<<endl;

cout<<"Inputb=";

cin?b;〃輸入100

cout<<b?endl;

cout<<resetiosflags(ios.base::showpos);

cout<<b?endl;

程序輸出結(jié)果為:

Dec:100

Hex:164

Oct:144

144

Inputb=100〃輸入100

144〃因尚未轉(zhuǎn)換基數(shù),100仍按八進(jìn)制輸出

+100

Inputb=100〃輸入100

+100//已轉(zhuǎn)換基數(shù),將100按十進(jìn)制輸出

100〃清除flag指定的標(biāo)志位和正數(shù)前顯示的+號

如上面程序,程序執(zhí)行cout<〈oct語句后,將保持八進(jìn)制格式輸出,雖然輸

入100,但輸出仍按八進(jìn)制,只有使用cout?dec語句將其恢復(fù)為十進(jìn)制。使用

語句cout?dec<<setiosflags(ios.base::showpos)?b<<endl;除了將進(jìn)制恢

復(fù)為十進(jìn)制,還將輸出設(shè)置為在正的數(shù)字前面顯示“+”號,直到后面的語句使

用清除該設(shè)置標(biāo)志的語句cout?resetiosflags(ios.base::showpos);執(zhí)行,另

外如果單獨(dú)使用語句“resetiosflags(ios.base::showpos);"則不起作用。

§1.3程序的編輯、編譯和運(yùn)行的基本概念

1、C++程序編制過程

①先使用編輯器編輯一個C++程序mycpp.cpp,又稱其為C++的源程序;

②然后使用C++編譯器對這個C++程序進(jìn)行編譯,產(chǎn)生文件mycpp.obj;

③再使用連接程序(又稱Link),將mycpp.obj變成mycpp.exe文件。

2、C++程序編制環(huán)境及使用方法

現(xiàn)在C++的編制一般都使用集成環(huán)境,如VisualC++6.0等,所謂集成

環(huán)境,就是將C++語言的編輯、編譯、連接和運(yùn)行程序都集成到一個綜合環(huán)境

中。

利用VC編制C++程序源文件的步驟如下:

①啟動VC6.0;

②File菜單-New對話框-Project選項(xiàng)卡-Win32ConsoleApplication

選項(xiàng),在右邊的Projectname輸入框中輸入項(xiàng)目名稱myfile,在右邊的Location

輸入框中輸入存儲目錄,然后單擊0K按鍵,進(jìn)入Win32ConsoleApplication

制作向?qū)У牡谝徊剑庉婥++程序文件是選擇Anemptyproject選項(xiàng),單擊

Finish按鈕,完成設(shè)置;

③選中FileView選項(xiàng)卡,進(jìn)入空項(xiàng)目,單擊它展開樹形結(jié)構(gòu),選中myfile

files節(jié)點(diǎn);選中SourceFile標(biāo)記,再從File菜單中選new命令,彈出new

對話框;選中C++SourceFile選項(xiàng),在右方的File輸入框中輸入C++程序

文件名(mycpp),系統(tǒng)默認(rèn)的文件擴(kuò)展名為.cpp,單擊OK按鈕,返回集成環(huán)境,

并在SourceFile項(xiàng)下面產(chǎn)生空文件mycpp.cpp;在右邊的源代碼編輯框中輸入

源文件;

④部分Build菜單項(xiàng)描述

菜單項(xiàng)描述

Compile編譯源代碼窗口中的活動源文件

Build查看工程中所有文件,并對最近修改過的文件進(jìn)行編譯和鏈

RebuildAll對工程中的所有文件全部進(jìn)行重新編譯和連接

Clean刪除項(xiàng)目的中間文件和輸出文件

StartDebug彈出級聯(lián)菜單,主要包括有關(guān)程序調(diào)試的選項(xiàng)

Execute運(yùn)行應(yīng)用程序

第二章從結(jié)構(gòu)到類的演變

§2.1結(jié)構(gòu)的演化

一、結(jié)構(gòu)發(fā)生質(zhì)的演變

1、函數(shù)與數(shù)據(jù)共存

c++中首先允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)稱為成員函數(shù),形式如下:

struct結(jié)構(gòu)名(

數(shù)據(jù)成員

成員函數(shù)

可以像C語言中結(jié)構(gòu)變量使用結(jié)構(gòu)成員的方法那樣,通過C++的結(jié)構(gòu)對象

使用成員函數(shù),形式如下:

結(jié)構(gòu)對象.成員函數(shù)

2、封裝性

如果在定義結(jié)構(gòu)時,將數(shù)據(jù)成員使用private關(guān)鍵字定義,則產(chǎn)生封裝性,

沒有使用private定義的成員函數(shù),默認(rèn)為public。

要注意,私有的數(shù)據(jù)成員,必須通過公有的成員函數(shù)才能使用,而不能不通

過公有的成員函數(shù)直接來使用,否則就會出錯,這就稱為數(shù)據(jù)的封裝性。

二、使用構(gòu)造函數(shù)初始化結(jié)構(gòu)的對象

函數(shù)名與結(jié)構(gòu)同名,稱為構(gòu)造函數(shù),專門用于初始化結(jié)構(gòu)的對象,構(gòu)造函數(shù)

使用的一般形式為:

構(gòu)造函數(shù)名對象名(初始化參數(shù));

程序在運(yùn)行時,會自動完成初始化任務(wù)。

§2.2從結(jié)構(gòu)演變一個簡單的類

1、用關(guān)鍵字class代替struct,就是一個標(biāo)準(zhǔn)的類。

實(shí)例:

#include<iostream>

usingnamespacestd;

classPoint{〃定義類Point

private:

doublex,y;//類Point的數(shù)據(jù)成員

public:

Point()();|〃類Point的無參數(shù)構(gòu)造函數(shù)

Point(doublea,doubleb){x=a;y=b;}〃具有兩個參數(shù)的構(gòu)造函數(shù)

voidSeixy(doublea,doubleb)(x=a;y=b;}//成員函數(shù),用于重新設(shè)置數(shù)據(jù)成員

voidDisplay(){cout<<x<<"\t"<:<y<:<endl;}//成員函數(shù),按指定格式輸出數(shù)據(jù)成員

);

voidmain0{

Pointa;〃定義類Point的對象a

Pointb(18.5,10.6);|//定義類Point的對象b并初始化

a.Setxy(10.6,18.5);//為對象a的數(shù)據(jù)成員賦值

a.Display();〃顯示對象a的數(shù)據(jù)成員

b.Display0;〃顯示對象b的數(shù)據(jù)成員

)

程序運(yùn)行結(jié)果:

類名Point

10.618.5

具有的屬性x和y

18.510.6

提供的操作

2、類的示意圖

構(gòu)造函數(shù)Point

上例中的Point類可以看作直角坐標(biāo)系

用來給對象賦值

中的點(diǎn)類,其結(jié)構(gòu)示意圖如右:Setxy

用來輸出和

第一個方框中是類名;第二個方框中是Displayxy

坐標(biāo)點(diǎn)的數(shù)據(jù),稱為屬性(或稱數(shù)據(jù)成員);

第三個方框中表示類所提供的具體操作方法,實(shí)際上是如何使用數(shù)據(jù)x和y,以

實(shí)現(xiàn)預(yù)定功能的函數(shù),這里稱為成員函數(shù)。

§2.3面向過程與面向?qū)ο?/p>

1、面向過程的方法

所謂面向過程,就是不必了解計(jì)算機(jī)的內(nèi)部邏輯,而把精力集中在對如何求

解問題的算法邏輯和過程的描述上,通過編寫程序把解決問題的步驟告訴計(jì)算

機(jī)。

c語言就是面向過程的結(jié)構(gòu)化程序設(shè)計(jì)語言,其程序設(shè)計(jì)特點(diǎn)就是通過函數(shù)

設(shè)計(jì),實(shí)現(xiàn)程序功能的模塊化、結(jié)構(gòu)化。但實(shí)際工作中,盡管結(jié)構(gòu)化程序設(shè)計(jì)中

的分而治之的想法非常好,但在結(jié)構(gòu)化程序設(shè)計(jì)語言和結(jié)構(gòu)化程序設(shè)計(jì)方法下卻

難以貫徹到底,特別是在軟件規(guī)模在三四萬行以上時,開發(fā)和維護(hù)就十分困難。

2、面向?qū)ο蟮姆椒?/p>

為了解決面向過程的方法存在的問題,人們提出了面向?qū)ο蟮姆椒?。所謂對

象,就是現(xiàn)實(shí)世界中客觀存在的事務(wù)。相對于過程,對象是穩(wěn)定的,復(fù)雜的對象

可由簡單的對象組成,對象各自完成特定的功能。

在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以將一組密切相關(guān)的函數(shù)統(tǒng)一封裝在一個對象

中,從而合理而又有效的避免全局變量的使用,更徹底的實(shí)現(xiàn)了結(jié)構(gòu)化程序設(shè)計(jì)

的思想。

結(jié)構(gòu)化程序設(shè)計(jì)使用的是功能抽象,而面向?qū)ο蟪绦蛟O(shè)計(jì)不僅能進(jìn)行功能抽

象,還能進(jìn)行數(shù)據(jù)抽象,“對象”實(shí)際上是功能抽象和數(shù)據(jù)抽象的統(tǒng)一。

面向?qū)ο蟮某绦蛟O(shè)計(jì)方法不是以函數(shù)過程和數(shù)據(jù)結(jié)構(gòu)為中心,而是以對象代

表來求解問題的中心環(huán)節(jié),追求的是現(xiàn)實(shí)問題空間與軟件系統(tǒng)解空間的近似和直

接模擬,從而使人們對復(fù)雜系統(tǒng)的認(rèn)識過程與系統(tǒng)的程序設(shè)計(jì)實(shí)現(xiàn)過程盡可能的

一致。

3、軟件開發(fā)過程及發(fā)展趨勢

軟件開發(fā)者將被開發(fā)的整個業(yè)務(wù)范圍稱為問題域,軟件開發(fā)是對給定問題求

解的過程,分為兩項(xiàng)主要內(nèi)容:認(rèn)識和描述?!罢J(rèn)識”就是在所要處理的問題域

范圍內(nèi),通過人的思維,對該問題域客觀存在的事務(wù)以及對所要解決的問題產(chǎn)生

正確的認(rèn)識和理解。二就是用一種語言把人們對問題域中事務(wù)的認(rèn)識、對

問題及解決方法的認(rèn)識描述出來,最終的描述必須使用一種能夠被機(jī)器讀懂的語

言,即編程語言。

人們習(xí)慣使用的自然語言和計(jì)算機(jī)能夠理解并執(zhí)行的編程語言之間存在很

大的差距,稱為“語言的鴻溝”。由于人的認(rèn)識差距,問題域和自然語言之間也

有縫隙,機(jī)器語言和自然語言之間鴻溝最寬,程序設(shè)計(jì)語言的發(fā)展趨勢則是為了

鴻溝變窄。

§2.4C++面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)

面向?qū)ο蟮某绦蛟O(shè)計(jì)具有抽象、封裝、繼承和多態(tài)性等關(guān)鍵要素。

1、對象

c++中的對象是系統(tǒng)中用來描述客觀事物的一個實(shí)體,是構(gòu)成系統(tǒng)的一個

基本單位,C++中使用對象名、屬性和操作三要素來描述對象,如右所示:對

象名用來標(biāo)識一個具體對象;用數(shù)據(jù)來表示對象的屬性,一

對象名

個屬性就是描述對象靜態(tài)特征的一個數(shù)據(jù)項(xiàng);操作是描述對

象動態(tài)特征(行為)的一個函數(shù)序列(使用函數(shù)實(shí)現(xiàn)操作),屬性1

屬性2

也稱方法或服務(wù)。數(shù)據(jù)稱為數(shù)據(jù)成員,函數(shù)稱為成員函數(shù),

一個對象由一組屬性和對這組屬性進(jìn)行操作的成員函數(shù)構(gòu)

屬性n

成。

操作1

例:用簡單對象表示平面上的A(3.5,6.4)和B(8.5,

操作2

8.9)兩個坐標(biāo)點(diǎn)。

可用如下的對象結(jié)構(gòu)圖表示A和B的對象結(jié)構(gòu):

操作n

AB

x(3.5)x(8.5)

y(6.4)y(8.9)

Display();Display(

Setxy();Setxy();

Move();Move();

2、抽象和類

抽象是一種從一般的觀點(diǎn)看待事物的方法,即集中于事物的本質(zhì)特征,而不

是具體細(xì)節(jié)或具體實(shí)現(xiàn)。面向?qū)ο蟮姆椒ò殉绦蚩醋魇怯梢唤M抽象的對象組成

的,如果把一組對象的共同特征進(jìn)一步抽象出來,就形成了“類”的概念。

對于一個具體的類,它有許多具體的個體,這些個體叫做“對象”,同一類

的不同對象具有相同的行為方式。一個對象是由一些屬性和操作構(gòu)成的,對象的

屬性和操作描述了對象的內(nèi)部細(xì)節(jié),類是具有相同的屬性和操作的一組對象的集

合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和操作兩

個主要部分。

類的作用是定義對象,|類和對象的關(guān)系如同一個模具和其鑄造出來的鑄造件

的關(guān)系,對象之間就像是同一模具鑄出的零件,模樣相同,鑄造材料可能不同。

類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的實(shí)體。所

謂一個類的所有對象具有相同屬性和操作,是指它們的定義形式(即屬性的個數(shù)、

名稱、數(shù)據(jù)類型)相同,而不是說每個對象的屬性值都相同。

3、封裝

為了保護(hù)類的安全,即限制使用類的屬性和操作,需要將類封裝起來。gf

就像用同一個模具鑄造零件,各零件使用的材料(數(shù)據(jù)成員)和鑄造工藝(成員

函數(shù))均不同,每一種材料都有其對應(yīng)的鑄造工藝,材料與鑄造工藝是成套使用

(封裝)的,雖然鑄出零件的模樣一樣,但如果用錯了鑄造工藝,就可能出廢品。

所謂“封裝”,就是把對象的屬性和操作結(jié)合成一個獨(dú)立的系統(tǒng)單位,并盡

可能隱蔽對象的內(nèi)部細(xì)節(jié)。按照面向?qū)ο蟮姆庋b原則,一個對象的屬性和操作是

緊密結(jié)合的,對象的屬性只能由這個對象的操作來存取。

對象的操作分為內(nèi)部操作和外部操作,前者只供對象內(nèi)部的其他操作使用,

不對外提供;后者對外提供一個信息接口,通過這個接口接受對象外部的消息并

為之提供操作(服務(wù))。對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的這種不可訪問性稱為信息(數(shù)據(jù))

隱藏。

數(shù)據(jù)封裝給數(shù)據(jù)提供了與外界聯(lián)訊的標(biāo)準(zhǔn)接口,只有通過這些接口,使用規(guī)

范的方式,才能訪問這些數(shù)據(jù),同時程序員也只需要和接口打交道,而不必了解

數(shù)據(jù)的具體細(xì)節(jié)。

由此可見,封裝要求一個對象應(yīng)具備明確的功能,并具有接口以便和其他對

象相互作用,同時,對象的內(nèi)部實(shí)現(xiàn)(代碼和數(shù)據(jù))是受保護(hù)的,外界不能訪問

它們,這樣封裝一方面使得程序員在設(shè)計(jì)程序時能專注于自己的對象,同時也切

斷了不同模塊之間數(shù)據(jù)的非法使用,減少了出錯。

在類中,封裝是通過存取權(quán)限實(shí)現(xiàn)的,例如每個類的屬性和操作分為私有和

公有兩種類型,對象的外部職能訪問對象的公有部分,而不能直接訪問對象的私

有部分。

4、繼承

繼承是一個類可以獲得另一個類的特性的機(jī)制,支持層次概念,通過繼承,

低層的類只需定義特定于它的特征,而共享高層的類中的特征。繼承具有重要的

實(shí)際意義,它簡化了人們對事物的認(rèn)識和描述。

繼承就像鑄造中母模與子模的關(guān)菽-

5、多態(tài)性

不同的對象可以調(diào)用相同名稱的函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱為

多態(tài)性。利用多態(tài)性,程序中只需進(jìn)行一般形式的函數(shù)調(diào)用,函數(shù)的實(shí)現(xiàn)細(xì)節(jié)留

給接受函數(shù)調(diào)用的對象,這大大提高了解決人們復(fù)雜問題的能力。

多態(tài)性就像是鑄造時不同的零件、不同材料所鑄的同一款零件雖然可以使用

相同的鑄造工藝,但鑄出的零件用途、使用壽命和使用方法都不一樣。

§2.5使用類和對象

1、使用string對象

實(shí)際上string類很復(fù)雜,如右的string類的簡化圖中只string

給出了下例中涉及的屬性和部分操作。str

由圖,類string的屬性是一個字符串str,同名函數(shù)string

string是構(gòu)造函數(shù),用來初始化字符串,另外三個成員函數(shù)用find

來對屬性str進(jìn)行操作,其中find成員函數(shù)用來在str字符size

串中檢索需要的子串;size成員函數(shù)計(jì)算并輸出str存儲的單substr

詞長度;substr成員函數(shù)用來返回str字符串中的子串。

在程序中可以使用string類定義存儲字符串的對象,這些對象屬于string

類,因此還要使用#include〈string》來包含這個類的頭文件。

因?yàn)閟tring需要的是字符串,所以string類的對象不能用單引號括起來的

單個字符常量初始化,即:

stringstr='A';x//同理stringstr('A,);x

但可以使用雙引號括起來的單個字符常量初始化,即:

stringstr="A";M//同理stringstr("A");M

如果string的對象str的內(nèi)容為"ab",則strlOHa"str[l]=,b,?

例:使用string對象及初始化

frinclude<iostream>

#include〈string)//在程序中包含string類的頭文件

usingnamespacestd;

voidmain(){

stringstrl("Wearehere!");//用構(gòu)造函數(shù)st造ng定義對象strl并賦值

stringstr2="Whereareyou?";〃用構(gòu)造函數(shù)string定義對象str2并賦值

(或stringstrl("Wearehere!"),stringstr2="Whereareyou?";)

cout<<strl[0]<<strl[11]<<","?strl<<endl;

cout?str2[0]<<str2[13]<<","?str2?endl;

cout?"pleaseinputaword:

|cin>>strl7|〃輸入good

cout?"lenghtofthe"?strl?"is"?strl.size()?"."<<endl;

)

程序運(yùn)行結(jié)果為:

W!Wearehere!

W?Whereareyou?

Pleaseinputaword:good

Lengthofthegoodis4.

程序中使用了兩種方法給string類的兩個對象初始化,也可將它們定義在

一行中:stringstrl("Wearehere!"),stringstr2="Whereareyou?";

string類還提供將兩個字符串連接起來組成一個新字符串的能力,用“+”

號將后面的字符串連接到前一個字符串的后面,也可以與單個字符常量連接,如:

strl=strl+…+strl;將原來的兩個strl的內(nèi)容用空格連接起來。

2、使用string類的典型成員函數(shù)

string對象是通過調(diào)用成員函數(shù)實(shí)現(xiàn)操作,從而提供對象的行為或消息傳

遞的,對象調(diào)用成員函數(shù)的語法為:

對象名稱.成員函數(shù)(參數(shù)(可供選擇的消息內(nèi)容內(nèi)

常用的string類成員函數(shù):

1substr:stringnewstr=strl.substr(3,3);

find:inti=strl.find("are”,0);

get1ine:get1ine(cin,InputLline,'\n');

swap:strl.swap(str2);=str2.swap(strl);

Ibegin和end:copy(strl.begin(),strl.end(),str2.begin());

①成員函數(shù)substr用來返回給定字符串的子串,格式為:

對象名稱.substr(要截取子串的起始位置,截取的長度);

如:stringstrl("Wearehere!");語句中要從對象strl中截取字符串

are,可用下面的語句實(shí)現(xiàn):

stringnewstr=strl.substr(3,3);

此時newstr的內(nèi)容為are,括號中的第一個3是因?yàn)镃++規(guī)定字符串的計(jì)

數(shù)從0開始,所以a處于位置3;第二個3是因?yàn)閍re是3個字符,所以截取子

串的長度為3。

注意給出的要截取子串的起始位置必須位于字符串中,否則出錯。如果截取

長度大于字符串長度,則是可以的,程序?qū)⒆詣咏厝〉阶址┪?,如語句

stringstrnew=newstr.substr(2,8);和語句stringstrnew=

newstr.substr(2,1);等效,都是截取字符e。

②成員函數(shù)find用來在主串中檢索所需字符串,格式為:

對象名稱.f稱d(要查找的字符串,開始查找的位置);

函數(shù)返回查找到的字符串在主串中的位置,如:

<,,

inti=strl.findCare50);

表示從strl字符串的位置。開始查找are出現(xiàn)的位置,結(jié)果為3。

如果不給位置參數(shù),默認(rèn)位置參數(shù)為0。

③string類還提供一個輔助功能,以便使用getline從流cin中讀出輸入的一

行給string類的對象,如:

stringInputLine;

getline(cin,InputLline,'\n');

cout<<9,yourinput:,,?InputLine<<endl;

如果輸入“Iamhere!”,則得到如下結(jié)果:

yourinput:Iamhere!

例:將美國格式的日期轉(zhuǎn)換為國際格式

#include<iostream>

#include<string>

usingnamespacestd;

voidmain(){

cout?HEnterthedateinAmericanformat"

<<"(例如:December25,2002):n;//注意逗號后面有一個空格

stringDate;

get1ine(cin,Date,z\nz);〃輸入時間:May28,2002

inti=Date,find(H");//i=3

stringMonth=Date.substr(0,i);〃截取月份賦值給字符串Month

intk=Date,find(H,H);//k=6

stringDay=Date.substr(i+1,k-i-1);〃截取日期賦值給字符串Day

stringYear=Date.substr(k+2,4);//截取年份賦值給字符串Year

stringNewDate=Day+n"+Month+""+Year;

cout?nOriginaldate:H?Date?endl;

cout?HConverteddate:n<<NewDate?end1;

)

程序運(yùn)行實(shí)例:

EnterthedateinAmericanformat(例如:December25,2002):May28,2002

Originaldate:Ma

溫馨提示

  • 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

提交評論