题目:
利用指针编写程序
设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。
例如:原数列为2,4,6,8,10,12,14,16,18,20。若要求把从第4个数开始的5个数按
逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20
要求:
进行逆序处理时使用指针方法。
分析:
-
输入:
- 用户首先被要求输入一个已排序的数组,然后输入一个指定位置
m
和一个计数n
。
- 用户首先被要求输入一个已排序的数组,然后输入一个指定位置
-
order
函数:order
函数接受一个数组指针和两个索引,然后在指定范围内进行元素的对称交换。- 通过使用三个指针(
pm1
,pend
,pminddle
)来遍历范围,从两端向中间逐步交换元素。
-
主函数
main
:- 声明一个大小为
N
的数组,并由用户输入已排序的数值。 - 用户输入指定位置
m
和重新排列的元素个数n
。 - 打印原始数组。
- 调用
order
函数,以在指定位置m
处开始,重新排列n
个元素。 - 打印重新排序后的数组。
- 声明一个大小为
-
潜在问题:
- 用户需要确保输入的数组是已排序的,否则结果可能不符合预期。
- 代码没有对用户输入进行验证,可能导致错误,例如输入位置
m
超出数组范围。 - 打印的格式较为简单,可能不够清晰。
代码:
#define N 10
void order(int* pa, int m1, int n1)
{
int temp, * pm1, * pend, * pminddle;
pm1 = pa + m1 - 1;
pend = pa + m1 + n1 - 2;
pminddle = pa + m1 - 1 + n1 / 2;
for (; pm1 < pminddle; pm1++, pend--)
{
temp = *pm1;
*pm1 = *pend;
*pend = temp;
}
}
int main()
{
int a[N];
int m, n, i;
printf("输入一个已排好序的数:");
for (i = 0; i < N; i++)
scanf("%3d", &a[i]);
printf("输入指定位置m:");
scanf("%d", &m);
printf("输入重新排的个数n:");
scanf("%d", &n);
printf("输出原序的:");
for (i = 0; i < N; i++)
printf("%4d", a[i]);
printf("输出重排序的:");
order(a, m, n);
for (i = 0; i < N; i++)
printf("%4d", a[i]);
return 0;
}