10.編一個(gè)程序,將按第9題中加密的字符率(從鍵盤輸入)解密后輸出。
「解」本問(wèn)題編寫的程序是完成上一程序的逆操作。同樣是順序考察輸入字符串,對(duì)滿足要求的字符作恢復(fù)更改。要求是當(dāng)字符減3后是大寫英文字母時(shí),則對(duì)其作減3處理的替換;當(dāng)字符加3后是小寫英文字母時(shí),則對(duì)它作加3的處理。如此做法是有錯(cuò)誤的,程序未考慮原
先不是英文字母,而未被加3或減3處理,但對(duì)它減3或加3后是英文字母時(shí),將被下面的程序轉(zhuǎn)換成英文字母。所以下面的程序不是完成上題程序的逆操作。但沒(méi)有簡(jiǎn)單的辦法能避免這個(gè)錯(cuò)誤。完整程序如下:
# include
# define N 200
main()
{char s[N]; int i;
printf(“Enter string!\n”);
scanf(“%s”,s);
for(i=0;s !=‘\0’;i++)
if(s-3 =‘A’ s-3 =‘Z’)
s-=3;
else if(s+3 =‘a(chǎn)’ s+3 = ‘Z’)
s+=3;
printf(“s=%s\n”,s);
}
5.1 單項(xiàng)選擇題
1.設(shè)有定義“int a=3, b,*p= a;”,則下列語(yǔ)句中使 b不為3的語(yǔ)句是( )
① b=* a; ② b=* p;
③ b=a; ④ b=*a;
「解」定義有 int a=3, b,*p= a;對(duì)b賦值的表達(dá)式有* a、*p、a 、*a.引用變量。的值有兩種方法,一是直接引用a,二是通過(guò)a的指針間接引用a.對(duì)于后者,又有多種表達(dá)方法,通過(guò)指向a的指針p,間接引用a的內(nèi)容,如*p.或通過(guò)求地址運(yùn)算符由變量a得到其指針 a,再由這指針表達(dá)式間接引用 a的內(nèi)容,如* a.所以表達(dá)式* a、*p和a都能引用變量a的值,而使b的值為3.而表達(dá)式。a是錯(cuò)誤的,因?yàn)閍不是指針變量,不能對(duì)它施行取內(nèi)容運(yùn)算符……所以解答是④。
2 .設(shè)指針x指向的整型變量值為萬(wàn),則“printf(”%d\n“,++ *x);”的輸出是( )
① 23 ② 24 ③ 25 ④ 26
「解」若指針變量x指向某個(gè)變量,例如指向變量v,并且變量v的值是25,則表達(dá)式++ *x的值是26.這是因?yàn)楸磉_(dá)式的計(jì)算順序可加圓括號(hào)表達(dá)成(++(*x)),首先是*x,是對(duì)X所指變量V的引用,所以++ *X就是++V.++V是先讓變量V增1,并以增至后的V的值為表達(dá)式++V的結(jié)果,所以其值是 26.所以解答是④。
3.若有說(shuō)明:“ int i,j= 7,*p= i;”,則與“ i=j(luò);”等價(jià)的語(yǔ)句是( )
①i=*p; ②*P=* j;
③i== j; ④i=* *p;
「解」指針變量 p指向變量i時(shí),表達(dá)式i=*p等價(jià)于 i=i;表達(dá)式*p=* j等價(jià)于i=j(luò);而表達(dá)式i= j企圖將整型變量的指針賦給整型變量,這是錯(cuò)誤的;表達(dá)式i=* *p也是一種錯(cuò)誤的表達(dá)式。p是指針,*p是p所指變量j,* *p是企圖將整型變量j當(dāng)作指針,并想通過(guò)j間接引用某個(gè)變量。所以解答是②。