}
「解]程序定義了一個字符數(shù)組s,由給它所賦的字符串初值知,該數(shù)組只有五個元素。程序另定義了字符指針變量p.循環(huán)開始時,先讓p指向數(shù)組的首元素。循環(huán)每次輸出以p所指字符為首字符的字符串,并讓它指向下一個字符。如此反復(fù)循環(huán)四次,所以程序輸出以下內(nèi)容:
ABCD
BCD
CD
D
4.閱讀下列程序,試寫出程序運行的結(jié)果。
main()
{int i,b,c,a[]={1,10,-3,-21,7,13},*p_b,*p_c;
b=C=1;p_b=p_C= a;
for(i=0;i 6; i++)
{ if(b *(a+i)) {b=*(a+i); p_b= a; }
if(c *(a+i)) {c=*(a+i); p_c= a; }
}
i=*a;*a=*p_b;*p_b=i;i=*(a+5);*(a+5)=*p_c;*p_c=i;
printf(“%d,%d,%d,%d,%d,%d\n”, a[O],a[1],a[2],a[3], a[4], a[5]);
}
「解]程序定義了一個整型數(shù)組。,由給它所賦的初值知,該數(shù)組有六個元素。程序另定義了三個整型變量i.b、C和兩個指針變量p_b.p_c.程序首先置變量b和C都為1,p_b和p_c都指向數(shù)組a 的首元素a[0].接著執(zhí)行六次循環(huán),循環(huán)體由兩個if語句。第一個if語句是當(dāng) b的值小于*(a+i)(就是a)時,將*(a+i)的值復(fù)制到b,并讓p_b指向a.這是在a中找最大值,將最大值存于b,最大值元素的指針存于指針變量p_b.第二個if語句是當(dāng)c的值大于*(a+i)(就是a)時,將*(a+i) 的值復(fù)制到c,并讓p_c指向a.這是在a中找最小值,將最小值存于c,最小值元素的指針存于指針變量p_c.循環(huán)結(jié)束后的前三個語句實現(xiàn)最大元素與a[0]交換。接著三個語句是在已經(jīng)過前面交換的基礎(chǔ)上,將最小元與a[5]交換。最后程序順序輸出數(shù)組a的六個元素。所以程序輸出內(nèi)容是:
13, 10,-3, l, 7,-21.
若數(shù)組a的初值由輸入任意指定,上述程序?qū)σ环N特殊情況不能完成功能的要求,即最小元素若是a[0],p_c所指元素已被移到p_b指針?biāo)肝恢?,實際與a[5]交換的不再是數(shù)組中的最小元素,而是最大元素。
5.4 程序設(shè)計題
1.輸人3個整數(shù),按從大到小順序輸出。
「解」存儲輸入的三個整數(shù)可用三個簡單變量,也可用數(shù)組。設(shè)用三個簡單變量x,y,z存儲輸入的三個整數(shù)。另設(shè)若干個指針變量指向存儲輸入數(shù)據(jù)的變量。實現(xiàn)從大到小輸出三個整數(shù)有多種方案,如通過比較交換變量的值,多次比較交換使變量滿足條件x =y =z.這樣,變量的輸入值可能會與它的輸出值不一樣。如通過比較交換指針變量,當(dāng)比較后發(fā)現(xiàn)要交換時,就交換變量的指針,而不交換變量的值,則在比較結(jié)束后,變量的值沒有改變,但從指針方向來看,它們的值是從大到小排列的。下面的程序就采用這種方案。
# include
main()
{ int x,y,z;
int *big= x,*mid= y,*sma= z,/*置三個指針變量分別指向x,y, z*/
*temp;
printf(“Enter x,y,z.\n”);
scanf(“%d%d%d”, big,mid,sma);/*順序為變量x,y,z輸入值*/
if(*big *mid) {temp=big;big=mid; mid=temp; }
/*使*big =*mid*/
if(*big *sma) { temp=big;big=sma;sma=temp; }/*使*big =*sma*/
if(*mid *sma){temp=mid;mid=sma;sma=temp; }/*使*mid =*sma*/
printf(“%d\t%d\t%d\n”, x,y,z);/*按輸入順序輸出x,y,z*/
printf(“%d\t%d\t%d\n”,*big,*mid,*sma);/*按從大到小的順序輸出*/
}