题目描述
输入n个整数(不超过10),使前面各数顺序后移m个位置,最后m个数变成最前面的m个数(m<n),写一个函数实现上述功能。
在main函数中调用该函数,最后分行输出移动后的n个数,每个数占一行。
输入输出都在main函数中进行。
n和m以及n个数都需要从键盘上进行输入。
答案如下
// Test.cpp: 定义控制台应用程序的入口点。
/*
数据挪动
*/
#include "stdafx.h"
#include"stdio.h"
#include"math.h"
#include<iostream>
#include"string.h"
using namespace std;
int main()
{
int m, n,A[10];
int*p,*pre;
void func(int *p, int*pre, int m, int n, int A[]);
printf("需输入的数字总数\n");
scanf_s("%d",&n);
printf("后移的位数\n");
scanf_s("%d", &m);
printf("输入数字,以空格分隔\n");
for (int i = 0; i < n; i++)
{
scanf_s("%d", &A[i]);
}
p = &A[n - m];
pre = p - 1;
func(p, pre, m, n, A);
for (int i = 0; i < n; i++)
{
printf("%d", A[i]);
}
}
void func(int *p, int*pre, int m, int n, int A[]) {
int temp;
int t=1;
for (int i = 0; i < m; i++)
{
temp = *p;
for (int j = 0; j < n-m-1; j++)
{
*p = *pre;
pre--;
p--;
}
*p = *pre;
*pre = temp;
p = &A[n-m+t];
pre = p-1;
t++;
}
}
这个程序编的很困难,因为编完以后并没有出现编译错误的提示,但是一运行就报出红叉的错误,搞得我很费解,然后用单步调试发现了如下的问题:
func循环次数搞错,导致栈溢出;
pre的内容没有赋给p,导致出现两个2;
因为百度也没有结果,只能单步调试一点一点猜着改,花了我差不多3个小时。。。在演草本上画了好几遍。。。
最后还是弄出来了,很高兴