例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为指针变量*/
{
intp,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{temp=*i;*i=*j;*j=temp;}
return;
}
main()
{int i,a[10]={3,7,9,111,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");
}
运行情况与前一程序相同。
解此题的算法为:将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为指针变量*/
{
intp,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{temp=*i;*i=*j;*j=temp;}
return;
}
main()
{int i,a[10]={3,7,9,111,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");
}
运行情况与前一程序相同。