一、问题
若有n个数的数组arr,循环右移一位指每个数移到相邻的右边一个位置,最右边的数移到最左边。如数组1,2,3,4,5;循环右移1位的结果为5,1,2,3,4;右移3位的结果为3,4,5,1,2。
使用指针方法,编写数组右移k位的函数。
编写主函数输入若干元素和右移位数,调用函数右移,在主函数中输出结果。元素个数不超过100。
输入:两行,第1行为若干用空格分隔的整数,以9999表示结束;第2行一个整数,表示右移的位数。
输出:一行,移位的结果,各个数值用一个空格隔开,末尾无空格。
【输入输出样例】
输入:
1 2 3 4 5 9999
3
输出:
3 4 5 1 2
二、代码
#include <stdio.h>
// 数组右移k位函数
void rightshift(int arr[], int n, int k) {
int j, m = 0;
// 取模操作得到实际要右移的位数
int i = k % n;
int temp[i]; // 用于存储要右移的元素
// 将要右移的元素保存
for (j = n - i; j < n; j++) {
temp[m] = arr[j];
m++;
}
// 将数组元素向右移动k位
for (j = n - i - 1; j >= 0; j--) {
arr[j + i] = arr[j];
}
// 将右移的元素添加到数组前面
for (j = 0; j < i; j++) {
arr[j] = temp[j];
}
}
int main() {
int arr[100];
int i = 0, k;
// 读取输入的数组元素
while (scanf("%d", &arr[i]) != EOF) {
if (arr[i] == 9999) {
break;
}
i++;
}
// 读取要右移的位数
scanf("%d", &k);
// 调用右移函数
rightshift(arr, i, k);
// 输出右移后的结果
for (int p = 0; p < i; p++) {
printf("%d ", arr[p]);
}
return 0;
}
三、tips
1.学习如何传入数组,不包含9999
2. EOF
EOF是End Of File的缩写,表示文件结尾。
在C语言中,EOF是一个宏定义,用于表示文件末尾的标记。当程序读取文件内容时,如果已经到达文件结尾,就会返回EOF,告诉程序已经无法从文件中读取更多的数据。
在使用scanf等输入函数时,如果读取到了EOF,会返回-1,程序可以根据这个返回值判断是否已经读取完文件。例如:
while (scanf("%d", &num) != EOF) {
// 读取到一个数字,处理它
}
这个循环会不断读取输入的数字,直到读取到EOF为止。
3.学习这个思想,将溢出的数字保存