帮我看一下这道题错在哪

来源:百度知道 编辑:UC知道 时间:2024/05/19 08:24:10
3、有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前m个数(如下图所示)。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个整数。?

#include<stdio.h>
void switch(int *p,int n,int m)
{int *p1,*p2,i;
p1=p+n-m;
p2=p;
for(i=0;i<m;i++)
printf("%d",*(p1+i));
for(i=m;i<n;i++)
printf("%d",*(p2+i-m));
}
void main()
{ int a[]={0,1,2,3,4,5,6,7,8,9};
int *ap,m;
ap=a;
scanf("%d",&m);
switch(ap,10,m);
}
不好意思,不知道该怎么贴图!用数字表示一下吧!
0 1 2 3 4 5 6 7 8 9
改为:(m=4)
6 7 8 9 0 1 2 3 4 5

你可以仔细检查下!我看了,我认为是符号输入出现了错误

错误应该出现在p1选择自己位置的时候,你用的是p1=p+n-m,如果当前是n=10,m=3,那么p1指向的位置为第7个位置,实际上,后面输入的语句中,你向指向的应该是p1指向3,所以把这个p1=p+n-m,调整为:p1=p+m即可,不过再这之前,应该判断一下m的大小,如果m<=n的话,这样是可以的,如果你想支持m>n的情况,就要另外做p1的指向了。

你实现的功能只是把这些数按要求打印出来,好像试了一下没有错误。我想你要求实现的有点类似位操作中的按位右移,我替你写了个在数组中移动n位的操作。如下:
///////////////////////////////////////////////////////////
#include "stdio.h"
void SwitchNumber(int *p,int n,int m)
{
int i,j, temp;
int *p1;
p1 = p;

printf("原始数据为:\n");
for (i = 0; i < n; i++)
{
printf("%4d", *(p+i));
}

for (i = 0; i < m; i++)
{
p1 = p + n -1; //指向最后一个元素
temp = *p1; //保留最后一个元素,用于赋值给第一个元素,表示溢出
for (j = 0; j < n-1; j++)
{
*p1 = *(p1 -1);
p1--;
}

*p1 = temp;
}

printf("\n右移%d之后数据为:\n", m);
for (i = 0; i < n; i++)
{
printf