C++筆試要點(diǎn)(代C語(yǔ)言要點(diǎn))_第1頁(yè)
C++筆試要點(diǎn)(代C語(yǔ)言要點(diǎn))_第2頁(yè)
C++筆試要點(diǎn)(代C語(yǔ)言要點(diǎn))_第3頁(yè)
C++筆試要點(diǎn)(代C語(yǔ)言要點(diǎn))_第4頁(yè)
C++筆試要點(diǎn)(代C語(yǔ)言要點(diǎn))_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++筆試部分要點(diǎn):

1.標(biāo)識(shí)符(可作為變量名、數(shù)組名、函數(shù)名等)的命名規(guī)范

①由52個(gè)英文大小寫(xiě)字母,10個(gè)數(shù)字,一個(gè)下劃線(xiàn)構(gòu)

②以英文字母或下劃線(xiàn)開(kāi)頭,不能是保留字

(例子)下列符號(hào)中可以用作C++標(biāo)識(shí)符的是

A)MainB)foo-barC)elseD)3room

常見(jiàn)錯(cuò)誤及注意事項(xiàng):

①以數(shù)字開(kāi)頭(如3room),

②中間含有空格或非法字符(如foo-bar,或MyName)

③區(qū)別大小寫(xiě)(如Main與main不同,if與If不同)

④保留字(如if、while等)不能作為標(biāo)識(shí)符

⑤但編譯預(yù)處理命令(如include、define、main等)不是

保留字,它們可以被用作標(biāo)識(shí)符。

如,下列程序合法:

//include<iostream.h>

voidmain()

intinclude;

cin?include;

cout?include?endl;

//include<iostream.h>

voidmainO

intmain;

cin?main;

cout?main?endl;

#include<iostream.h>

voidmainQ

intdefine;

cin?define;

cout?define?endl;

)

2.各種類(lèi)型常量書(shū)寫(xiě)規(guī)范

0650X9A0X9AL45L45135U35u

3.26F3.4f2.3E822.3e-45.3e4

'C'\t''\n''\24'MOI*'\x4.99a'

Tn3"string”

空字符*\0\空格,,,空串””

常見(jiàn)錯(cuò)誤:

①八進(jìn)制數(shù)048,0后面跟大于7的數(shù)字

②,038,,\0后面跟大于7的數(shù)字

③十六進(jìn)制數(shù)OxaG,Ox后面跟大于f/F的字符

④5.3e4.2,指數(shù)部分寫(xiě)成了帶小數(shù)點(diǎn)的實(shí)型數(shù)

⑤fabcS單引號(hào)中括多個(gè)字符

(例子)以下合法的常量是

A)'\28'B)'OXAB'C)2.3E8.0D)nab\OcdH

^include<stdio.h>

main()

(

printf(H%d,%d\nH,strlen(Hab\OcdH),sizeof(nab\OcdH));

)輸出2,6

3.基本類(lèi)型數(shù)據(jù)在內(nèi)存中的長(zhǎng)度以及存放形式:

整型數(shù)據(jù):補(bǔ)碼形式存儲(chǔ)正整數(shù)的補(bǔ)碼與原碼相同

實(shí)型數(shù)據(jù):浮點(diǎn)形式存儲(chǔ)

sizeof(char)=sizeof(unsignedchar)1字節(jié)

sizeof(short)=sizeof(unsignedshort)2字節(jié)

sizeof(int)=sizeof(unsignedint)2字節(jié)

sizeof(long)=sizeof(unsignedlong)4字節(jié)

sizeof(float)4字節(jié)

sizeof(double)8字節(jié)

sizeof(char*)=sizeof(int*)=sizeof(float*)=...=2

即所有指針類(lèi)型的變量的長(zhǎng)度都是2o

4.不同整型數(shù)據(jù)(長(zhǎng)度不同)相互賦值原則

char,int,short,long,

(每種類(lèi)型前都可加signed和unsigned)得:

signedchar,signedint,signedshort,signedlong,

unsignedchar,unsignedint,unsignedshort,unsignedlong

均可用作整型量

賦值時(shí):短一長(zhǎng)截取“長(zhǎng)”數(shù)據(jù)的低位,然后賦值

長(zhǎng)一短將“短”數(shù)據(jù)擴(kuò)展成等長(zhǎng)數(shù)據(jù),然后賦值

擴(kuò)展原則:若短數(shù)據(jù)為無(wú)符號(hào)型,則前面補(bǔ)0(unsigned)

若短數(shù)據(jù)為有符號(hào)型,則前面補(bǔ)符號(hào)位

(例子)短一長(zhǎng)

已知216=65536,請(qǐng)寫(xiě)出下列程序段的輸出。

inti=65538;cout?i?'\n';輸出2

65538是長(zhǎng)整型常量

65538:00000000000000010000000000000010

i:0000000000000010

(例子)請(qǐng)寫(xiě)出下列程序段的輸出。長(zhǎng)一短

voidmain()

charcl=-3;unsignedcharc2=-3;/*短―長(zhǎng)*/

intal=cl,a2=c2;/*長(zhǎng)―短*/

cout<<al?y?a2?endl;輸出-3,253

-3:1111111111111101(32位)整型常數(shù)

cl:11111101(8位)c2:11111101(8位)

al:1111111111111101(16位)a2:0000000011111101(16位)

5.類(lèi)型轉(zhuǎn)換(賦值時(shí)的類(lèi)型轉(zhuǎn)換,混合運(yùn)算時(shí)的類(lèi)型轉(zhuǎn)換)

(例子)設(shè)有語(yǔ)句:for(ints=l,i=2;i<=6;i++)s*=i/2;

執(zhí)行該語(yǔ)句后,s的值是o

A.1B.12

