C 练习实例68
题目:有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。
程序分析:无。
实例
// Created by www.runcodex.com on 15/11/9.
// Copyright © 2015年 码农教程. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[20];
int i,n,offset;
//输入数组大小和数组内容
printf("Total numbers?\n");
scanf("%d",&n);
printf("Input %d numbers.\n",n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
//输入滚动偏移量
printf("Set your offset.\n");
scanf("%d",&offset);
printf("Offset is %d.\n",offset);
//打印滚动前数组
print_arr(arr,n);
//滚动数组并打印
move(arr,n,offset);
print_arr(arr,n);
}
//打印数组
void print_arr(int array[],int n)
{
int i;
for(i=0;i<n;++i)
printf("%4d",array[i]);
printf("\n");
}
//滚动数组
void move(int array[],int n,int offset)
{
int *p,*arr_end;
arr_end=array+n; //数组最后一个元素的下一个位置
int last;
//滚动直到偏移量为0
while(offset)
{
last=*(arr_end-1);
for(p=arr_end-1;p!=array;--p) //向右滚动一位
*p=*(p-1);
*array=last;
--offset;
}
}
C 语言经典100例



banhuxun
ban***un@163.com
参考解法:
#include <stdio.h> void fun(int arr[],int m,int size); int main() { int i,j,a[100],n=0,m; char ch=0; printf("请输入一组整数:\n"); while(ch!='\n') { scanf("%d",&a[n++]); ch=getchar(); } printf("请输入向后移动几位:"); scanf("%d",&m); fun(a,m,n); printf("向后移动后:\n"); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); return 0; } void fun(int arr[],int m,int size) { int i,j,k=0; int buf[size]; for(i=0;i<size;i++) { buf[i]=arr[i]; } for(i=0;i<m;i++) { arr[i]=arr[size-m+i]; } for(j=i;j<size;j++) { arr[j]=buf[k++]; } }banhuxun
ban***un@163.com
半折枯松
152***0570@qq.com
参考方法:
#include<stdio.h> #define N 100 void move (void); int main () { int i,a[N],n,m,j,k; printf ("请输入数组元素个数:n\n"); scanf("%d",&n); printf ("请输入后移几个元素\n"); scanf("%d",&m); printf("请输入一个数组n个元素\n"); for (i=0;i<n;i++) scanf("%d",&a[i]); i=n-1;j=n+m-1; while(i>=0) { a[j]=a[i]; j--; i--; } k=m-1;j=n+m-1; while(k>=0) { a[k]=a[j]; k--; j--; } printf("输出后移后的数组为:\n"); for (i=0;i<n;i++) printf("%5d ",a[i]); return 0; }半折枯松
152***0570@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> #define N 80 void reverse(int a[],int low,int high) { int i = low; int j = high; while(i < j) { if(i < j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } i++; j--; } } int main(void) { int n, m, a[N]; printf("需要输入几个数?\n"); scanf("%d",&n); printf("请输入%d个数:\n",n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } printf("请输入移动位置大小:\n"); scanf("%d",&m); reverse(a,0,n - 1); reverse(a,0,n - m - 1); reverse(a,n - m,n - 1); for(int i = 0; i < n; i++) { printf("%d",a[i]); } return 0; }HIT_CCC
117***2963@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> #define N 80 void reverse(int a[],int low,int high) { int i = low; int j = high; while(i < j) { if(i < j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } i++; j--; } } int main(void) { int n, m, a[N]; printf("需要输入几个数?\n"); scanf("%d",&n); printf("请输入%d个数:\n",n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } printf("请输入移动位置大小:\n"); scanf("%d",&m); reverse(a,0,n - 1); reverse(a,0,m - 1); reverse(a,m,n - 1); for(int i = 0; i < n; i++) { printf("%d ",a[i]); } return 0; }HIT_CCC
117***2963@qq.com
huanhuan
992***291@qq.com
参考方法(用两个数组实现):
#include<stdio.h> #include<stdlib.h> void main() { int a[100],b[100],m,n,i,j=0,k; printf("数组个数:"); scanf("%d",&n); k=n;//下面会用到 printf("请输入数组:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("请输入后移几位:"); scanf("%d",&m); for(i=n-m;i<n;i++) b[j++]=a[i];//先将a数组中的后m位记录到b数组中 for(i=n-m-1;i>=0;i--) a[--k]=a[i];//然后将a数组中没有记录到b数组的元素隔m-1个元素赋值到后面 for(i=0;i<j;i++) a[i]=b[i];//再将记录在b数组中的元素赋值给数组a的前面一部分 printf("结果如下:\n"); for(i=0;i<n;i++) printf("%3d ",a[i]);//输出的数组a为最终结果 putchar('\n'); system("pause"); }huanhuan
992***291@qq.com
zxw09y
444***701@qq.com
参考方法:
#include<stdio.h> #define MAX 20 void printf_s(int *,int ); void goright(int *, int ); void goright(int *a, int n) //向右位移一个数 { int temp = a[n-1]; for(int i = n - 1; i > 0 ; i--) { a[i] = a[i-1]; } a[0] = temp; } void printf_s(int *a, int n) { for(int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } int main(void) { int n, m; int a[MAX]; printf("请设置数组长度(不超过20) : "); scanf("%d", &n); printf("请输入数组 : "); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } printf("请输入需要移动的数量 : "); scanf("%d", &m); while(m) { goright(a,n); m--; } printf_s(a,n); return 0; }zxw09y
444***701@qq.com
BakaCirno1001
341***2969@qq.com
#include<stdio.h> #include <sys/malloc.h> #define LEFT 1 #define RIGHT -1 #define compare(sign,m,n) ( (sign)>1? (m)>(n)?1:(m)==(n)?0:-1 : (m)>(n)?-1:(m)==(n)?0:1 ) #define ptarr(type,arr,n) { int i=0; printf("component:\n"); while(i<n) printf(#type"\t",arr[i++]); printf("\n");} #define initarr(arr,n,c) { int i=0; while(i<n) arr[i++]=c;} #define arrncopy(l,arr2,m,arr1,n) {int i=0,j=(m),k=(l); while(i<(n)) arr2[i+l]=arr1[i+j],i++;} //从 m 开始copy n 个 #if defined arrlen #undef arrlen #endif #define arrlen(str) ( (*(&str+1)-str) ) #define ARRLEN(str) ( sizeof(arr)/sizeof(*arr) ) #define arrmove(way,arr,m) {\ int size,step,start,i,j,n=(m),drct=0;\ drct = ( n<0 ? n=-n,-(way):(way) );\ size=arrlen(arr);\ step=drct>=0?1:-1;\ start=drct>=0?0:size-1;\ if( ((n)>0?(n):-(n)) >= size ) {initarr(arr,size,0);}\ else if(n==0) ;\ else{\ while((drct>=0?(start+(n)<size):(start-(n)>=0))){\ i = start;\ j = drct>=0 ? start+(n) : start-(n);\ arr[i]=arr[j];\ arr[j]=0;\ start+=step;\ }\ while( drct>=0?start<j:start>j ) {arr[start]=0;start+=step;}\ }\ } #define cirmove(type,way,arr,m) {\ int size,n1=(m);\ int drct1=(n1)<0?n1*=-1,-(way):(way);\ type *tarr;\ size=arrlen(arr);\ n1=(n1)%size;\ if( (tarr=(type *)malloc(n1*sizeof(type)))==NULL ) return 0;\ if(drct1>=0) {arrncopy(0,tarr,0,arr,n1);} else {arrncopy(0,tarr,size-n1,arr,n1);}\ arrmove(drct1,arr,n1);\ if(drct1>=0) {arrncopy(size-n1,arr,0,tarr,n1);} else {arrncopy(0,arr,0,tarr,n1);}\ } int main() { int i; int arr[10]={1,2,3,4,5,6,7,8,9,10}; ptarr(%d,arr,10); for(i=-11;i<11;i++) { cirmove(int,LEFT,arr,i); ptarr(%d,arr,10); cirmove(int,LEFT,arr,-i); getchar(); } }BakaCirno1001
341***2969@qq.com
BakaCirno1001
341***2969@qq.com
再用函数实现(方法有些复杂)
#include<stdio.h> #include<malloc.h> #define NUM 10 #define LEFT 1 #define RIGHT -1 #define ARRLEN(arr) ( sizeof(arr)/sizeof(*arr) ) #define PTARR(type,arr,n) {int i=0; printf("component:\n"); while(i<n)printf(#type"\t",arr[i++]); printf("\n");} #define voidcopy(pa,pb,size) {int asize=(size); while(--asize>=0) *((char*)(pa)+asize) = ( pb==NULL?0:*((char*)(pb)+asize) ) ; } void * arrmove(int direct,void *arr,int byte,int size,int n); void * cirmove(int direct,void *arr,int byte,int size,int n); int main() { int j; double arr[NUM]={1,2,3,4,5,6,7,8,9,10}; PTARR(%.3lf,arr,10); for(j=-11;j<12;j++) { cirmove(RIGHT,arr,sizeof(*arr),ARRLEN(arr),j); PTARR(%.3lf,arr,10); cirmove(RIGHT,arr,sizeof(*arr),ARRLEN(arr),-j); getchar(); } getchar(); return 0; } void * arrmove(int direct,void *arr,int byte,int size,int n) //方向: +:左 -:右 0:?? { if(direct) { int start,step; //起点,步长 int i,j; char *arri,*arrj; direct = n>0 ? direct : -direct; //方向变换 n = n>0 ? n : -n; //n取绝对值 start = direct>0 ? 0 : size-1;//起点,左移为0 step = direct>0 ? 1 : -1;//步长,左移为1 while(start<size && start>=0) { i = start; j = direct>0 ? i+n : i-n; arri=(char*)arr+byte*i; arrj=(char*)arr+byte*j; if(direct>0) { if(j<size) //arr[j]存在就赋值给arr[i] { voidcopy(arri,arrj,byte); voidcopy(arrj,NULL,byte); } //不存在就把0赋值给arr[i] else voidcopy(arri,NULL,byte); } //类比:arr[i]=arr[j]; else { if(j>=0) { voidcopy(arri,arrj,byte); voidcopy(arrj,NULL,byte); } else voidcopy(arri,NULL,byte); } start+=step; } return arr; } return NULL;//无方向 } void * cirmove(int direct,void *arr,int byte,int size,int n) //方向: +:左 -:右 0:?? { if(direct) { int start,step; //起点,步长 int i,j,st1,sp1; char *str,*arri,*arrj;; direct = n>0 ? direct : -direct; //方向变换 n = n>0 ? n : -n; //n取绝对值 n%=size; //循环 取余 if(n==0) return arr; //提前终止 str=(char*)malloc(size*n); start = direct>0 ? 0 : size-1;//起点,左移为0 st1 = direct>0 ? 0 : n-1; step = direct>0 ? 1 : -1;//步长,左移为1 sp1 = direct>0 ? 1 : -1; while(direct>0 ? st1<n : st1>=0) { i=st1; j=start; arri=(char*)str+byte*i; arrj=(char*)arr+byte*j; voidcopy(arri,arrj,byte); st1+=sp1; start+=step; }//复制 arrmove(direct,arr,byte,size,n); /*------位移-----*/ start = direct>0? size-n : 0; for(st1=0;st1<n;st1++,start++) { i=start; j=st1; arri=(char*)arr+byte*i; arrj=(char*)str+byte*j; voidcopy(arri,arrj,byte); }//粘贴 return arr; } return NULL;//无方向 }BakaCirno1001
341***2969@qq.com