新手求助,有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数
move函数里的过程没看懂, 大佬们可以帮忙解答下吗,谢谢啦void move(int *arry, int n, int m)
{
int end_idx = n - m;//找到倒数第m个数据的位置,也就是要移动到数组首部的数据的起始位置
for (int i = 0; i < m; i++) {
int *p = arry + end_idx + i;//从倒数第m个数据的位置开始逐渐向后偏移直到数组尾部
int tmp = *p;//获取到这个位置的值,用于数组前边数据向后偏移1位之后,向数组第i位赋值
for (int j = end_idx + i; j > i; j--) {//从第i位开始逐个向后偏移一位
*p = *(p - 1);
p--;
}
*(arry + i) = tmp;//数组的前第i个数字逐个替换为后边被覆盖的值
}
}
int main()
{
int number, n, m, i;
cout <<("Please enter the number of numbers: ");
scanf("%d", &n);//先确定要输入多少个数字
printf("Please enter %d numbers: ", n);
for (i = 0; i < n; i++) {
scanf("%d", &number);//输入指定个数的数字
}
printf("Number of positions to move: ");
scanf("%d", &m);//确定要向后移动多少个位置
move(number, n, m);
for (i = 0; i < n; i++) {
printf("%d ", number);
}
printf("\n");
return 0;
} // 谭浩强的《C语言程序设计》第四版第八章习题:有n个整数,使前面各数顺序向后移m个位置,
// 最后m个数变成最前面m个数,写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
#include <stdio.h>
#include <windows.h>
#define n 25
#define m 10
int main()
{
void mov(int *p);
int i,*p;
int a;
p = a;
printf("请输入 %d 个整数:\n",n);
for (i = 0;i < 25;i++)
{
scanf("%d",p + i);
}
system("cls");
for (i = 0;i < 25;i++)
{
printf("%d\t",a);
}
printf("\n");
mov(a);
for (i =0;i < 25;i++)
{
printf("%d\t",*p);
*p++;
}
printf("\n");
return 0;
}
void mov(int *p)
{
int i;
int b; // 声明一个临时数组
for (i = 0;i < m;i++)
{
b = *(p + (n - m) + i);// 将第 j + m 开始单元的值赋给临时数组
}
for (i = 0;i < n - m;i++)
{
*(p + n - 1 - i) = *(p + (n - m - 1) - i);// 将第 (n - m - 1) - i 单元的值往后移动 m 个单元
}
for (i = 0;i < m;i++) // 将临时数组的值赋给数组a
{
*(p + i) = b;
}
} 我的程序是自己写的,比你那个简单易懂一点,你看看能不能看懂,我再去研究你的程序,也看看我能不能看懂你的程序,然后,再来回复你 本帖最后由 风过无痕1989 于 2020-10-9 09:24 编辑
你的题做法是最开始设置的数组长度是 n + m,于是在函数中直接移动,程序看起来就有点复杂,如图MOV1,我的做法是设置一个临时数组 b,将要移动的 m 个数,移到 b 暂存,在将前 n - m 个数移到末尾后,再将数组 b 中的数据移到数组的最前面,如图MOV2 风过无痕1989 发表于 2020-10-9 09:06
你的题做法是最开始设置的数组长度是 n + m,于是在函数中直接移动,程序看起来就有点复杂,如图MOV1,我的 ...
感谢,你的方法好理解多了
页:
[1]