C.22D.22.5

【解析】

若兩個(gè)量都是整型,則運(yùn)算結(jié)果應(yīng)是整型量。

i/2的結(jié)果應(yīng)是整型量,如i=3,則i/2的結(jié)果應(yīng)是1。

(例子)已知x=2.5,a=7,y=4.7

求x+a%3*(int)(x+y)%2/4的值

答案:2.5

(例子)設(shè)有語(yǔ)句:

chars[]=H246",*ptr=s;

cout?(char)(*(ptr+l)+l)?,\n,;

執(zhí)行以上語(yǔ)句后,輸出o

A.5B.6C.46D.56

①coutw(*(ptr+l)+l)?*\n*;輸出什么?

②表達(dá)式(*(ptr+l)+l)的類(lèi)型是什么?

答案:①輸出53(5的ASCH碼)

②表達(dá)式類(lèi)型是int型

(例子)設(shè)有變量說(shuō)明:inta=O,b=0;

則表達(dá)式sizeof(卬+E)的值為:

A.1B.2C.4D.8

(例子)設(shè)有變量說(shuō)明:floata=0,b=0;

則表達(dá)式sizeof(a+b)的值為:

A.1B.2C.4D.8

【解析】

圖2-3混合運(yùn)算類(lèi)型轉(zhuǎn)換原則

doubleY-----float

橫向:必定轉(zhuǎn)換A

,t

long

A

1.,

unsigned

A

.J

intv—-char,short

問(wèn)題:

①表達(dá)式3+5的類(lèi)型?int型

②sizeof(3+5)的值?2

③coutvv(3+5)vvendl;104

(因?yàn)楹偷拇a分別是和

④35ASCII5153)

⑤sizeof('a'*'b')的值為?2

⑥sizeof(3)的值?2

⑦sizeof(3)的值?1

cout?3*?endl;3

⑧cout?int(,3,)?endl;51

6.表達(dá)式的計(jì)算

(逗號(hào)表達(dá)式,賦值表達(dá)式,邏輯表達(dá)式優(yōu)化,關(guān)系表達(dá)式,

整數(shù)求余%,整數(shù)整除/)

(例子)設(shè)定義了說(shuō)明語(yǔ)句:

intk,j;

下列選項(xiàng)中,沒(méi)有語(yǔ)法錯(cuò)誤的表達(dá)式是O

A.(k++)++B.(k+3)=5C.k-/=5D.k—j

【解析】

A.++不能作用于表達(dá)式

B.C.賦值表達(dá)式的左值不能是表達(dá)式。

D.k-j等價(jià)于(k-)-j,不是賦值表達(dá)式。

自左至右掃描,盡量構(gòu)成運(yùn)算符。

因此k---j不等價(jià)于k-(―j)o

(例子)設(shè)有變量說(shuō)明:inta=3,b=4,c=5;下列表達(dá)式中,

值為0的表達(dá)式是O

A.卬&&3B.a<=b

C.a||b+c&&b-cD.!(a<b&&c<b||b)

(例子)已知intx=l,y=3,m=0,n=0,k=0;

k=(n=y>x)||(m=x<y);

貝!I語(yǔ)句cout?m?,,,?n?,,,?k?endl;

輸出的是o

A)1,1,0B)1,0,1C)1,1,1D)0,1,1

(例子)若有語(yǔ)句

intx=0,y=l,z=2;

z=+4-x||++y;

執(zhí)行以上語(yǔ)句后,變量x、y和z的值分別為

答案:1,1,1

以上兩題適用于如下規(guī)則

邏輯運(yùn)算優(yōu)化規(guī)則:不管優(yōu)先級(jí),從左至右掃描,若II前

為“真”,或者&&前為“假”,則停止。

(“或”運(yùn)算的前一個(gè)值若為真,則后一個(gè)表達(dá)式不算)

(“與”運(yùn)算的前一個(gè)值若為假,則后一個(gè)表達(dá)式不算)

(例子)請(qǐng)寫(xiě)出下列程序段的輸出。

intx=-5;

if(0<x<10)//0小于-5,錯(cuò),所以(0<-5)=0,0<10為

T

printf(n***\n'');

else

printf(H###\n");

本題答案:輸出***

表示數(shù)學(xué)關(guān)系0<x<10的正確寫(xiě)法為:ivx&&x<10

另外還有:,AY=ch&&ch<=

不能寫(xiě)成:'A,v=chv=Z

(例子)若al,a2,a3和a4均為整型變量,則以下選項(xiàng)中,

符合C++語(yǔ)法規(guī)則的表達(dá)式是O

A.al=25%3.3B.a2=al+a3=3*5

C.a3=078D.a4=0Xa2

解析:

%要求運(yùn)算量為整型

+比=優(yōu)先級(jí)高

078是非法常量

7.=與==的區(qū)別

(例子)

設(shè)有語(yǔ)句:

inti=10,j=10;

if(j=O)i=i*i;

elsei=i+j;

執(zhí)行以上語(yǔ)句后i的值為o//答案:10oj被賦值

是0,所以if里面是0,為假,若j被賦值是12(非零量即

可),則輸出100;

(例子)

設(shè)有語(yǔ)句:

inti=10,j=0;

if(j==O)i=i*i;

elsei=i+j;

執(zhí)行以上語(yǔ)句后i的值為o//100

8.前后綴++,---

(例子)執(zhí)行以下程序段后,輸出結(jié)果是O

intx=9,y=8;

inta,b,c;

a=(—x==y++)?—x:++y;//注意=與==的區(qū)別

b=x++;

c=y;

cout?a?,,,?b?,,,?c?endl;

A)7,7,9B)8,8,8C)8,9,8D)1,10,9

(例子)有語(yǔ)句:

