求大神讲这个move函数每一步的意思~主函数懂,放上做参考用。

求大神讲这个move函数每一步的意思~主函数懂,放上做参考用。intmain(){inta[100];intn,m,i;voidmove(inta[100],intn,i... 求大神讲这个move函数每一步的意思~主函数懂,放上做参考用。int main()
{
int a[100];
int n,m,i;
void move(int a[100],int n,int m);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
function(a,n,m);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void move(int a[100],int n,int m) //循环后移动一次的函数
{
int a_end;
int *p;
a_end=*(a+n-1);
for(p=a+n-1;p>a;p--)
*p=*(p-1);
*a=a_end;
m--;
if(m>0)
move(a,n,m);
}
展开
 我来答
Frank_Zhou991
推荐于2017-10-02 · TA获得超过421个赞
知道小有建树答主
回答量:385
采纳率:88%
帮助的人:177万
展开全部
/* 第一部分 */
#include <stdio.h>

/* 函数声明 */
void move (int[], int, int );

/* 程序入口 */
int main (void )
{
int a[100],
n,
m,
i;

printf ("本程序用于把数组中的前n位元素循环右移m个单位,并打印结果。\n");

printf ("请输入n的值:\n");
scanf ("%d", &n);

printf ("请依次设置数组前%d个元素:\n", n);
for (i = 0; i < n; i++)
{
scanf ("%d", &a[i]);
}

printf ("请设置要循环右移的位数m:\n");
scanf ("%d", &m);

/* 打印循环右移前的数组前n个元素 */
printf ("原数组:\n");
for (i = 0; i < n; i++)
{
printf ("%d", a[i]);
}

/* 循环右移 */
move (a, n, m);

printf("\n循环右移%d位:\n", m);
/* 打印循环右移后的数组前n个元素 */
for (i = 0; i < n; i++)
{
printf ("%d", a[i]);
}

return 0;
}
更多追问追答
追答
/* 第二部分 */
/* 函数定义 */
/**
* 功能:把数组a的前n个元素循环右移m个单位
* 即:把数组a中的前n个元素整体向右移动m个单位,右边被移动到n-1范围之外的元素,
* 仍然被作为一个整体,保持原有的先后排列顺序,放到数组a的前m个因右移而空出的位置上
*/
void move (int a[], int n, int m )
{
int a_end,
* p;

/* 把a_end的值设置为数组a中第n个元素a[n-1]的值 */
a_end = *(a + n - 1);

/* 循环开始时,令指针变量p指向数组a中第n个元素a[n-1]的地址 */
/* 只要指针变量p的地址值大于数组a中第一个元素a[0]的地址值,循环就会继续 */
/* 并且每次循环结束,p都指向数组中前一个元素的地址,即p向左移动一个单位, p的地址值减1 */
for (p = a + n -1; p > a; p--)
{
/* 把p当前指向的地址中的值变成数组中前(左边)一个元素的地址中的值 */
*p = *(p - 1);
}
/* 循环结束后,指针变量p已经完成了一轮从a[n-1]到a[0]的移动 */
/* 而数组中的每个元素,除第一个元素a[0]外,也都依次获取到了它们之前一个元素的值 */
/* 如果循环之前的数组元素是这样:{1, 2, 3, 4, 5, ..., n-1, n} */
/* 那么现在它就变成:{1, 1, 2, 3, 4, 5, ..., n-1}, n(被移动这段区间之外) */
/* 其中第1个元素仍然为1,这是a[0]原有的值,它没有被重新赋值,因此没有改变 */

/* 把移动前记录的数组中原来的第n个元素的值赋给a[0] */
*a = a_end;
/* 这次赋值结束后,一次完整的循环右移操作就形成了 */

/**
* 再举个例子说明上面的情况:
* a[0]到a[n-1]这n个元素构成的子数组相当于一个圆盘,它被平均分成n个小扇形,
* 每个扇形都有对应的刻度:0到n-1,现在这个圆盘和表盘类似。
* 这个圆盘中心有一个固定的指针,圆盘可以转动,但指针始终向正上方。
* 如果把圆盘顺时针转动一个刻度,那么原来位置上的所有数值都顺时针偏移了一个刻度。
* 指针此时指向上一个刻度。
*/

/* m是总共要循环右移的位数,上面的操作使数组中的元素循环右移了1位,故m值减1 */
m--;

/* 如果循环右移的位数不足m,则展开下一次递归,再循环右移一位 */
/* 直到把数组的前n个元素移动了m位,逐级退出调用 */
if (m > 0)
{
move (a, n, m);
}
}

帮下路痴无悔
2016-12-03
知道答主
回答量:30
采纳率:0%
帮助的人:4.9万
展开全部
c语言都给忘记了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式