2 encorelaw EncoreLaw 于 2016.05.10 13:12 提问

我是个学生,求大神指教!!!

题目是:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能
#include
int input(int *p)
{
int i=0;
do
{
scanf("%d",p+i);
i++;

}
while(*(p+i-1)!=-1);
return i-1;

}
int* mv(int n,int m,int p)
{

int i,b[100],*c=NULL;
for(i=0;i<m;i++)
{
b[i]=
(p+m-1);
}
for(i=0;i<n-m;i++)
{
b[m-1+i]=*(p+i);
}
c=b;
return c;
}
void output(int p,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d",
(p+i));
}
}
int main()
{
int a[100],n,m,*o=NULL;
n=input(a);
printf("请输入m(把数据最后的m个数按顺序移动到最前):\n");
scanf("%d",m);
o=mv(n,m,a);
output(o,n);
return 0;
}

6个回答

qq423399099
qq423399099   Ds   Rxr 2016.05.10 13:49
已采纳

问题如下:
1.有很多地方少了星号(*),不知道是不是复制粘贴的原因
2.mv函数里两个for循环都有问题
3.你不能把一个局部数组b给返回main函数,需要malloc或者new才行

 #include<iostream>
#include<vector>
using namespace std;
int input(int *p)
{
    int i=0;
    do
    {
        scanf("%d",p+i);
        i++;
    }
    while(*(p+i-1)!=-1);
    return i-1;
}
int* mv(int n,int m,int *p)
{
    int *b = (int *)malloc(sizeof(int) * n);
    int i;
    for(i=0;i<m;i++)
    {
        b[i]=*(p+n-m+i);
    }
    for(i=0;i<n-m;i++)
    {
        b[m+i]=*(p+i);
    }
    return b;
}
void output(int *p,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ",*(p+i));
    }
}
int main()
{
    int a[100],n,m,*o=NULL;
    n=input(a);
    printf("请输入m(把数据最后的m个数按顺序移动到最前):\n");
    scanf("%d",&m);
    o=mv(n,m,a);
    output(o,n);
    free(o);
    return 0;
}

图片说明

EncoreLaw
EncoreLaw 回复小灸舞: 大哥可以给个QQ吗,嘻嘻
一年多之前 回复
EncoreLaw
EncoreLaw 回复小灸舞: 大哥可以给个QQ吗,嘻嘻
一年多之前 回复
EncoreLaw
EncoreLaw 回复小灸舞: 非常感谢你啊!你可以帮我看看我编写程序的风格有没有哪里有问题啊,或者说命名方面又没什么可以改进的
一年多之前 回复
qq423399099
qq423399099 回复EncoreLaw: int b[100]这样的写法,数组是在栈上申请的空间,超出作用域系统会自动释放空间,但栈的空间有限,只有1~10M,而malloc是在堆上申请的空间(有好几个G),只要不主动free,那么只有等程序结束才会释放,对于小程序就算不free也不会有问题,但如果是一个服务器程序,几年不关的,楼主你想想,如果只malloc而不free那么空间一旦用尽肯定崩溃
一年多之前 回复
EncoreLaw
EncoreLaw 回复小灸舞: 为什么要释放o啊?
一年多之前 回复
qq423399099
qq423399099 回复EncoreLaw: int *b = (int *)malloc(sizeof(int) * n); 就是开辟了sizeof(int) * n个字节的空间,并且将首地址返回,free就是释放空间。。。楼主可以查看malloc/free的用法
一年多之前 回复
EncoreLaw
EncoreLaw int *b = (int *)malloc(sizeof(int) * n); 和 free(o); 大哥,这句是什么意思啊?可以详细一点讲解下吗
一年多之前 回复
CSDNXIAON
CSDNXIAON   2016.05.10 13:22

求大神指教
求大神指教
求大神指教 context.lookup()查找weblogic中的ejb
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

lbcab
lbcab   2016.05.10 13:55

假设你输入了1 2 3 4 5 6 7 8 9, 9个数, 你想移动后4个数到前面, 那么:
1. 先旋转后面4个数, 结果是 1 2 3 4 5 9 8 7 6
2. 在旋转前面5个数, 结果是 5 4 3 2 1 9 8 7 6
3. 最后将整个数组旋转, 结果是 6 7 8 9 1 2 3 4 5

EncoreLaw
EncoreLaw 谢谢啦!
一年多之前 回复
u011889952
u011889952   2016.05.10 15:20

用个环形队列就好了吧

EncoreLaw
EncoreLaw 我去百度下这个排列
一年多之前 回复
huangenwen
huangenwen   2016.05.10 21:09

首先, 你的说的移动是怎样的移动
比如:
第一种: 1 2 3 4 5 6 移动四位后变成 3 4 5 6 1 2
第二种: 1 2 3 4 5 6 移动四位后变成 6 5 4 3 1 2
根据这两种不同的移动, 我做了不同的操作 , 希望可以帮到你, 具体代码如下(可在VS运行):
![![图片说明](http://img.ask.csdn.net/upload/201605/10/1462885476_697778.png)图片说明](http://img.ask.csdn.net/upload/201605/10/1462885466_368509.png)图片说明

第一种操作演示及结果:
![图片说明](http://img.ask.csdn.net/upload/201605/10/1462885541_941344.png)图片说明

第二种操作演示及结果:
![图片说明](http://img.ask.csdn.net/upload/201605/10/1462885572_848994.png)图片说明

代码中有详细的注释,还有你的代码错误的地方之前几位都已经给出,你自行研究吧。

huangenwen
huangenwen   2016.05.10 21:17

![图片说明
![图片说明

第一次用这个平台,有点不太懂弄,现在我再把全部代码放上去。刚才图片怎么就没有全部上传呢? 哈哈哈……

huangenwen
huangenwen OK!
一年多之前 回复
EncoreLaw
EncoreLaw 谢谢你啊!!
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!