inty=100;

while(y--

cout?Hy=n?y?H\nn;其輸出為:

A)y=0B)while構(gòu)成無(wú)限循環(huán)

C)y=1D)y=-1

(例子)i=5;while(i++<10);運(yùn)行結(jié)束后i=?

答案:i=U

9.運(yùn)算符的優(yōu)先級(jí)和結(jié)合性

(例子)以下程序輸出

intx=5,y=6;

y*=x+y;//等價(jià)于y=y*(x+y);

cout?y?endl;

【解析】*=的優(yōu)先級(jí)與=一樣

(例子)

voidfun(int*a,int*b)〃a指向cl[0],b指向c2[0]

(

(*a)++;

*b++;//等價(jià)于*(b++),表達(dá)式b++的值是b的原始值,

而++是作用在b上的

*a++;

(*b)++;

cout?*a?,\t,?*b?endl;

)

voidmain(void)

(

intcl[3]={10,20,30},c2[3]={40,50,60};

fun(cl,c2);〃參數(shù)傳遞時(shí),有int*a=cl;int*b=c2;

cout?cl[O]?,\t,?cl[l]?endl;

cout?c2[0]?,\t,?c2|l]?endl;

)

程序輸出的第一行是,第二行是,第三行是

〃答案:205111204051

lO.if語(yǔ)句的語(yǔ)義(else的匹配問(wèn)題)

(例子)寫(xiě)出程序的輸出

voidmain()

{intx=2,y=-1,z=2;

if(x〈y)

if(y<0)z=0;

elsez+=l;

cout?z?*\n,;

)

A)3B)2C)1D)0

【解析】eke與距它最近的尚未匹配的if匹配,而不是靠書(shū)

寫(xiě)對(duì)齊來(lái)匹配

(例子)寫(xiě)出程序的輸出

inta=l,b=2,c=3;

if(a==b)

if(b==c)printf("a=b=c\ii");

elseprintf(Ha!=b\nH);

答案:無(wú)輸出

整型、枚舉類(lèi)型或

11.switch語(yǔ)句---字符型

switch俄達(dá)

case

case常數(shù)2:...

case常數(shù)3:...

default:...

注意:“表達(dá)式”中可以有變量?!俺?shù)i”只能是常數(shù)表達(dá)

式,如3或3+2或3+N等,N是已定義的符號(hào)常數(shù)。

(例子)

設(shè)變量a,b是整型變量,下列switch語(yǔ)句中,語(yǔ)法正確的

是:

A.switch(a){

casea:a++;break;

caseb:b++;break;

)

B.switch(a+b){

case1:b=a++;break;

case1:a=++b;

)

C.switch(a*a){

case10,12:++a;

case14,16:++b;

)

D.switch(a/10+b){

case3:b=a/10;break;

default:a+=b;

)

(例子)

#include<iostream.h>

voidmain()

{intx=1,y=0,a=0,b=0;

switch(x)

{case1:

switch(y)廠\

{case0:a++;break;j

case1:b++;break^^/

case2:a++;b++;break;

)

cout?,,a=,,?a?,,,b=,,<<b?,\n,;

程序輸出為:

A)a=2,b=lB)a=l,b=l

C)a=l,b=0D)a=2,b=2

(例子)

voidmain(void)

