目录
引言
该部分主要使用数组与循环的知识来实现,也可以使用数组指针,由于阿哇旭对指针内容还不熟悉,我就先用已学的知识来实现吧。
1.开发环境
集成开发环境(IDE):Visual Studio 2022,若要使用scanf函数,请添加如下注释:
#define _CRT_SECURE_NO_WARNINGS
//忽略scanf函数的安全警告
2.整体思路
2.1 图片示例
1、设置后移位置个数为m=3。
2、定义一个长度为n=10的数组arr,并初始化arr[10]={1,2,3,4,5,6,7,8,9,10}
2.2 实现原理
本次要实现的功能是将一个长度为n的数组中的元素向后移动m个位置且最后m个数字变成前面m个数字。
1、通过scanf函数获取用户输入的要后移的位置个数m;
2、定义一个长度为n的整型数组arr,并初始化;
3、使用两层循环实现数组元素的后移。外层循环控制后移的次数,内层循环用于实现数组整体向后移一位;
4、在内层循环中,首先将数组最后一个元素保存到临时变量temp中,然后从倒数第二个元素开始,将每个元素向后移动一位;
5、将临时变量temp的值赋给数组的第一个元素,完成一次后移操作;
6、循环执行完毕后,输出后移后的数组元素。
2.3 代码实现
代码如下:
#include<stdio.h>
int main()
{
int m = 0;
printf("请输入要后移的位置个数:\n");
scanf("%d", &m);
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 10;/*数组元素个数*/
int i ,j;
for (i = m; i >0; i--)/*该层循环表示m个数字的移动*/
{
int temp = arr[n-1];/*定义临时变量temp用来存放移动的数据*/
for (j= n-2; j>=0; j--)/*该层循环表示数组整体向后移一位*/
{
arr[j+1] = arr[j];
}
arr[0] = temp;
}
printf("位移后的数组:\n");
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
3.优化代码
如果我们仔细一点就会发现一个问题,如果我们输入的后移位置个数m大于或等于数组长度n,就无法实现代码功能。此时,我们就要判断m与n是否符合要求。
优化后的代码中我们可以使用了指针、malloc动态分配内存等知识来实现动态定义数组,让代码功能更加完善。由于阿哇旭对指针内容不熟悉,小伙伴们有兴趣可以一起来讨论思考。在这里,我就将数组长度稍微定义大一点,来暂时代替动态数组。
代码如下:
#include<stdio.h>
int main()
{
int m;
printf("请输入要后移的位置个数:\n");
scanf("%d",&m);
int n;/*数组元素个数*/
printf("请输入数组元素个数:\n");
scanf("%d",&n);
if (m > n || m == n)
{
printf("数组元素个数与后移位置个数不符合要求,请重新输入\n");
}
else
{
int arr[100];
printf("请输入数组元素:\n");
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
printf("\n原数组:\n");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
int i, j;
for (i = m; i > 0; i--)/*该层循环表示m个数字的移动*/
{
int temp = arr[n-1];/*定义temp用来存放移动的数据*/
for (j = n-2; j >= 0; j--)/*该层循环表示数组整体向后移一位*/
{
arr[j + 1] = arr[j];
}
arr[0] = temp;
}
printf("\n位移后的数组:\n");
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
return 0;
}
运行结果:
预期输入:
后移位置个数m=4
实际结果:
4.总结
上述功能的实现主要通过循环和创建临时变量实现数组元素的后移操作,通过控制循环次数和数组的索引实现整体后移。
该部分的知识讲解完啦,也请动动你们的手指点赞+收藏。若有不足,还望指正!这将对我有很大的帮助。