HK666 发表于 2020-10-8 22:43:38

新手求助,有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;
}

风过无痕1989 发表于 2020-10-8 23:08:40

// 谭浩强的《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-8 23:11:28

我的程序是自己写的,比你那个简单易懂一点,你看看能不能看懂,我再去研究你的程序,也看看我能不能看懂你的程序,然后,再来回复你

风过无痕1989 发表于 2020-10-9 09:06:06

本帖最后由 风过无痕1989 于 2020-10-9 09:24 编辑

你的题做法是最开始设置的数组长度是 n + m,于是在函数中直接移动,程序看起来就有点复杂,如图MOV1,我的做法是设置一个临时数组 b,将要移动的 m 个数,移到 b 暂存,在将前 n - m 个数移到末尾后,再将数组 b 中的数据移到数组的最前面,如图MOV2

HK666 发表于 2020-10-9 22:03:42

风过无痕1989 发表于 2020-10-9 09:06
你的题做法是最开始设置的数组长度是 n + m,于是在函数中直接移动,程序看起来就有点复杂,如图MOV1,我的 ...

感谢,你的方法好理解多了
页: [1]
查看完整版本: 新手求助,有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数