鱼C论坛

 找回密码
 立即注册
查看: 1930|回复: 4

[已解决]新手求助,有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数

[复制链接]
发表于 2020-10-8 22:43:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[32], 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[i]);//输入指定个数的数字
        }
        printf("Number of positions to move: ");
        scanf("%d", &m);//确定要向后移动多少个位置
        move(number, n, m);
        for (i = 0; i < n; i++) {
                printf("%d ", number[i]);
        }
        printf("\n");
        
        return 0;
}
最佳答案
2020-10-9 09:06:06
本帖最后由 风过无痕1989 于 2020-10-9 09:24 编辑

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[n];
    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[i]);
        }
        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[m];                    // 声明一个临时数组
        for (i = 0;i < m;i++)
        {
                b[i] = *(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[i];
        }

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 23:11:28 | 显示全部楼层
我的程序是自己写的,比你那个简单易懂一点,你看看能不能看懂,我再去研究你的程序,也看看我能不能看懂你的程序,然后,再来回复你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 09:06:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-10-9 09:24 编辑

你的题做法是最开始设置的数组长度是 n + m,于是在函数中直接移动,程序看起来就有点复杂,如图MOV1,我的做法是设置一个临时数组 b[m],将要移动的 m 个数,移到 b[m] 暂存,在将前 n - m 个数移到末尾后,再将数组 b[m] 中的数据移到数组的最前面,如图MOV2
MOV2.jpg
MOV1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢,你的方法好理解多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表