程序设计百科

广告

部分数组转置

2012-06-22 10:34:10 本文行家:玻尔特.李

C语言程序经典分析1 在函数中处理main函数的数组。部分数组首尾指针的使用。

0101

问题

eg.有一个数组,有20个整数,今要求编一个函数,它能够对从指定位置开始的几个数按相反顺序重新排列并在main函数中输出新的数列。例如原数列为:

       1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

       从6开始的10个数进行逆序处理,则得到的新数列为:

      1,2,3,4,5,15,14,13,12,11,10,9,8,7,6,16,17,18,19,20

      数列在main函数中输入,在调用函数时应给出从第几个位置开始(以m表示)和要求处理的是多少个数(以n表示),例如对上面的情况,m=6,n=10

程序

#include<stdio.h>

main()

{void resort(int array[],int where,int amount);

 int number[20],where,amount,i;

 printf("input 20 numbers");

 for(i=0;i<20;i++)

      scanf("%d",&number[i]);  //number表示地址,number+i=&number[i]

 printf(" ");

 printf("how many numbers do you want to sort:");

 printf("%d",&amount);

 printf("where do you want to start:");

 printf("%d",&where);                   //从哪个位置开始转置

 printf(" ");

 printf("old array as follow:");

 for(i=0;i<20;i++)

        printf("%d",number[i]);       //打印全部数组元素

 resort(number,where,amount);

 printf(" resorted array as follow:");

 for(i=0;i<20;i++)

        printf("%d",number[i]);      //打印转置后的数组元素

}

void resort(int array[],int where,int amount)

{ int *p1,*p2,temp;

 p1=&array[where-1];   //p1是首指针,开始位置&array[where-1]

 p2=&array[where-2+amount]; //p2是后指针&array[where-2+amount]

 for(;p1<&array[where-1]+amount/2;p1++;p2--)

                               //用首尾指针的方式,将首指针与尾指针的内

                           容的值对换,然后首指针后移,尾指针前移。

       {temp=*p1;                                //用指针实现swap,*运算符

        *p1=*p2;

        *p2=temp;

        }                                                                 //函数没有返回值

}                     

程序分析

1)函数用传递数组的方式,形式参数与实参共用同一个内存空间。在函数中处理实参中的数组number,用形参数组array[]以及转置部分数组的首尾指针p1p2实现。这个方法主要是使resort函数能够可重用。

2)函数的程序结构

      for语句,两个指针p1,p2

for语句执行的次数。两个指针移动的相反方向。

3)程序的细节

    (1)指针实现数据交换,用*运算符。

    (2)注意指针的值,转置的起始地址

    (3)形参与实参用传递数组的方式,注意主函数调用语句。

数据传递与过程分析

(1)数据传递--内存单元

        实参n[20],形参a[20]公用相同的内存单元,与传递变量不同。

n[0]n[1]n[2]n[3] n[4]n[5]n[6]n[7]n[8]n[9]
  1  2   3    4    5  6  7  8  9  10
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

n[10]n[11]n[12]n[13]n[14]n[15]n[16]n[17]n[18]n[19]
 11  12   13    14    15 1 6  17  18  19  20
a[10]a[11]a[12]a[13]a[14]a[15]a[16]a[17]a[18]a[19]


    函数resort执行后

n[0]n[1]n[2]n[3] n[4]n[5]n[6]n[7]n[8]n[9]
  1  2   3    4    5  15  14 13  12  11
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

n[10]n[11]n[12]n[13]n[14]n[15]n[16]n[17]n[18]n[19]
 10  9   8    7    6 1 6  17  18  19  20
a[10]a[11]a[12]a[13]a[14]a[15]a[16]a[17]a[18]a[19]

    

 (2)函数执行过程分析

    1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20

                     p1                                         p2

 

1次交换 

    1  2  3  4  5  15  7  8  9  10  11  12  13  14  6  16  17  18  19  20

                           p1                                p2

2次交换

    1  2  3  4  5  15  14  8  9  10  11  12  13  7  6  16  17  18  19  20

                                 p1                      p2

3次交换

    1  2  3  4  5  15  14  13  9  10  11  12  8  7  6  16  17  18  19  20

                                       p1            p2

4次交换

    1  2  3  4  5  15  14  13  12  10  11  9  8  7  6  16  17  18  19  20

                                             p1  p2

5次交换

    1  2  3  4  5  15  14  13  12  11  10  9  8  7  6  16  17  18  19  20

                                            p2  p1

经过5次交换,而不是10次,这个要明白。

数据与语句分析

where=5

amount=10        

                         p1                               p2                                p1<&array[5]+5

6               p1=&array[5]             p2=&array[14]           15                 1

7               p1=&array[6]             p2=&array[13]           14                 1

8               p1=&array[7]             p2=&array[12]           13                 1

9               p1=&array[8]             p2=&array[11]           12                 1

10             p1=&array[9]             p2=&array[10]           11                 1

11             p1=&array[10]            p2=&array[9]           10                  0

  

分享:
标签: 自然科学 计算机软件 | 收藏
参考资料:
[1] 谭浩强,C程序设计
百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于www.baike.com
广告

本文行家向Ta提问

玻尔特.李软件专业硕士生,编程,计算机硬件设计,网络。

行家更新