(

charc,*s=''1234'';

while(c=*s++)

switch(c-'O')

(

case0:

case1:printf("%c”,c+1);

case2:printf("%c\n'',c+2);

break;

default:printf(^^%c\n^^,c+3);

break;

)

printf("\n”);

)

程序的輸出的第一行是o

答案:23

程序的完整輸出是:

23

4

6

7

(例子)以下程序若輸入china#則輸出115,5

voidmain()

intvl=0,v2=0;

charch;

while(ch=getchar())!='#')

switch(ch)

{

case'a':

case'h':

default:vl+4-;

case'o':v2++;

)

cout?vl?,,,?v2?endl;

12.循環(huán)

(1)for語(yǔ)句中的條件表達(dá)式缺省,則條件為永“真

(例子)設(shè)el和e3是表達(dá)式,與語(yǔ)句for(el;;e3)s;等同的

語(yǔ)句是o

A.for(el;el;e3)sB.for(el;e3;e3)s

C.for(el;0;e3)sD.for(el;1;e3)s

⑵while(或for)與do-while的區(qū)別,循環(huán)體執(zhí)行的次數(shù)

(3)循環(huán)的執(zhí)行次數(shù)

(例子)設(shè)有循環(huán)語(yǔ)句:

for(inti=0,x=0,s=0;i<=9&&x!=55;i++)

(

tt,,

scanf(%d?&x);

s+=x;

)

在這個(gè)循環(huán)語(yǔ)句中,循環(huán)體最多執(zhí)行為一次,最少執(zhí)行

_____次。

答案:101

(例子)執(zhí)行以下語(yǔ)句時(shí),循環(huán)的次數(shù)是:

for(intx=0,y=0;!x&&y<=5;y++);正確的程序是這樣

A.無(wú)次數(shù)B.0C.5D.6

(例子)執(zhí)行以下語(yǔ)句時(shí),循環(huán)的次數(shù)是:

for(intx=0,y=0;!x&&y<=5;y—);

A.無(wú)次數(shù)B.0C.5D.6

答案:我們習(xí)題匯編中給出的答案是A,

省考試中心給出的標(biāo)準(zhǔn)答案是D(我們題目錄入錯(cuò)誤)

實(shí)際上此題在C語(yǔ)言環(huán)境中無(wú)正確答案,循環(huán)次數(shù)應(yīng)該是

32769次。

y實(shí)際變化的過(guò)程是:

y=0(0000000000000000)

y=-l(1111111111111111)

y=-2(inimimimo)

???

y=-32768(-215)其內(nèi)存內(nèi)容是:

(1000000000000000)

再次減1,發(fā)生溢出(即比int型數(shù)值的下限還要小),y變

為:

(0111111111111111)

值為32767(2第一1)即int型數(shù)值的上限。

此yv=5不成立,循環(huán)結(jié)束。

為了驗(yàn)證了上述觀點(diǎn),修改上述程序:

#include<stdio.h>

main()

(

intx,y;

longcount=0;//count用于統(tǒng)計(jì)循環(huán)次數(shù)

for(x=0,y=0;!x&&y<=5;y~)count++;

printf(H%ld\nM,count);

輸出:32769

13.嵌套循環(huán),循環(huán)中的break,continue

(例子)有一種只在循環(huán)語(yǔ)句或switch語(yǔ)句中使用的流程控

制語(yǔ)句,表示該語(yǔ)句的關(guān)鍵字是

(例子)〃判斷一個(gè)二維數(shù)組是否關(guān)于主對(duì)角線(xiàn)對(duì)稱(chēng)

voidmain(void)

{

inta[4][4]={l,2,3,4,2,2,5,6,3,5,2,7,4,6,7,4};

inti,j,flag=0;

1234

2256

for(j=0;j<4;j++)3527

for(i=0;i<=j;i++)4674

(

if(a[j][i]==a[i][j])continue;〃流程轉(zhuǎn)到哪里?

if(flag)cout?HNo!n?endl;

elsecout?HAllRight!H?endl;

)

輸出:AllRight!

(例子)程序輸出為:

#include<iostream.h>

voidmain()

{inti,j,sum=0;

for(i=0;i<5;i++)

for(j=0;j<6;j++)

(

sum++;

if(i==3)break;"break跳出哪一個(gè)循環(huán)?

)

cout?sum?y?i?y?j?endl;

輸出:25,5,6

(例子16)

#include<iostream.h>

voidmain(void)

{inta[4][4]={{l,2,0,-2,-3,0},{4,0,-5,5},{-6,6,0,7});

for(inti=0,s=0;i<4;i++)

for(intj=0;j<4;j++)

(

if(a[i][j]<0)continue;

if(a[i][j]==O)break;

s+=a[“[j];

)

cout?s?endl;

)

程序的輸出是O

輸出:16

(例子)

voidmain()

{intx=3,y=6,a=0;

while(x++!=(y-=l))〃注意:比較時(shí),x,y的值

{a+=1;//比較后,x,y的值

if(y<x)break;

)

cout?Hx=H?x?H,y=H?y?H,a="?a?endl;

)

A)x=4,y=4,a=lB)x=5,y=5,a=l

C)x=5,y=4,a=3D)x=5,y=4,a=l

(例子)程序讀入最多20個(gè)數(shù),統(tǒng)計(jì)正數(shù)個(gè)數(shù),并計(jì)算正

數(shù)之和。要求或者輸入0結(jié)束,或者若已讀入20個(gè)數(shù)自動(dòng)

結(jié)束。請(qǐng)?zhí)羁铡?/p>

#include<iostream.h>

voidmain()

(

inti,a[20],sum,count;

sum=count=0;

for(i=0;;i++)

(

if(i>19);//break;

cin?a[i];

if(a[i]==0);//break;

if(a[i]<0);//continue;

sum+=a[i];

count++;

)

cout?Hsum=,,?sum?,\t,?Hcount=H?count?endl;

)

14.函數(shù)原型說(shuō)明,函數(shù)調(diào)用,函數(shù)的返回值

(例子)下列關(guān)于C++函數(shù)的敘述中,正確的是

A)每個(gè)函數(shù)至少要具有一個(gè)參數(shù)

B)每個(gè)函數(shù)都必須返回一個(gè)值

C)函數(shù)在被調(diào)用之前必須先聲明

D)函數(shù)不能自己調(diào)用自己

(例子)下列敘述中,不正確的是:

A.一個(gè)函數(shù)中可以有多個(gè)return語(yǔ)句

B.函數(shù)可通過(guò)return語(yǔ)句返回?cái)?shù)據(jù)

C.必須用一個(gè)獨(dú)立的語(yǔ)句來(lái)調(diào)用函數(shù)

D.函數(shù)main也可以帶有參數(shù)

【解析】函數(shù)調(diào)用可以作為表達(dá)式的一部分,如y=4+f(x);

(例子)在以下的函數(shù)原型說(shuō)明中,存在語(yǔ)法錯(cuò)誤的是

A.voidf(inta,int);B.voidf2(int,int);

C.voidf3(int,int);D.intf4(intx;inty);

15.函數(shù)的聲明原則:

正確程序如下:

#include<iostream>

usingnamespacestd;

intmain()

(

floatadd(floatx,floaty);〃對(duì)add函數(shù)作聲明

floata,b,c;

coutvv"pleaseentera,b:"

cin?a?b;

c=add(a,b);〃調(diào)用add

coutvv"sum="?c?endl;

return0;

)

floatadd(floatx,floaty)〃定義add函數(shù)

(

floatz;

z=x+y;

return(z);

)

或者:

#include<iostream>

usingnamespacestd;

floatadd(floatx,floaty)〃定義add函數(shù)

