标题:求大神 , 帮忙, 写一下, 注释,主要是 move()函数,,,因为move()函数 ...
只看楼主
SACAS
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-7-12
结帖率:0
已结贴  问题点数:20 回复次数:3 
求大神 , 帮忙, 写一下, 注释,主要是 move()函数,,,因为move()函数 我看不懂
// 题意  :n个整数  使前面各数   顺序向后移m个位置,最后m个数变成最前面m个数   
//12 43  65 67  8 2 7 11 --------   8 2 7 11 12 43 65 67


#include <stdio.h>

int main()
{
    void move(int [20],int,int);
    int number[20],n,m,i;
    printf("how many numbers?");
    scanf("%d",&n);
    printf("input %d numbers: \n",n);
    for( i=0;i<n;i++)
        scanf("%d",&number[i]);
    printf("how many place you want move? ");
    scanf("%d",&m);
    move(number,n,m);
    printf("NOW,they are:\n");
    for( i=0;i<n;i++)
        printf("%d ",number[i]);
    printf("\n");
    return 0;
}
void move(int array[20],int n,int m)   
{
    int *p,array_end;
    array_end = *(array+n-1);      
    for( p = array+n-1;p>array;p--)
        *p = *(p-1);                 
   
    *array =  array_end;           
    m--;
    if(m>0) move(array,n,m);
 }
搜索更多相关主题的帖子: move 函数 int printf array 
2018-03-08 11:59
LiGoudan
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:20
专家分:148
注 册:2018-2-28
得分:10 
程序代码:
// 主要思路:通过递归函数完成函数的移动
void move(int array[20],int n,int m)   
{
    int *p,array_end;
    // 保存数组最后一个元素
    array_end = *(array+n-1);
    // 将数组元素依次向后移动一个位置  
    for (p = array+n-1; p > array; p--)
        *p = *(p-1);                 
    
    // 将最后一个元素放在数组首位
    *array =  array_end;
    m--;
    
    // 判断是否还有移动的元素
    if (m>0)
    {
        //调用递归进行下一个元素移动
        move(array,n,m);
    }
}
2018-03-08 18:18
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
得分:10 
void move(int array[20],int n,int m)   
{
    int *p,array_end;
    array_end = *(array+n-1);      
    for( p = array+n-1;p>array;p--)
        *p = *(p-1);                 
   
    *array =  array_end;           
    m--;
    if(m>0) move(array,n,m);
 }
p指针和array指向了同一个地址.
for循环中,把P的元素用前一位替换后一位。
循环出来后,中间变量array_end的值,给array首地址。
这样,最后一位就移到第一位,后面六位就向后移了一位。
m递减一次
如此递归调用自己。

这样说可能不清楚。举个例子:

how many numbers?  
6
input %d numbers:
22
23
24
25
26
27

how many place you want move?
3

这样,
n=6  m=3

第一次调用move函数

array_end = *(array+n-1);    // *(array+n-1)值为27  array_end =27
 for( p = array+n-1;p>array;p--)  //p = array+n-1  p和array指向了同一个地址
        *p = *(p-1);               //把前面一位的值替换掉
循环出来之后的顺序为:
22 22 23 24 25 26

 *array =  array_end;    //把中间变量array_end最后一位元素的值给array首地址的值。这样,首地址的值 就变了。
array的元素就变为:27 22 23 24 25 26

m--;  //m递减一次,用于下面的递归调用。。
if(m>0) move(array,n,m);//继续递归调用

第二次调用:
array_end=26
p循环出来之后就是
27 27 22 23 24 25

*array =  array_end;
这时array元素值就是
26 27 22 23 24 25

m再递减一次,因为m大于0继续递归。。
反复以上操作。。。



普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-08 19:08
SACAS
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-7-12
得分:0 
谢谢  大家
2018-03-08 22:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485092-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.065714 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved