C语言:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{ void move(int *p,int n,int m);
int a[30];
int *p=a;
int m,n;
printf("input the n:\n");
scanf("%d",&n);
printf("input the num:\n");
for(p=a;p<a+n;)
scanf("%d",p++);
printf("input the m:\n");
scanf("%d",&m);
p=a;
move(p,n,m);
for(p=a;p<a+n;)
printf("%d",*p++);

}

void move(int *p,int n,int m)
{ int i;
for(i=n-1;i>=0;i--) //这个循环是依次往后移动m个位置
{
*(p+i+m)=*(p+i);
}

for(i=n-1;i<n+m;i++) //这个循环是把后面m个数移到最开始
{

*p++=*(p+i);

}

}

要求用指针实现。。
比如n=10 m=4 结果应该是这样子
原来:1,2,3,4,5,6,7,8,9,10
m= 4
后来:7,8,9,10,1,2,3,4,5,6

。。。帮我看看我哪里写错了。。是逻辑有问题么?帮我改改谢谢~~

代码方法一、

#include&lt;stdio.h&gt;

void exchange(int*,int,int);

int main(void){

int m,n,i;

printf("input length and number:\n");

scanf("%d%d",&n,&m);

int a[n];

printf("input array:\n");

for(i=0;i&lt;n;++i)

scanf("%d",&a&lt;i&gt;);

printf("new array:\n");

exchange(a,n,m);

for(i=0;i&lt;n;i++)

printf("%d",a&lt;i&gt;);

return 0;

}

void exchange(int*a,int n,int m)

{

int i,j,temp;

for(i=0;i&lt;=m;++i){

temp=a[0];

for(j=0;j&lt;n-1;++j)

a[j]=a[j+1];

a[n-1]=temp;

}

}

代码方法二、假设输入的n的最大值为20代码:

#include&lt;stdio.h&gt;

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&lt;n;i++)

scanf("%d",&number&lt;i&gt;);

printf("how many place you want move?");

scanf("%d",&m);

move(number,n,m);

printf("Now,they are:\n");

for(i=0;i&lt;n;i++)

printf("%d",number&lt;i&gt;);

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&gt;array;p--)

*p=*(p-1);

*array=array_end;

m--;

if(m&gt;0)

move(array,n,m);

}

扩展资料:

stdio.h头文件使用

头文件#include&lt;stdio.h&gt;中

stdio.h是stand input&output的缩写,意思是标准输入输出头文件。凡是用到标准输入输出函数,就要调用该头文件。

查看stdio.h目录下包含哪些函数:主要有文件访问、二进制输入/输出、格式化和非格式化输入/输出、文件定位、错误处理、文件操作等。

具体打开自己的VS安装目录,找到include文件夹,打开include夹下面的stdio.h文件即可查看

(C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcpackages\IntelliSense\iOS\OSS\musl-1.1.10\include)

常用标准输入输出函数:

scanf()从屏幕格式输入

printf()格式输出到屏幕

getchar()从屏幕得到一个字符

putchar()字符输出到屏幕

gets()从屏幕得到一个字符串

puts()字符串输出到屏幕

fscanf()从磁盘格式输入

fprintf()格式输出到磁盘

fgetc()从磁盘得到一个字符

fputc()字符输出到磁盘

fgets()从磁盘得到一个字符串

fputs()字符串输出到磁盘

#号是预处理语句,表明在编译之前预先进行处理。

.h是header file的缩写,表面这是一个头文件。

include是文件包含命令,后面跟着引号""或者尖括号&lt;&gt;,意思是将引号或尖括号内指定的文件包含到本程序中,成为本程序的一部分,而包含的文件通常是由系统提供的。

区分引号""或者尖括号&lt;&gt;:尖括号&lt;&gt;编译程序会先到标准函数库中找文件,引号""编译程序会先从当前目录中找文件。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
你的子函数里面最后一个循环有点错误,1,for(i = n;i < n+m ; i ++)
2,你的p的指向和i同时变化,导致你每次移动两个单位,
正确的程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{ void move(int *p,int n,int m);
int a[30];
int *p=a;
int m,n;
printf("input the n:\n");
scanf("%d",&n);
printf("input the num:\n");
for(p=a;p<a+n;)
scanf("%d",p++);
printf("input the m:\n");
scanf("%d",&m);
p=a;
move(p,n,m);
for(p=a;p<a+n;)
printf("%d",*p++);

}

void move(int *p,int n,int m)
{ int i;
for(i=n-1;i>=0;i--) //这个循环是依次往后移动m个位置
{
*(p+i+m)=*(p+i);
}

for(i=n;i<n+m;i++) //这个循环是把后面m个数移到最开始
{

*p++=*(p+n);

}

}本回答被提问者采纳
第2个回答  2011-08-12
把move注释掉后一切正常,说明move错了。
首先,循环刚开始时就越界了。如果数组大小小于n+m,马上就会停止工作。

下面是个肯定不会出错的做法,因为每次只用一个int型变量暂存数据:
void move(int *p, int n, int m)
{

int i, temp;
if (m > 1)
for (i = 0; i < m; i ++)
move(p, n, 1);
else
{
temp = p[n-1];
for (i = n-1; i > 0; i --)
p[i] = p[i-1];
p[0] = temp;
}

}
第3个回答  2011-08-12
这是我写的程式,你的move函数有问题。你对比一下我的吧。
#include <stdio.h>
#include <malloc.h>
int *change(int *p,int n,int m)
{
int number, *p1, i = 0;
p1 = (int *)malloc(n * sizeof(int));
for(number=0;number<m;number++)
{
p1[number] = p[n-m + number];
}
for(number=m;number<n;number++)
{
p1[number] = p[number - m];
}
while (i < n)
{
p[i] = p1[i];;
i++;
}
return(p);
}
void main()
{
int i,m,n,a[20],*point;
printf("Pls input n:");
scanf("%d",&n);
printf("\n Pls input %d numbers",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("You should input changing order numbers m:");
scanf("%d",&m);
point=&a[0]; //赋地址
m = m%n; //去掉重复移动
change(point,n,m);
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
第4个回答  2011-08-12
for(i=n-1;i<n+m;i++) //这个循环是把后面m个数移到最开始
{
*p++=*(p+i);
}
这个地方写的不对,注意观察你这里面的p++,每次运行后p指针向后移了一位,你下次的p+i应该不是你想要的吧?
建议这样子写
for (i = 0; i < m ; i++)
{
*p = *(p+n-1);
p++;
}
相似回答