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

下載本文檔

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

文檔簡介

C++筆試部分要點:

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

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

②以英文字母或下劃線開頭,不能是保留字

(例子)下列符號中可以用作C++標識符的是

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

常見錯誤及注意事項:

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

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

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

④保留字(如if、while等)不能作為標識符

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

保留字,它們可以被用作標識符。

如,下列程序合法:

//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.各種類型常量書寫規(guī)范

0650X9A0X9AL45L45135U35u

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

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

Tn3"string”

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

常見錯誤:

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

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

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

④5.3e4.2,指數(shù)部分寫成了帶小數(shù)點的實型數(shù)

⑤fabcS單引號中括多個字符

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

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.基本類型數(shù)據(jù)在內(nèi)存中的長度以及存放形式:

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

實型數(shù)據(jù):浮點形式存儲

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

即所有指針類型的變量的長度都是2o

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

char,int,short,long,

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

signedchar,signedint,signedshort,signedlong,

unsignedchar,unsignedint,unsignedshort,unsignedlong

均可用作整型量

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

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

擴展原則:若短數(shù)據(jù)為無符號型,則前面補0(unsigned)

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

(例子)短一長

已知216=65536,請寫出下列程序段的輸出。

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

65538是長整型常量

65538:00000000000000010000000000000010

i:0000000000000010

(例子)請寫出下列程序段的輸出。長一短

voidmain()

charcl=-3;unsignedcharc2=-3;/*短―長*/

intal=cl,a2=c2;/*長―短*/

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

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

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

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

5.類型轉(zhuǎn)換(賦值時的類型轉(zhuǎn)換,混合運算時的類型轉(zhuǎn)換)

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

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

A.1B.12

C.22D.22.5

【解析】

若兩個量都是整型,則運算結(jié)果應是整型量。

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

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

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

答案:2.5

(例子)設有語句:

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

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

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

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

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

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

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

②表達式類型是int型

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

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

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

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

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

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

【解析】

圖2-3混合運算類型轉(zhuǎn)換原則

doubleY-----float

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

,t

long

A

1.,

unsigned

A

.J

intv—-char,short

問題:

①表達式3+5的類型?int型

②sizeof(3+5)的值?2

③coutvv(3+5)vvendl;104

(因為和的碼分別是和

④35ASCII5153)

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

⑥sizeof(3)的值?2

⑦sizeof(3)的值?1

cout?3*?endl;3

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

6.表達式的計算

(逗號表達式,賦值表達式,邏輯表達式優(yōu)化,關系表達式,

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

(例子)設定義了說明語句:

intk,j;

下列選項中,沒有語法錯誤的表達式是O

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

【解析】

A.++不能作用于表達式

B.C.賦值表達式的左值不能是表達式。

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

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

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

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

值為0的表達式是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語句cout?m?,,,?n?,,,?k?endl;

輸出的是o

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

(例子)若有語句

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

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

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

答案:1,1,1

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

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

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

(“或”運算的前一個值若為真,則后一個表達式不算)

(“與”運算的前一個值若為假,則后一個表達式不算)

(例子)請寫出下列程序段的輸出。

intx=-5;

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

T

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

else

printf(H###\n");

本題答案:輸出***

表示數(shù)學關系0<x<10的正確寫法為:ivx&&x<10

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

不能寫成:'A,v=chv=Z

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

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

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

C.a3=078D.a4=0Xa2

解析:

%要求運算量為整型

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

078是非法常量

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

(例子)

設有語句:

inti=10,j=10;

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

elsei=i+j;

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

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

可),則輸出100;

(例子)

設有語句:

inti=10,j=0;

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

elsei=i+j;

執(zhí)行以上語句后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

(例子)有語句:

inty=100;

while(y--

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

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

C)y=1D)y=-1

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

答案:i=U

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

(例子)以下程序輸出

intx=5,y=6;

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

cout?y?endl;

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

(例子)

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

(

(*a)++;

*b++;//等價于*(b++),表達式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ù)傳遞時,有int*a=cl;int*b=c2;

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

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

)

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

〃答案:205111204051

lO.if語句的語義(else的匹配問題)

(例子)寫出程序的輸出

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匹配,而不是靠書

寫對齊來匹配

(例子)寫出程序的輸出

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

if(a==b)

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

elseprintf(Ha!=b\nH);

答案:無輸出

整型、枚舉類型或

11.switch語句---字符型

switch俄達

case

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

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

default:...

注意:“表達式”中可以有變量。“常數(shù)i”只能是常數(shù)表達

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

(例子)

設變量a,b是整型變量,下列switch語句中,語法正確的

是:

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語句中的條件表達式缺省,則條件為永“真

(例子)設el和e3是表達式,與語句for(el;;e3)s;等同的

語句是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ù)

(例子)設有循環(huán)語句:

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

(

tt,,

scanf(%d?&x);

s+=x;

)

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

_____次。

答案:101

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

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

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

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

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

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

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

省考試中心給出的標準答案是D(我們題目錄入錯誤)

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

32769次。

y實際變化的過程是:

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é)束。

為了驗證了上述觀點,修改上述程序:

#include<stdio.h>

main()

(

intx,y;

longcount=0;//count用于統(tǒng)計循環(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)語句或switch語句中使用的流程控

制語句,表示該語句的關鍵字是

(例子)〃判斷一個二維數(shù)組是否關于主對角線對稱

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跳出哪一個循環(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))〃注意:比較時,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個數(shù),統(tǒng)計正數(shù)個數(shù),并計算正

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

