題目:
利用指針編寫程序
設有一數列,包含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;
}
浙公網安備 33010602011771號