(

floatz;

z=x+y;

return(z);

intmain()

{

floata,b,c;

cout?f,pleaseentera,b:"

cin?a?b;

c=add(a,b);〃調(diào)用add

cout?sum="?c?endl;

return0;

16.函數(shù)參數(shù)逆向求值

(例子)寫(xiě)出以下程序的輸出

voidfun(intx,inty,intz)

cout?x?y?z?,/;

)

voidmain()

(

inta=3,b=5;

fun(++a,++b,a+b);

cout?a?b?endl;

)

輸出:468,46

(例子)

voidmain()

(

inta=3;

printf(u%d%d%d\n,\a++,a++,a++);

}

輸出:543從后向前

17.存儲(chǔ)類(lèi)別,靜態(tài)變量、全局變量的使用

(例子)

下列關(guān)于變量的敘述中,不正確的是:

A.C++語(yǔ)言中將變量分為auto,static,extern和register四

種存儲(chǔ)類(lèi)型

B.自動(dòng)變量和外部變量的作用域?yàn)檎麄€(gè)程序文件

C.函數(shù)內(nèi)定義的靜態(tài)變量的作用域?yàn)槎x它的函數(shù)體

D.外部靜態(tài)變量的作用域?yàn)槎x它的文件內(nèi)

(例子)

程序輸出為:

intfun(intk)

{staticintm=l;〃靜態(tài)變量,第一次到達(dá)該語(yǔ)句時(shí)初始化一次

intn=2;

m=k+m+n++;

returnm;

)

voidmain()

{for(inti=0;i〈3;i++)在意:i的值的變化,在循環(huán)和fun

中都“++”,所以循環(huán)兩次

cout?fun(i++)?,\t,;

cout?,\n,;

)

答案:37

18.遞歸(如何解決?)畫(huà)圖

(D問(wèn)題的規(guī)模向終結(jié)逼近

(2)終結(jié)條件

(例子)程序輸出為

#include<iostream.h>

voidfunc(charc)

(

printf("%c",c);

if(c<3)func(c+1);

printf("%c",c);

)

voidmain()

{func('0');}

答案:01233210

(例子)#include<iostream.h>

intm=10;

voidfun(intn)

{m+=m;

if(n<=l)cout?m?*\n,;

else

{fun(n-l);

m+=m;

cout?m?,\n,;

)

)

voidmain(void)

{fun(3);fun(5);)

程序輸出的第一行至第三行分別是、、

_____O

答案:80160320

(例子)

#include<iostream.h>

intf(intn,intx)

(

X+=1;

if(n==3)returnx;

else

returnx+f(n+l,x+1);

)

voidmain(void)

(

cout?f(3,l)?endl;

cout?f(2,l)?endl;

cout?f(l,l)?endl;

cout?f(0,l)<<cndl;

)

程序輸出的四行分別是—、—、—和—O

答案:261220

(例子)在下面函數(shù)的橫線(xiàn)處填上適當(dāng)?shù)膬?nèi)容,使該函數(shù)能

夠利用遞歸方法求解字符串str的長(zhǎng)度(不得使用系統(tǒng)提供

的字符串處理函數(shù))。

intGetLen(char*str)

{

if([11)return[21;

elsereturnl+GetLen(str+l);

)

答案:【1]!str[O]或str[O]=,\O,[2]0

19.宏代換,技巧:“一定要手工寫(xiě)出代換結(jié)果”

(例子)程序輸出為

#defineMOD(x,y)x%y

voidmain()

(

intz,a=5,b=10;

z=MOD(b+3,a);〃直接簡(jiǎn)單代換,不加括號(hào)

cout?z++?endl;

)

A)5B)3C)13D)14

(例子)若有宏定義:

#defineT(x,y)x*y/4

則表達(dá)式T(3+4,4+4)的值為//20

(例子)設(shè)有宏定義和變量說(shuō)明:

#defineT(x,y)x+y

inta=T(3,4)*T(3,5);

則變量a的初值為//20

20.指針的意義,函數(shù)參數(shù)的形式(傳值調(diào)用)

(普通變量、指針、作參數(shù))考得較多

定義指針:intx=8,*p;p=&x;

*p間接訪(fǎng)問(wèn)x,或者說(shuō)*p與x訪(fǎng)問(wèn)同一變量。

>普通變量做參數(shù):對(duì)應(yīng)的實(shí)參與形參是不同的變量,不管

是否同名。(值傳遞)

>指針做參數(shù):實(shí)參指針值賦給形參指針變量(參數(shù)單向傳

遞)。(指針傳遞)

(例子)在C中函數(shù)參數(shù)傳遞方式有兩種:第一種是值傳遞,

第二種是傳遞。

答案:指針(或地址)

例1:普通變量做函數(shù)參數(shù)

#include<iostream.h>

voidswap(intx,inty)〃實(shí)參和形參占用不同的存儲(chǔ)空間

{〃參數(shù)傳遞時(shí),intx=x,inty=y,形參是局部變量

intt;t=x;x=y;y=t;

)---------------------

voidmain()形參改變不能改變實(shí)參

intx=3,y=9;

swap(x,y);

cout?x?*,*?y?endl;

)

輸出?3,9■■

注意

例2:指針做函數(shù)參異一

#include<iostream.h>

voidswap(int*px,int*py)

〃實(shí)參指針和形參指針是不同的指針

{〃參數(shù)傳遞時(shí),int*px=pl,int*py=p2

EI

t=*px;*px=*py;*py=t;

)

voidmain()

intx=3,y=9,*pl,*p2;

pl=&x;p2=&y;

swap(pl,p2);

cout?x?*/?y?endl;

)

輸出?9,3

例3:指針做函數(shù)參數(shù)

//include<iostream.h>

voidswap(int*px,int*py)

〃實(shí)參指針和形參指針是不同的指針

{//參數(shù)傳遞時(shí),int*px=&x,int*py=&y

int*tp;

tp=px;px=py;py=tp;”交換的是指針

)

voidmain()

(

intx=3,y=9;

swap(&x,&y);

cout?x?y?y?endl;

)

輸出?3,9

(例子)

#include<iostream.h>

voidfun(int*x,inty)//參數(shù)y是fun的局部變量,

