8.4 题目:
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,如图所示。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
思路:
一、由于拿不准如何确定动态的整数个数n,故先写了一个固定值n=10,输入十个整数后再输入要求移动的位置个数m的代码,便于理解。
思路:
①先定义一个数组a[10],用于存放输入的十个整数,数组b[10]是空的,用于存放平移后数字的排列。再用指针变量f1,f2分别指向两个数组的首元素地址,移动时使用指针来操作。
②对于移动的算法,先是自己举了一个例子后,掌握一定的规律
//老数组最后m~n的元素放到新数组的前0~m位置,老数组前0~m的元素放到新数组的m+1~n位置
void Move_Bcak(int* p1, int* p2, int n, int m)
{
for (int i = 0; i < m; i++)
*(p2 + i) = *(p1 + n - m + i);
for (int i = 0, j = m + 1; i < (n-m); j++, i++)
*(p2 + j) = *(p1 + i);
}
int main()
{
int a[10], b[10];
int* f1, * f2;
int i, m;
printf("请输入n个整数:\n");
for(i=0;i<10;i++)
scanf("%d", f1);
printf("请输入想要向后移动的的个数:\n");
scanf("%d", &m);
f1 = a;
f2 = b;
Move_Bcak(f1, f2, 10, m);
printf("数组向后移动后的结果为:\n");
for (int i = 0; i < 10; i++)
printf("%3d", *(f2 + i));
return 0;
}
二、对于动态的n个整数
思路:
①这一部分主要是统计n的值,一开始想的是检测遍历数组,未到'\0'时n的值和遍历时i的值一样+1,但是意识到'\0'是字符数组才有的(错误思路),所以得在循环里用if (getchar() == '\n') break;发现回车时提前结束循环(正确思路)
②在测量整型数组有多少有效数据时,想到一个问题就是:整型数组必须是填满的吗?比如a[10],但是我只输入“1,2,3,4,5”,那么数组里是5个元素还是10个元素?(前5个是“1,2,3,4,5”后面补充“0,0,0,0,0”)——答案是5个元素,剩余的5个元素(即 a[5]~a[9])将保持未初始化的状态,它们的值将是未定义的(在C/C++中通常是内存中的随机值)
//老数组最后m个(a[n-m]~a[n-1])的元素放到新数组的前0~m-1(b[0]~b[m-1])位置,
//老数组前0~n-m-1(a[0]~a[n-m-1])的元素放到新数组的m+1~n(b[m]~b[n-1])位置
void Move_Bcak(int* p1, int* p2, int n, int m)
{
for (int i = 0; i < m; i++)
*(p2 + i) = *(p1 + n - m + i);
for (int i = 0; i < (n-m); i++)
*(p2 + m + i) = *(p1 + i);
}
int main()
{
int a[50], b[50];
int* f1=a, * f2=b;
int i, n=0, m;
printf("请输入n个整数:\n");
for(i=0;i<50;i++)
{
scanf("%d", f1+i);
n++;
if (getchar() == '\n') // 添加此行,解决连续输入数字导致的读取问题
break;
}
printf("n=%d", n);
printf("请输入想要向后移动的的个数:\n");
scanf("%d", &m);
Move_Bcak(f1, f2, n, m);
printf("数组向后移动后的结果为:\n");
for (int i = 0; i < n; i++)
printf("%3d", *(f2 + i));
return 0;
}