結(jié)束。請?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ù)原型說明,函數(shù)調(diào)用,函數(shù)的返回值

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

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

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

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

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

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

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

B.函數(shù)可通過return語句返回數(shù)據(jù)

C.必須用一個獨立的語句來調(diào)用函數(shù)

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

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

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

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);〃對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ù)逆向求值

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

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.存儲類別,靜態(tài)變量、全局變量的使用

(例子)

下列關于變量的敘述中,不正確的是:

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

種存儲類型

B.自動變量和外部變量的作用域為整個程序文件

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

D.外部靜態(tài)變量的作用域為定義它的文件內(nèi)

(例子)

程序輸出為:

intfun(intk)

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

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.遞歸(如何解決?)畫圖

(D問題的規(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ù)的橫線處填上適當?shù)膬?nèi)容,使該函數(shù)能

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

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

intGetLen(char*str)

{

if([11)return[21;

elsereturnl+GetLen(str+l);

)

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

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

(例子)程序輸出為

#defineMOD(x,y)x%y

voidmain()

(

intz,a=5,b=10;

z=MOD(b+3,a);〃直接簡單代換,不加括號

cout?z++?endl;

)

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

(例子)若有宏定義:

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

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

(例子)設有宏定義和變量說明:

#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間接訪問x,或者說*p與x訪問同一變量。

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

是否同名。(值傳遞)

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

遞)。(指針傳遞)

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

第二種是傳遞。

答案:指針(或地址)

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

#include<iostream.h>

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

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

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

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

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

intx=3,y=9;

swap(x,y);

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

)

輸出?3,9■■

注意

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

#include<iostream.h>

voidswap(int*px,int*py)

〃實參指針和形參指針是不同的指針

{〃參數(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ù)傳遞時,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訪問主函數(shù)中的y。

〃參數(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,使得其中每個元素的數(shù)據(jù)依次為:

3、9、4、8、0、0、0,錯誤的定義語句是

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

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

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

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

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

若A是全局數(shù)組,則其元素值均為0

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

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

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

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

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

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

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

數(shù)組來說,長度是否寫出無關緊要,因為傳遞的是首指針;

對二維數(shù)組來說行數(shù)是否寫出也無關緊要,因為傳遞的是行

指針,對行指針而言,關鍵是一行中有幾個元素,即列數(shù),

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

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

A)用*data可訪問到數(shù)組的首元素〃數(shù)組元素下標從0開始

B)用data[9]可訪問到數(shù)組的末元素

C)用data[10]可訪問到數(shù)組元素會超出數(shù)組邊界〃越界

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

(例子)設定義了宏:

#defineN2

以下定義數(shù)組的選項中,存在語法錯誤的是:

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

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

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

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

//sizeof(a)也是常量

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

訪問數(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;

)

(例子)寫出程序的輸出

#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個元素的值a[i],*(a+i),p[i],*(p+i),p=p+i;*p

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

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

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

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

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

答案:int*p=DATA

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

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

則對數(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ù)組

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

A.charstr[]=nGoodmorning";

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

C.char*p=HGoodmorning”;〃C和D等價

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

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

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”字符串的長度是5,但其存儲空間是6。

(例子)設有說明語句:

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

strlen(s)的值是。

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

而sizeof(s)的值是9o

(例子)以下語句的輸出是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()括號中若是數(shù)組名,則求的是數(shù)組總空間;

若是指針變量,則求的是指針變量自身的長度。

(例子)若有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〃任何類型的指針,長度都是2

則sizeof(b)的值是40

則sizeof(pb)的值是2

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

考得較多

char*pc,s[20],

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

>pc[i],通過指針訪問字符數(shù)組中的字符

>pc通過指針訪問一維字符數(shù)組整體

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

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

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

字符的地址。

(例子)

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

(例子)

設有說明語句:

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

執(zhí)行以下兩個語句:

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

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

則輸出分別為和。〃答案:556

(例子)

設有語句:

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

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

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

若改為:

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

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

則執(zhí)行以上語句后,變量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

)

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

#include<iostream>

usingnamespacestd;

intmain()

chara[]=HHello,Worldn;

char*ptr=a;

while(*ptr)

(

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

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

else

cout?*ptr;

ptr++;

)

return0;

)

A)HELLO,WORLDB)Hello,World

C)hELLO,WORLDD)hello,world

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

(strlen,strcpy,strcat,strcmp等)

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

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

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

考得較少,

inta[4][5];

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

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,移動一行元素位置(大元素)

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

加b移動一列(一個)元素位置

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

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

對數(shù)組元素的錯誤引用是

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

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

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

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

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

例:求一維數(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++,

因為P是一個指針變量

)

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)〃使成復數(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ù)實現(xiàn)兩個字符串的拼接

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個子串。

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

另外:參見教材P156,例9.29和例9.30,尤其是例9.30。

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

#include<iostream.h>

#include<string.h>

voidmain()

(

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

〃函數(shù)原型說明,因為函數(shù)定義在后

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

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

intn=5;

sort(name,n);

print(name,n);

)

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

{

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ù)的寫法

(

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

cout?name[i]?endl;

29.將二維數(shù)組看成一維數(shù)組訪問

(例子)若有變量說明:

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

執(zhí)行語句:

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

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

(例子)若有如下的說明和語句:

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

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

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

溫馨提示

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

評論

0/150

提交評論