(〃不影響主函數(shù)中的X。

y=*x+y;〃參數(shù)x是指針,指向主函數(shù)中的y,

*x=y%4;〃fun函數(shù)中*x訪(fǎng)問(wèn)主函數(shù)中的y。

〃參數(shù)傳遞時(shí),int*x=&y,inty=x

cout?*x?y?y?endl;

)

voidmain(void)

intx=4,y=5;

fun(&y,x);

cout?x?,,*?y?endl;

fun(&x,y);

cout?x?*,,?y?endl;

)

程序輸出的第一行是,第二行是,第四行是

______O

答案:1,94,11,1

21.返回指針值的函數(shù)

(例子)

#include<iostream.h>

char*f(char*s,charch)

(

char*p=s,*q=s;

while(*q=*p++)

if(*q!=ch)q++;//p往后跑的快

returns;〃返回的是字符串首指針

)

voidmain(void)

{

charsl[]=HHelloHowareyou”,s2[]=n110010111”;

cout?f(sl,,e,)?,\n,;

cout?f(s2,,0,)?,\n,;

)

程序輸出第一行是—,第二行是—O

答案:

HiloHowaryou

111111

【解析】函數(shù)f的功能是刪除字符串S中出現(xiàn)的字符Ch。

22.一維數(shù)組的定義、做函數(shù)參數(shù)(參數(shù)的意義和形式)

考得較多

(例子)要定義數(shù)組A,使得其中每個(gè)元素的數(shù)據(jù)依次為:

3、9、4、8、0、0、0,錯(cuò)誤的定義語(yǔ)句是

A)intA[]={3,9,4,8,0,0,0};

B)intA[7]={3,9,4,8);//后面的元素值為0

C)intA[]={3,9,4,8};〃數(shù)組長(zhǎng)度是4

D)intA[7]={3,9,4,8,0,0,0};

說(shuō)明:intA[7];若A是局部數(shù)組,則其元素值不確定

若A是全局?jǐn)?shù)組,則其元素值均為0

若有:intA[7]={3};只要給出至少一個(gè)初值,其余元素為0

(例子)下列數(shù)組定義中,錯(cuò)誤的是o

A.intal[2]={l};B.inta2[][2]={{1},{2}};

C.inta3[3];D.inta4[][3];

【解析】定義數(shù)組時(shí)(不論一維還是二維),必須指定每一

維的大小。要么顯式寫(xiě)出,要么從給出的初值中能夠判斷維

數(shù)的大小。但是,若用數(shù)組做函數(shù)參數(shù),寫(xiě)形參時(shí),對(duì)一維

數(shù)組來(lái)說(shuō),長(zhǎng)度是否寫(xiě)出無(wú)關(guān)緊要,因?yàn)閭鬟f的是首指針;

對(duì)二維數(shù)組來(lái)說(shuō)行數(shù)是否寫(xiě)出也無(wú)關(guān)緊要,因?yàn)閭鬟f的是行

指針,對(duì)行指針而言,關(guān)鍵是一行中有幾個(gè)元素,即列數(shù),

所以形參中列數(shù)必須寫(xiě)出。

(例子)針對(duì)數(shù)組定義intdata[10];,下列表述中錯(cuò)誤的是

A)用*data可訪(fǎng)問(wèn)到數(shù)組的首元素〃數(shù)組元素下標(biāo)從0開(kāi)始

B)用data[9]可訪(fǎng)問(wèn)到數(shù)組的末元素

C)用data[10]可訪(fǎng)問(wèn)到數(shù)組元素會(huì)超出數(shù)組邊界〃越界

D)data共有10個(gè)元素,其首元素是data"]

(例子)設(shè)定義了宏:

#defineN2

以下定義數(shù)組的選項(xiàng)中,存在語(yǔ)法錯(cuò)誤的是:

A.intn;scanf("%d",&n);inta[n];

B.intconstn=5;inta[n];//n是常數(shù)

C.inta[2*N+l]//2*N+1是常量表達(dá)式

D.inta[]={1,2,3?4,5};doubleb[sizeof(a)];

//sizeof(a)也是常量

?一維指針做參數(shù):注意形參的寫(xiě)法(形參是指針變量)

訪(fǎng)問(wèn)數(shù)組的各種方式!

例題:

intfsum(intb[|,intn)intfsum(int*b,intn)〃或intb[10]

{inti,s=0;{inti,s=0;

for(i=0;i<n;i++)for(i=0;i<n;i++)

s+=(*b++);s+=b[i];

return(s);return(s);

))〃在被調(diào)函數(shù)中可以:b++

voidmain(void)

{inta[15]={1,2,3....14,15);

intshead,stail;

shead=fsum(a,10);〃第1次調(diào)用

stail=fsum(&a[5],10);〃第2次調(diào)用

cout?shead?4,??stail?endl;

)

(例子)寫(xiě)出程序的輸出

#include<iostream.h>(圖)

voidfun(float*pl,float*p2,float*s)

(

s=(float*)malloc(sizeof(float));

*s=*pl+*(p2++);

)

voidmain()

floata[2]={l.l,2.2};

floatb[2]={10.0,20.0),*s=a;

fun(a,b,s);

*s);

}

程序輸出為:

A)11.1B)12.1C)21.1D)1.1

?一維數(shù)組與指針

inta[10];圖

第i個(gè)元素的值a[i],*(a+i),p[i],*(p+i),p=p+i;*p

第i個(gè)元素的地址a+i,&a[i],p+i,p=p+i;p

(例子)程序中有如下語(yǔ)句

for(inti=0;i<5;i++)coutvv*(p+i)vv",";

能夠依次輸出int型一維數(shù)組DATA的前5個(gè)元素。由

