?? 例10.7.txt
字號:
例10.7將數組a中n個整數按相反順序存放,見圖10.16示意。
解此題的算法為:將a[0]與a[n-1]對換,再將a[1]與a[n-2]對……,直到將圖10.16a[(n-1)/2]與a[n-int((n-1)/2)-1]對換。
今用循環處理此問題,設兩個“位置指示變量”i和j,i的初值為0,j的初值為n-1。將a[i]與a[j]交換,然后使i的值加1,j的值減1,再將a[i]與a[j]對換,直到i=(n-1)/2為止。
程序如下:
void inv(int x[ ],int n)/*形參x是數組名*/
{
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;}
return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The oriGinal array:\n");
for(i=0;i<10;i++)
printf("%D,",a[i]);
printf("\n");
inv(a,10);
printf("The array haS Been inverteD:\n");
for(i=0;i<10;i++)
printf("%D,",a[i]);
printf("\n");
}
運行情況如下:
The oriGinal array:
3,7,9,11,0,6,7,5,4,2,
The array haS Been inverteD:
2,4,5,7,6,0,11,9,7,3,
主函數中數組名為a,賦以各元素初值。函數inv中的形參數組名為x。在inv函數中不必具體定義數組元素的個數,元素個數由實參傳給形參n(今實參值為10)。這樣做可以增加函數的靈活性。即不必要求函數inv中的形參數組x和main函數中的實參數組a長度相同。如果在main函數中有函數調用語句:inv(a,10),表示要求對a數組的前10個元素實行題目要求的顛倒排列。如果改為:inv(a,5),則表示要求將a數組的前5個元素實行顛倒排列,此時,函數inv只處理5個數組元素。函數inv中的m是i值的上限,當i≤m時,循環繼續執行;當i>m時,則結束循環過程。
例如,若n=10,則m=4,最后一次a[i]與a[j]的交換是a[4]與a[5]交換。
對這個程序可以作一些改動。將函數inv中的形參x改成指針變量。實參為數組名a,即數組a的首地址,將它傳給形參指針變量x,這時x就指向a[0]。x+m是a[m]元素的地址。設i和j以及p都是指針變量,用它們指向有關元素。i的初值為x,j的初值為x+n-1,見圖10.17。使*i與*j交換就是使a[i]與a[j]交換。
程序如下:
void inv(int*x,int n)/*形參x為指針變量*/
{
int
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -