資源描述:
《C++筆試要點(代C語言要點)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
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等)不能作為標識符⑤但編譯預(yù)處理命令(如include、define、main等)不是保留字,它們可以被用作標識符。如,下列程序合法:#includevoidmain()(intinclude;cin?include;cout?include?endl;)#includevoidmain()(intmain;cin?main;cout?main?endl;#includevoidmain(){
1intdefine;cin?define;cout?define?endl;}2.各種類型常量書寫規(guī)范0650X9A3.26F3.4f'CヘビV,ヽ,,,,ヽ,,,、、,0X9AL45L45135U35u2.3E822.3e-45.3e4'\24'MOI1'\x4.99a'"string”空字符へ0,,空格,1,空串””常見錯誤:①ハ進制數(shù)048,0后面跟大于?的數(shù)字②,\038T、0后面跟大于7的數(shù)字③十六進制數(shù)OxaG,Ox后面跟大于f/F的字符④5.3e4.2,指數(shù)部分寫成了帶小數(shù)點的實型數(shù)⑤-abcS單引號中括多個字符(例子)以下合法的常量是A)''28'B)'OXAB'C)2.3E8.0D)”ab\Ocd”#includemain()(printf(n%d,%d
2n,strlen(nab\Ocdn),sizeof(nab\Ocdn));)輸出2,63,基本類型數(shù)據(jù)在內(nèi)存中的長度以及存放形式:整型數(shù)據(jù):補碼形式存儲正整數(shù)的補碼與原碼相同實型數(shù)據(jù):浮點形式存儲sizeof(char)=sizeof(unsignedchar)1字節(jié)sizeof(short)=sizeof(unsignedshort)2字節(jié)sizeof(int)=sizeof(unsigned
3int)2字節(jié)sizeof(Iong)=sizeof(unsignedlong)4字節(jié)sizeof(float)4字節(jié)sizeof(double)8字節(jié)sizeof(char*)=sizeof(int*)=sizeof(float*)=...=2即所有指針類型的變量的長度都是2〇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ù)為無符號型,則前面補〇(unsigned)若短數(shù)據(jù)為有符號型,則前面補符號位(例子)短ー長已知2"=65536,請寫出下列程序段的輸出。inti=65538;cout?i?,
4,;輸出265538是長整型常量65538:00000000000000010000000000000010i:0000000000000010(例子)請寫出下列程序段的輸出。長一短voidmain()charcl=-3;unsignedcharc2=-3;/?短ー長?/intal=cl,a2=c2;/?長一短?/
5cout?al?,,,?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)換)(例子)設(shè)有語句:for(ints=l,i=2;i<=6;i++)s*=i/2;執(zhí)行該語句后,S的值是〇A.1B.12C.22D.22.5【解析】若兩個量都是整型,則運算結(jié)果應(yīng)是整型量。i/2的結(jié)果應(yīng)是整型量,如i=3,貝リレ2的結(jié)果應(yīng)是1。(例子)已知x=2.5,a=7,y=4.7求x+a%3*(int)(x+y)%2/4的值答案:2.5(例子)設(shè)有語句:chars[]=H246n,*ptr=s;cout?(char)(*(ptr+l)+l)?,
6,;執(zhí)行以上語句后,輸出〇A.5B.6C.46D.56①coutw(*(ptr+l)+l)vv,
7二輸出什么?
8②表達式(*(ptr+l)+l)的類型是什么?答案:①輸出53(%,的ASCH碼)②表達式類型是int型(例子)設(shè)有變量說明:inta=O,b=0;則表達式sizeof「a+b,)的值為:A.1B.2C.4D.8(例子)設(shè)有變量說明:floata=0,b=0;則表達式sizeof(a+b)的值為:A.1B.2C.4D.8【解析】橫向:必定轉(zhuǎn)換圖2-3混合運算類型轉(zhuǎn)換原則doubleAvfloat,tlongA1.ハunsignedA.Jint一-chai;short問題:①表達式3+5的類型?int型②sizeof(3+5)的值?2(3)coutv〈C3屮5,)vvendl;104(因為3和5的ASCII碼分別是5I和53)④sizeof(*a**?b*)的值為?2⑤sizeof(3)的值?2⑥sizeof(3)的值?1⑦cout?3*?endl;3(8)cout?int(,3,)?endl;51
96.表達式的計算(逗號表達式,賦值表達式,邏輯表達式優(yōu)化,關(guān)系表達式,整數(shù)求余%,整數(shù)整除/)(例子)設(shè)定義了說明語句:intk,j;下列選項中,沒有語法錯誤的表達式是〇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(例子)設(shè)有變量說明:inta=3,b=4,c=5;下列表達式中,值為〇的表達式是。A.B.a<=bC.a||b+c&&b-cD.!(ax)||(m=x10答案:1,1,1以上兩題適用于如下規(guī)則邏輯運算優(yōu)化規(guī)則:不管優(yōu)先級,從左至右掃描,若I!前為“真”,或者&&前為“假”,則停止。(“或”運算的前ー個值若為真,則后一個表達式不算)(“與”運算的前ー個值若為假,則后一個表達式不算)(例子)請寫出下列程序段的輸出。intx=-5;if(011n);本題答案:輸出***表示數(shù)學關(guān)系OvxvlO的正確寫法為:kx&&xvlO另外還有:,AY=ch&&ch<=1Z1不能寫成:'Ay=chv=Z(例子)若al,a2,a3和a4均為整型變量,則以下選項中,符合C++語法規(guī)則的表達式是〇A.al=25%3.3B.a2=al+a3=3*5C.a3=078D.a4=0Xa2解析:%要求運算量為整型+比=優(yōu)先級高078是非法常量6.=與=的區(qū)別(例子)
12設(shè)有語句:inti=10,j=10;if(j=O)i=i*i;elsei=i+j;執(zhí)行以上語句后i的值為〇〃答案:10。J被賦值是〇,所以if里面是。,為假,若J被賦值是12(非零量即可),則輸出I00;(例子)設(shè)有語句:inti=10,j=0;if(j==O)i=i*i;elsei=i+j;執(zhí)行以上語句后i的值為〇//1006.前后綴++,(例子)執(zhí)行以下程序段后,輸出結(jié)果是〇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?ny=n?y?n
13n;其輸出為:A)y=0B)while構(gòu)成無限循環(huán)C)y=1D)y="I(例子)i=5;while(i++<10);運行結(jié)束后i=?答案:i=ll
146.運算符的優(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?,\f?*b?endl;)voidmain(void){intcl網(wǎng)={地20,30},c2[3]={40,50,60};fun(cl,c2);〃參數(shù)傳遞時,有int*a=cl;int*b=c2;cout?cl[0]?,\t,?cl[l]?endl;cout?c2[0]?,\t,?c2[l]?endl;)程序輸出的第一行是,第二行是第三行是〃答案:20511120405110.1f語句的語義(else的匹配問題)(例子)寫出程序的輸出voidmain(){intx=2,y=-1,z=2;if(x15if(y<0)z=0;elsez+=l;cout?z?,
16,;}C)1D)0A)3B)2【解析】else與距它最近的尚未匹配的if匹配,而不是靠書寫對齊來匹配(例子)寫出程序的輸出inta=l,b=2,c=3;if(a==b)if(b==c)printf(na=b=c
17n);注意:“表達式”中可以有變量?!俺?shù)i”只能是常數(shù)表達式,如,a1或3+2或3+N等,N是已定義的符號常數(shù)。(例子)設(shè)變量a,b是整型變量,下列switch語句中,語法正確的是:A.switch(a){casea:a++;break;caseb:b++;break;
18)A.switch(a+b){case1:b=a++;break;case1:a=-H-b;)B.switch(a*a){case10,12:++a;case14,16:++b;)C.switch(a/10+b){case3:b=a/10;break;default:a+=b;}(例子)#includevoidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y)?一\{case0:a++;break;jcase1:b++;breakj^^^case2:a++;b++;break;)cout?,,a=,,?a?,,,b=,,<19,;程序輸出為:A)a=2,b=lB)a=l,b=lC)a=l,b=0D)a=2,b=2
20(例子)voidmain(void){charc,*s="1234”;while(c=*s++)switch(c-'O'){case0:case1:printf("%c”,c+1);case2:printf("%c
21”,c+2);break;default:printf("%c
22",c+3);break;)printf("
23”);}程序的輸出的第一行是〇答案:23程序的完整輸出是:23467(例子)以下程序若輸入china#則輸出〃5,5voidmain()intvl=0,v2=0;charch;while(ch=getchar())!=*#*)switch(ch)|case'a':case'h':default:vl++;case’〇’:v2++;)
24cout?vl?','?v2?endl;)12.循環(huán)(1)for語句中的條件表達式缺省,則條件為永“真”。(例子)設(shè)el和e3是表達式,與語句for(el;;e3)s;等同的語句是〇A.for(el;el;e3)sB.for(el;e3;e3)sC.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)語句:for(inti=0,x=0,s=0;i<=9&&x!=55;i++){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++);正確的程序是這樣
25A.無次數(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ù)應(yīng)該是32769次。y實際變化的過程是:y=0(0000000000000000)y=-l(1111111111111111)y=-2(1111111111111110)y=-32768(-215)其內(nèi)存內(nèi)容是:(1000000000000000)再次減1,發(fā)生溢出(即比int型數(shù)值的下限還要小),y變?yōu)?(0111111111111111)值為32767(2J)即int型數(shù)值的上限。此yv=5不成立,循環(huán)結(jié)束。為了驗證了上述觀點,修改上述程序:#includemain(){intx,y;longcount=0;//count用于統(tǒng)計循環(huán)次數(shù)for(x=0,y=0;!x&&y<=5;y)count++;printf(n%ld
26",count);
27輸出:3276912.嵌套循環(huán),循環(huán)中的break,continue(例子)有一種只在循環(huán)語句或switch語句中使用的流程控制語句,表示該語句的關(guān)鍵字是(例子)//判斷一個二維數(shù)組是否關(guān)于主對角線對稱voidmain(void)|inta[4][4]={1,2,3,4,2,2,5,63,5,2,7,4,6,7,4};1234225635274674inti,j,flag=O;for(j=0;j<4;j++)for(i=0;i<=j;i++){if(a|j][i]==a[i][j])continue;〃流程轉(zhuǎn)至リ哪里?if(flag)cout?nNo!n?endl;elsecout?nAllRight!n?endl;}輸出:AllRight!(例子)程序輸出為:#includevoidmain(){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?,,,?i?,,,?j?endl;
28輸出:25,5,6(例子16)#include[T20-13-2-3。40-55-6601_voidmain(void){inta[4][4J={{l,2,0,-1},{3,-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[i][j];}cout?s?endl;)程序的輸出是〇輸出:16(例子)voidmain(){intx=3,y=6,a=0;while(x++!=(y-=l))〃注意:比較時,x,y的值{a+=1;//比較后,x,y的值if(yvoidmain(){inti,a[20],sum,count;
29sum=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?nsum=n?sum?,\t,?,,count=,,?count?endl;)12.函數(shù)原型說明,函數(shù)調(diào)用,函數(shù)的返回值(例子)下列關(guān)于C++函數(shù)的敘述中,正確的是A)每個函數(shù)至少要具有一個參數(shù)B)每個函數(shù)都必須返回一個值〇函數(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);
30C.voidi3(int,int);D.intf4(intx;inty);15.函數(shù)的聲明原則:正確程序如下:#includeusingnamespacestd;intmain()(floatadd(floatx,floaty);floata,b,c;cout?,fpleaseentera,b:cin?a?b;c=add(a,b);coutvv"sum="?c?endl;return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);或者:#includeusingnamespacestd;floatadd(floatx,floaty){floatz;z=x+y;return(z);)intmain()(floata,b,c;cout?"pleaseentera,b:"cin?a?b;c=add(a,b);cout?"sum="?c?endl;return0;〃對add函數(shù)作聲明〃調(diào)用add〃定義add函數(shù)〃定義add函數(shù)〃調(diào)用add16.函數(shù)參數(shù)逆向求值
31(例子)寫出以下程序的輸出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("%d%d%d
32”,a++,a++,a++);}輸出:543F從后向前17.存儲類別,靜態(tài)變量、全局變量的使用(例子)下列關(guān)于變量的敘述中,不正確的是:A.C++語言中將變量分為auto,static,extern和register四種存儲類型B.自動變量和外部變量的作用域為整個程序文件C,函數(shù)內(nèi)定義的靜態(tài)變量的作用域為定義它的函數(shù)體D,外部靜態(tài)變量的作用域為定義它的文件內(nèi)(例子)程序輸出為:intfun(intk)
33{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+4-)?*\t*;cout?,
34,;)答案:3717.遞歸(如何解決?)畫圖(1)問題的規(guī)模向終結(jié)逼近(2)終結(jié)條件(例子)程序輸出為#includevoidfunc(charc){printf("%c",c);if(c〈’3')func(c+1);printf("%c",c);)voidmain(){func(’〇’);}答案:01233210(例子)#includeintm=10;voidfun(intn){m+=m;if(n<=l)cout?m?,
35,;
36else{fun(n-l);m+=m;cout?m?,
37,;)}voidmain(void){fun(3);fun(5);}程序輸出的第一行至第三行分別是ヽヽ0答案:80160320(例子)#includeintf(intn,intx){x+=l;if(n==3)returnx;elsereturnx+f(n+l,x+1);)voidmain(void){cout?f(3,l)?endl;cout?f(2,l)?endl;cout?f(l,l)?endl;eout?f(0,l)?endl;}程序輸出的四行分別是ーヽーヽー和一〇答案:261220(例子)在下面函數(shù)的橫線處填上適當?shù)膬?nèi)容,使該函數(shù)能夠利用遞歸方法求解字符串str的長度(不得使用系統(tǒng)提供的字符串處理函數(shù))。
38intGetLen(char*str)(if(L11)return[21;elsereturnl+GetLen(str+l);}答案:【1]!str[O]或str[O]==,\O,[2]017.宏代換,技巧:“一定要手工寫出代換結(jié)果”(例子)程序輸出為#defineMOD(x,y)x%yvoidmain(){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(例子)設(shè)有宏定義和變量說明:#defineT(x,y)x+yinta=T(3,4)*T(3,5);則變量a的初值為//2020.指針的意義,函數(shù)參數(shù)的形式(傳值調(diào)用)(普通變量、指針、作參數(shù))考得較多定義指針:intx=8,*p;p=&x;*p間接訪問x,或者說?p與x訪問同一變量。>普通變量做參數(shù):對應(yīng)的實參與形參是不同的變量,不管是否同名。(值傳遞)
39>指針做參數(shù):實參指針值賦給形參指針變量(參數(shù)單向傳遞)。(指針傳遞)(例子)在C中函數(shù)參數(shù)傳遞方式有兩種:第一種是值傳遞,第二種是傳遞。答案:指針(或地址)例1:普通變量做函數(shù)參數(shù)#includevoidswap(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ù)參爵ー#includevoidswap(int*px,int*py)〃實參指針和形參指針是不同的指針{〃參數(shù)傳遞時,int*px=pl,int*py=p2Eit=*px;*px=*py;*py=t;}voidmain()intx=3,y=9,*pl,*p2;pl=&x;p2=&y;swap(pl,p2);cout?x?*,*?y?endl;)
40輸出?9,3例3:指針做函數(shù)參數(shù)#includevoidswap(int*px,int*py)〃實參指針和形參指針是不同的指針{〃參數(shù)傳遞時,int*px=&x,int*py=&yint*tp;tp=px;px=py;py=tp;voidmain()(intx=3,y=9;swap(&x,&y);cout?x?,,,?y?endl;}輸出?3,9(例子)#includevoidfun(int*x,inty)/Z參數(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=xcout?*x?,,,?y?endl;}voidmain(void)intx=4,y=5;fun(&y,x);cout?x?,,,?y?endl;fun(&x,y);cout?x?,,,?y?endl;
41}程序輸出的第一行是,第二行是,第四行是〇答案:1,94,11,121.返回指針值的函數(shù)(例子)#includechar*f(char*s,charch){char*p=s,*q=s;while(*q=*p++)if(*q!=ch)q++;//p往后跑的快returns;〃返回的是字符串首指針}voidmain(void){charsl[]=nHelloHowareyou”,§2[]="110010111”;cout?f(sl,,e,)?,
42,;cout?f(s2,,0,)?,
43,;)程序輸出第一行是ー,第二行是ー〇答案:HiloHowaryou111111【解析】函數(shù)f的功能是刪除字符串S中出現(xiàn)的字符Ch。22.ー維數(shù)組的定義、做函數(shù)參數(shù)(參數(shù)的意義和形式)考得較多(例子)要定義數(shù)組A,使得其中每個元素的數(shù)據(jù)依次為:3、9、4、8、〇、〇、0,錯誤的定義語句是A)intA[]={3,9,4,8,0,0,0);
44A)intA[7]={3,9,4,8);//后面的元素值為〇B)intA[1={3,9,4,8);〃數(shù)組長度是4D)intA[7]={3,9,4,8,0,0,0};說明:intA[7];若A是局部數(shù)組,則其元素值不確定若A是全局數(shù)組,則其元素值均為0若有:intA[7]={3};只要給出至少ー個初值,其余元素為0(例子)下列數(shù)組定義中,錯誤的是〇A.intal[2]={l};B.inta2[][2]={{1},{2}};C.inta3|3];D.inta4|][3];【解析】定義數(shù)組時(不論ー維還是二維),必須指定每ー維的大小。要么顯式寫出,要么從給出的初值中能夠判斷維數(shù)的大小。但是,若用數(shù)組做函數(shù)參數(shù),寫形參時,對ー維數(shù)組來說,長度是否寫出無關(guān)緊要,因為傳遞的是首指針;對二維數(shù)組來說行數(shù)是否寫出也無關(guān)緊要,因為傳遞的是行指針,對行指針而言,關(guān)鍵是一行中有幾個元素,即列數(shù),所以形參中列數(shù)必須寫出。(例子)針對數(shù)組定義intdata[101;,下列表述中錯誤的是A)用?data可訪問到數(shù)組的首元素〃數(shù)組元素下標從0開始B)用data[9]可訪問到數(shù)組的末元素C)用data[10]可訪問到數(shù)組元素會超出數(shù)組邊界〃越界C)data共有!0個元素,其首元素是data[l](例子)設(shè)定義了宏:#defineN2以下定義數(shù)組的選項中,存在語法錯誤的是:A.intn;scanf("%d'',&n);inta[n];B.intconstn=5;inta[n];〃n是常數(shù)
45B.inta[2*N+l]〃2*N+1是常量表達式C.inta[]={1,2,3,4,5};doubleb[sizeof(a)];//sizeof(a)也是常量?ー維指針做參數(shù):注意形參的寫法(形參是指針變量)訪問數(shù)組的各種方式!intfsum(int*b,intn)〃或intb[10]{inti,s=0;for(i=0;i(圖)voidfun(float*pl,float*p2,float*s){s=(float*)malloc(sizeof(float));*s=*pl+*(p2++);)voidmain()floata[2]={l.l,2.2};
46floatb[2]={10.0,20.0},*s=a;fun(a,b,s);*s);}程序輸出為:D)1.1A)11.1B)12.1C)21.1?ー維數(shù)組與指針inta[10J;圖加t*P;}而*p=a;p=a;第i個元素的值a[i],*(a+i),p[i],*(p+i),p=p+i;*p第i個元素的地址a+i,&a[i],p+i,&p[i],p=p+i;p(例子)程序中有如下語句for(inti=0;i<5;i++)cout?*(p+i)?w,w;能夠依次輸出int型ー維數(shù)組DATA的前5個元素。由此可知,變量p的定義及初始化語句是。答案:int*p=DATA(例子)有如下定義和語句,其中04iV6,inta[]={1,3,5,7,9,11),*P,i;P=a;則對數(shù)組a的元素地址的正確表示是:A)&(a+i)B)a++C)&(p+i)D)&p[i](例子)#include〃數(shù)組元素逆置,部分元素逆置voidf(int*s,intnl,intn2){intt;while(nl47{t=*(s+nl);*(s+nl)=*(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,o,3);f(p+2,1,6);for(i=l;i<10;i++){if(i%5==0)printf(n
48n);printf(n%dn,a[i]);}printf(n
49n);}程序輸出的第一行是ー,第二行是ー〇答案:32987651023.字符指針初始化,字符指針指向字符數(shù)組(例子)以下四組語句中,不符合C++語法規(guī)則的是A.charstr[]=nGoodmorning";B.charstr[20];str="Goodmorning";C.char*p="Goodmorning";〃C和D等價D.char*p;p="Goodmorning";//字符串的值是其起始地址(例子)若有char*p="Hello";則以下選項中錯誤的是A.chara=*p;//*p是'H,B.char*s=*p;〃*p表示字符,不能賦值給指針sC.char*q=p+2;〃將指針p+2賦值給qD.p=p+2;
5023.strlen和sizeof"China"字符串的長度是5,但其存儲空間是6〇(例子)設(shè)有說明語句:chars[J="ab\0\123\\
5179nstrlen(s)的值是〇A.2B.3C.8D.14而sizeof(s)的值是9〇(例子)以下語句的輸出是〇chars[20]="ATS\0JK\\";cout?strlen(s)?","?sizeof(s)?","〃注意s是數(shù)組名?sizeof("ATS\OJK\
52)?endl;答案:3,20,8(例子)注意字符串的意義:,MT結(jié)尾,strlen(nATS
53O12\l\
54)的結(jié)果是9strlen("ATS\012\l\\")的結(jié)果是6strlen(nATS\0\l\\")的結(jié)果是3chars[20];char*p=s;sizeof(p)?sizeof(s)?答案:220sizeof()括號中若是數(shù)組名,則求的是數(shù)組總空間;若是指針變量,則求的是指針變量自身的長度。(例子)若有doublea[3H4];則sizeof(a)的值是〇A.7B.12C.48D.96(例子)inta[3][4];intb[10];int(*pa)[4]=a,*pb=b;
55則sizeof(a)的值是48則sizeof(pa)的值是2〃任何類型的指針,長度都是2則sizeof(b)的值是40則sizeof(pb)的值是225.字符指針的意義(指針空間,串空間,*p的含義)考得較多char*pc,s[20],pc=s;pc=pc+i;*pc;>pc[i],通過指針訪問字符數(shù)組中的字符>pc通過指針訪問ー維字符數(shù)組整體cout?pc;輸出的是pc指向的字符串,而不是地址cout?*pc;輸出的是pc指向的字符字符串處理函數(shù)的參數(shù)為字符串首地址,即字符串中第1個字符的地址。(例子)charsl[10]="123n,s2[10]=nabcn;strcpy(sl+2,s2+l);〃輸出I2bc〃輸出2bcprintf(M%s,,>si);cout?sl+1;cout?strlen(sl+l);〃輸出3strcpy(sl,nwl23n);strcpy(s2,**erwl23H);cout?strcmp(sl+l,s2+3);〃輸出0(例子)設(shè)有說明語句:chars[]=**123\t456\00089**,*p=s;執(zhí)行以下兩個語句:printf("%c
56”,*(p+5));printf("%s”,p+5);則輸出分別為和〇〃答案:556
57(例子)設(shè)有語句:inti;char*s=na\04+04V\0V\bn;for(i=0;*s++;i++);執(zhí)行以上語句后,變量i的值為〇//6若改為:inti;char*s="a\08+04\,\0V\bH;for(i=0;*s++;i++);則執(zhí)行以上語句后,變量i的值為:1(例子)#include#includevoidswap(char*sl,char*s2)(chart;t=*sl;*sl=*s2;*s2=t;}voidmain(){charsl[]=”BD”,s2[]=”BC”,s3[]=”AB”;if(strcmp(sl,s2)>0)swap(sl,s2);if(strcmp(s2,s3)>0)swap(s2,s3);if(strcmp(sl,s2)>0)swap(sl,s2);printf("%s
58”,si);/Z第一行輸出ADprintf("%s
59”,s2);//第二行輸出BCprintf("%s
60",s3);/Z第三行輸出BB)(練習)下列程序的輸出結(jié)果是#include
61usingnamespacestd;intmain(){chara[]="Hello,Worldn;char*ptr=a;while(*ptr)(if(*ptr>='a'&&*ptr<=,z,)cout?char(*ptr+,A,-,a,);〃字符的大小寫轉(zhuǎn)換elsecout?*ptr;ptr++;}return0;)A)HELLO,WORLDB)Hello,WorldC)hELLO,wORLDD)hello,world26.常用字符串處理函數(shù)(strlen,strcpy,strcat,strcmp等)(另外還要會自己編寫字符串處理函數(shù),實現(xiàn)系統(tǒng)的字符串處理函數(shù)相同的功能。)見實驗手冊算法總結(jié)27.二維數(shù)組的定義和存放形式、做函數(shù)參數(shù)(實參和形參)考得較少,inta[4][5];intCp),51;\int(*p)[5]=a;〃兩行等價于一行P=a:一p[i]UL*(*(p+i)+j),*(p[i]+j),(*(p+i))LH,第i行第j列元素的值a[il[j],*(*(a+i)+j),(*(a+i))|j|,第i行第j列元素的地址イ(*(a+i)+j,*(p+i)+j,
62"べ川+j,P【i]+j,ノ元素指針行指針:如a,p,加1,移動一行元素位置(大元素)歹!]指針(元素指針):如a[i],*(a+i),*(p+i),*p加1?移動一列(ー個)元素位置行指針前加?變?yōu)榱兄羔?例子)有以下定義inta[3][4],(*p)[4]=a;對數(shù)組元素的錯誤引用是A)p[01H]B)*(p+l)[2]C)*(p[2]+3)D)*(a[l]+l)E)(*(p+D)[2]?二維指針做參數(shù):注意形參的寫法(形參是指針變量)例:求二維數(shù)組全體元素之和二維數(shù)組嘴:等價地寫成:inttotal(int(*p)[4],intn)//n行數(shù)?:。{或:intp[3][4]inti,j,sum=O;for(i=0;i6328.二維字符數(shù)組(例子)#include#includeintisvowel(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=='h'&&(*q=='c'||*q=='s'))strcat(p,"es");//strcat函數(shù)實現(xiàn)兩個字符串的拼接elseif(*p==,s,)strcat(p,"esn);elseif(*p=*y*)if(isvowel(*q))strcat(p,"s");elsestrcpy(p,”ies'‘);elseif(*p=*z*)if(isvowel(*q))strcat(p,nzesn);elsestrcat(p,nesn);elsestrcat(p,**sH);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("%s\t”,word[i]);if((i+l)%2==0)printf(*
64*);))程序輸出第一行是ー,第二行是ー,第三行是ー〇
65答案:wishesbusestoysnaviesquizzescomputers另外:參見教材P156,例9.29和例9.30,尤其是例9.30?!ɡ?.30改寫例9.29,學習如何使用指針數(shù)組做函數(shù)參數(shù)。#include#includevoidmain(){voidsort(char*[],int),print(char*[],int);〃函數(shù)原型說明,因為函數(shù)定義在后char*name[]〃指針數(shù)組★={"George","Mary",“Susan","Tom","Davis"};intn=5;sort(name,n);print(name,n);)voidsort(char*name[],intn)〃函數(shù)定義,注意參數(shù)的寫法{char*ptr;inti,j,k;for(i=0;i0)k=j;if(k!=i){ptr=name[i];name[i]=name[k];name[k]=ptr;}))voidprint(char*name[],intn)〃函數(shù)定義,注意參數(shù)的寫法
66{for(inti=0;i6728.函數(shù)指針做參數(shù)(例子)#includedoublefl(doublex)(returnx+x;)doublef2(double(*f)(doublex),inta){intx;doublesum=0;for(x=a;x<=a+l;x++)sum+=f(x)*f(x);returnsum;}voidmain(void){doublesum;for(inti=l;i<5;i++){sum=f2(fl,i);cout?sum?endl;}}程序輸出的四行分別是ヽヽ和〇答案:2052100164(例子)#includeintfl(int&x){returnx++;}intf2(int(*f)(int&),inty){intsum=O,count=0;for(inti=0;i<=y;i++){sum+=f(i)+f(i);count++;cout?sum?endl;
68)returncount;)voidmain(void){intcount;count=f2(fl,5);cout?count?endl;)程序輸出的第一行是,第二行是第三行是答案:18228.關(guān)于typedef>typedef為ー個已存在的數(shù)據(jù)類型名,提供ー個新的等價名。例如:typedefintINTEGER;〃注意:有分號〃指定用標識符INTEGER代表int類型typedefdoubleREAL;〃注意:有分號〃指定用標識符REAL代表double類型則,以下兩行等價:inti,j;doublea,b;INTEGERi,j;REALa,b;>為數(shù)組類型定義新類型名。例如:若有typedefintARRAY[100|;/*ARRAY為整型數(shù)組類型*/貝リARRAYa;等價于inta[100];>可以為結(jié)構(gòu)體等類型定義新名。例如,若有:typedefstructdate{
69intmonth;intday;intyear;}DATE;為結(jié)構(gòu)體類型structdate起了一個新的名字DATE〇DATE是ー個數(shù)據(jù)類型名,可以定義變量和指針:DATEbirthday;〃相當于structdatebirthday;DATE*p;〃相當于structdate*p;A當然也可以為指針類型定義新名。若有:typedefint*IPTR;則IPTRp;等價于int*p;>定義字符指針若有typedef[har|STRING;STRINGp,s|10];相當于定義char*p,*s[10];說明:(1)typedef可以聲明各種新的類型名,但不能用來定義變(2)typedef只是增加類新的類型名,但沒有創(chuàng)造新的類型。(3)常用typedef聲明一些數(shù)據(jù)類型,把它們單獨放在ー個頭文件中,然后在需要用到它們的文件中用#include命令把它們包含進來,以提高編程效率。(4)使用typedef有利于程序的通用與移植。33.結(jié)構(gòu)體變量,結(jié)構(gòu)體成員的訪問(練習)與成員訪問表達式p->name等價的表達式是〇//(*p).name例如:structStudent
70{charname[20];structStudentst,*p;p=&st;st.name<=>p->nanieg(*p).name33.枚舉類型、枚舉變量、常量(例子)已知枚舉類型定義語句為:enumToken{NAME,NUMBER,PLUS=5,MINUS,PRINT=10}t;則下列敘述中錯誤的是A)枚舉常量NAME的值為1B)枚舉常量NUMBER的值為1C)枚舉常量MINUS的值為6D)枚舉常量PRINT的值為!0注意:?枚舉類型的第一個常量默認值是〇。?若重新指定了某個枚舉常量的值,則其后的枚舉常量值默認值依次增加lo?枚舉類型常量的值允許彼此相同。?雖然枚舉常量的值是整數(shù),但不允許使用整數(shù)直接賦值給枚舉型變量,如t=3非法。?枚舉類型量可與整型量進行比較,如t>3合法。文件操作???