此可知,變量p的定義及初始化語(yǔ)句是o

答案:int*p=DATA

(例子)有如下定義和語(yǔ)句,其中0WiV6,

inta[]={1,3,5,7,9,U},*p,i;p=a;

則對(duì)數(shù)組a的元素地址的正確表示是:

A)&(a+i)B)a++C)&(p+i)D)&p[i]

(例子)

//include<iostream.h>〃數(shù)組元素逆置,部分元素逆置

voidf(int*s,intnl,intn2)

{intt;

while(nl<n2)

{t=*(s+nl);

*(s+n1)=*(s+n2);

*(s+n2)=t;

nl++;n2-;

)

)

voidmain(void)

{inta[10]={l,2,3,4,5,6,7,8,9,0},i,*p=a;

f(P,0,3);

f(p+2,l,6);

for(i=l;i<10;i++)

{if(i%5==0)printf(H\nn);

printf(H%dM,a[i]);

)

printf(H\nH);

)

程序輸出的第一行是—,第二行是—O

答案:329876510

23.字符指針初始化,字符指針指向字符數(shù)組

(例子)以下四組語(yǔ)句中,不符合C++語(yǔ)法規(guī)則的是

A.charstr[]=nGoodmorning";

B.charstr[20];str="Goodmorning**;

C.char*p=HGoodmorning”;〃C和D等價(jià)

D.char*p;p=HGoodmorning0;//字符串的值是其起始地址

(例子)若有char*p=nHelloH;則以下選項(xiàng)中錯(cuò)誤的是

A.chara=*p;//*p是'H,

B.char*s=*p;〃*p表示字符,H"不能賦值給指針s

C.char*q=p+2;〃將指針p+2賦值給q

D.p=p+2;

24.strlen和sizeof

“China”字符串的長(zhǎng)度是5,但其存儲(chǔ)空間是6。

(例子)設(shè)有說(shuō)明語(yǔ)句:

chars[]=Hab\0\123\\\n79H

strlen(s)的值是。

A.2B.3C.8D.14

而sizeof(s)的值是9o

(例子)以下語(yǔ)句的輸出是o

chars[20]=nATS\0JK\\H;

cout?strlen(s)?H,n

?sizeof(s)?n,n〃注意s是數(shù)組名

?sizeof(HATS\OJK\\H)?endl;

答案:3,20,8

(例子)注意字符串的意義:結(jié)尾,

strlen(HATS\nO12\l\\n)的結(jié)果是9

strlen(HATS\012\l\\H)的結(jié)果是6

strlen(HATS\0\l\\H)的結(jié)果是3

chars[20];

char*p=s;

sizeof(p)?sizeof(s)?答案:220

sizeof()括號(hào)中若是數(shù)組名,則求的是數(shù)組總空間;

若是指針變量,則求的是指針變量自身的長(zhǎng)度。

(例子)若有doublea[3][4];則sizeof(a)的值是。

A.7B.12C.48D.96

(例子)inta[3][4];intb[10];int(*pa)[4]=a,*pb=b;

則sizeof(a)的值是48

則sizeof(pa)的值是2〃任何類(lèi)型的指針,長(zhǎng)度都是2

則sizeof(b)的值是40

則sizeof(pb)的值是2

25.字符指針的意義(指針空間,串空間,*p的含義)

考得較多

char*pc,s[20],

pc=s;Dc=pc+i;*DC;

>pc[i],通過(guò)指針訪(fǎng)問(wèn)字符數(shù)組中的字符

>pc通過(guò)指針訪(fǎng)問(wèn)一維字符數(shù)組整體

cout?pc;輸出的是pc指向的字符串,而不是地址

cout?*pc;輸出的是pc指向的字符

字符串處理函數(shù)的參數(shù)為字符串首地址,即字符串中第1個(gè)

字符的地址。

(例子)

charsl[10]=M123H,s2[10]=MabcH;

strcpy(si+2,s2+l);

printf(M%s,\si);〃輸出21bc

cout?sl+1;〃輸出2bc

cout?strlen(sl+l);//輸出3

strcpy(sl,Hwl23H);

strcpy(s2,nerwl23H);

cout?strcmp(sl+l,s2+3);〃輸出0

(例子)

設(shè)有說(shuō)明語(yǔ)句:

chars[]=n123\t456\00089M,*p=s;

執(zhí)行以下兩個(gè)語(yǔ)句:

printf("%c\n”,*(p+5));

printf(w%s,\p+5);

則輸出分別為和?!ù鸢福?56

(例子)

設(shè)有語(yǔ)句:

inti;char*s=Ha\04+04\,\0V\bH;

for(i=0;*s++;i++);

執(zhí)行以上語(yǔ)句后,變量i的值為o//6

若改為:

inti;char*s=Ha\08+04V\0V\bH;

for(i=0;*s++;i++);

則執(zhí)行以上語(yǔ)句后,變量i的值為:1

(例子)//include<iostream.h>

#include<string.h>

voidswap(char*sl,char*s2)

(

chart;

t=*sl;*sl=*s2;*s2=t;

)

voidmain()

(

charsl[]=HBDH,s2[]=HBCH,s3[]=HABn;

if(strcmp(sl,s2)>0)swap(sl,s2);

if(strcmp(s2,s3)>0)swap(s2,s3);

if(strcmp(sl,s2)>0)swap(sl,s2);

printfCt%s\n,\si);//第一行輸出AD

printfC<%s\n,\s2);//第二行輸出BC

printfr%s\n,\s3);//第三行輸出BB

)

(練習(xí))下列程序的輸出結(jié)果是

#include<iostream>

usingnamespacestd;

intmain()

chara[]=HHello,Worldn;

char*ptr=a;

while(*ptr)

