C语言:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<stdio.h>
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<n;++i)
scanf("%d",&a<i>);
printf("new array:\\n");
exchange(a,n,m);
for(i=0;i<n;i++)
printf("%d",a<i>);
return 0;
void exchange(int*a,int n,int m)
int i,j,temp;
for(i=0;i<=m;++i)
temp=a[0];
for(j=0;j<n-1;++j)
a[j]=a[j+1];
a[n-1]=temp;
代码方法二、假设输入的n的最大值为20代码:
#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);
扩展资料:
stdio.h头文件使用
头文件#include<stdio.h>中
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是文件包含命令,后面跟着引号""或者尖括号<>,意思是将引号或尖括号内指定的文件包含到本程序中,成为本程序的一部分,而包含的文件通常是由系统提供的。
区分引号""或者尖括号<>:尖括号<>编译程序会先到标准函数库中找文件,引号""编译程序会先从当前目录中找文件。
参考技术A 你的子函数里面最后一个循环有点错误,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);
本回答被提问者采纳 参考技术B 把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;
参考技术C 这是我写的程式,你的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]);
参考技术D 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++;
Problem C: 指针:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数
#include<stdio.h> int move(int *x,int n,int m) { int t[255]; int i; //int *p;指针循环变量p for(i=0;i<n;i++) t[i]=x[i]; for(i=0;i<m;i++) x[i]=t[n-m+i]; for(i=m;i<n;i++) x[i]=t[i-m]; /*指针变量做循环变量也可以。 for(i=0,p=x;p<x+m;p++) *p=t[n-m+i++]; for(i=0,p=x+m;p<x+n;p++) *p=t[i++]; */ } int main() { int a[20]; int n,m; int i; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); move(a,n,m); for(i=0;i<n-1;i++) printf("%d ",a[i]); printf("%d",a[n-1]); printf("\n"); } return 0; }
以上是关于C语言:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能的主要内容,如果未能解决你的问题,请参考以下文章
C语言:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能
C语言试题141之有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数