(

if(*ptr>=,a,&&*ptr<=,zf)

cout?char(*ptr+,A,-,a,);//字符的大小寫(xiě)轉(zhuǎn)換

else

cout?*ptr;

ptr++;

)

return0;

)

A)HELLO,WORLDB)Hello,World

C)hELLO,WORLDD)hello,world

26.常用字符串處理函數(shù)

(strlen,strcpy,strcat,strcmp等)

(另外還要會(huì)自己編寫(xiě)字符串處理函數(shù),實(shí)現(xiàn)系統(tǒng)的字符串

處理函數(shù)相同的功能。)見(jiàn)實(shí)驗(yàn)手冊(cè)算法總結(jié)

27.二維數(shù)組的定義和存放形式、做函數(shù)參數(shù)(實(shí)參和形參)

考得較少,

inta[4][5];

int(*P)[5];1intrp)[5]=a;〃兩行等價(jià)于一行

p=a;.

第i行第j列元素的值

*(*(a+i)+j),*(*(p+i)+j),

*(a[i]+j),*(p[i]+j),

(*(a+i))U],(*(p+i))U],

第i行第j列元素的地吟&p[i][j],

(*(a+i)+j,*(p+i)+j,

元素指針

行指針:如a,p,

加1,移動(dòng)一行元素位置(大元素)

歹U指針(元素指針):如a[i],*(a+i),*(p+i),*p

加b移動(dòng)一列(一個(gè))元素位置

行指針前加*變?yōu)榱兄羔?/p>

(例子)有以下定義inta[3][4],(*p)[4]=a;

對(duì)數(shù)組元素的錯(cuò)誤引用是

A)B)*(p+l)[2]

C)*(p[2]+3)D)*(a[l]+l)

E)r(P+i))[2j

?二維指針做參數(shù):注意形參的寫(xiě)法(形參是指針變量)

而I十一熱將加4W一寺七面二維數(shù)組形參可等價(jià)地寫(xiě)成:

例:求一維數(shù)組全體兀素之和.

inttotal(int(*p)[4],intn)//n行數(shù).P

{或:mtp[3]|4]

inti,j,sum=O;

for(i=0;i<n;i++)

for(j=0;j<4;j++)

sum+=*(*(p+i)+j);

returnsum;〃在被調(diào)函數(shù)中可以:p++,

因?yàn)镻是一個(gè)指針變量

)

voidmain(void)

{inta[3][4]={.....},sum;

sum=total(a,3);

cout?sum?endl;

28.二維字符數(shù)組

(例子)

#include<iostream.h>

//include<string.h>

intisvowel(charc)〃判斷c是否為元音字母

{return(c==,a,||c==,e,||c=='i'||c=='o'||c=='u');}

voidpluralize(char*s)〃使成復(fù)數(shù)

(

intlen=strlen(s);

char*p=s+len-l;

char*q=s+len-2;

if(*p==,hf&&(*q=='c'||*q=='s'))strcat(p,"esH);

//strcat函數(shù)實(shí)現(xiàn)兩個(gè)字符串的拼接

elseif(*p=='s')strcat(p,HesH);

elseif(*p=='y')

if(isvowel(*q))strcat(p,HsH);

elsestrcpy(p,HiesH);

elseif(*p==,z,)

if(isvowel(*q))strcat(p,HzesH);

elsestrcat(p,nesH);

elsestrcat(p,MsH);

voidmain(void)

(〃二維字符數(shù)組,6個(gè)子串。

charword[6][20]={"wish'',''bus","toy",

"navy'',"quiz",''computer"};

for(inti=0;i<6;i++)

pluralize(word|i]);//word[i]是第i行字符串的指針

printf(<t%s\f,,word[i]);

if((i+l)%2==0)printf('\n');

}

)

程序輸出第一行是—,第二行是—,第三行是—0

答案:

wishesbuses

toysnavies

quizzescomputers

另外:參見(jiàn)教材P156,例9.29和例9.30,尤其是例9.30。

〃例9.30改寫(xiě)例9.29,學(xué)習(xí)如何使用指針數(shù)組做函數(shù)參數(shù)。

#include<iostream.h>

#include<string.h>

voidmain()

(

voidsort(char*[],int),print(char*[],int);

〃函數(shù)原型說(shuō)明,因?yàn)楹瘮?shù)定義在后

char*name[]〃指針數(shù)組★

={HGeorgeH,MMaryn,HSusanH,nTomn,HDavisH};

intn=5;

sort(name,n);

print(name,n);

)

voidsort(char*name[],intn)〃函數(shù)定義,注意參數(shù)的寫(xiě)法

{

char*ptr;inti,j,k;

for(i=0;i<n-l;i++)

(

k=i;

for(j=i+l;j<n;j++)

if(strcmp(name[k],name[j])>0)k=j;

if(k!=i)

{ptr=name[i];name[i]=name[k];name[k]=ptr;}

)

)

voidprint(char*name[],intn)

〃函數(shù)定義,注意參數(shù)的寫(xiě)法

(

for(inti=0;i<n;i++)

cout?name[i]?endl;

29.將二維數(shù)組看成一維數(shù)組訪(fǎng)問(wèn)

(例子)若有變量說(shuō)明:

inta[3H3]={l,2,3,4,5,6,7,8,9},m,*ptr=&a[O][OJ;

執(zhí)行語(yǔ)句:

m=(*ptr)*(*(ptr+3))*(*(ptr+6));貝!]m的值為:

A)8B)21C)28D)48

(例子)若有如下的說(shuō)明和語(yǔ)句:

inta[7][8],*ip;ip=(int*)a;

使指針ip指向a[4]⑹的正確答案是:

A)ip+=3*8+6B)ip+=(3*8+6)*size

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論