【发布时间】:2019-07-03 02:53:14
【问题描述】:
第一次发帖,如果我的问题没有遵循指导方针,我深表歉意,但欢迎对我的问题和发布问题提供任何反馈:)!
我正在解决一个问题,需要编写一个带有两个参数的递归 void 函数,一个数组和一个整数计数 n,它将数组中的前 n 个整数向左旋转。
所以输入看起来像这样:
5 10 20 30 40 50
输出:
50 40 30 20 10
我已经使用递归编写了旋转函数,它似乎按预期工作。
#include <stdio.h>
void rotateLeft(int y[], int n){
int temp;
if (n > 1){
temp = y[0];
y[0] = y[1];
y[1] = temp;
rotateLeft(y + 1, n - 1);
}
}
int main(void){
int y[5];
int n;
int i = 0;
//input number from user
printf("Enter 'Count' number and 'elements' into array: ");
scanf("%d", &n);
for (i = 0; i < 5; i++){
scanf("%d", &y[i]);
}
rotateLeft(y, n);
for ( size_t i = 0; i < sizeof( y ) / sizeof( *y ); i++ ) printf( "%d ", y[i] );
puts( "" );
return 0;
}
我正在使用 Visual Code Studio,但在尝试运行此代码时遇到了两个问题。第一个是它从不询问我的输入,它只会在指定的数组位置输出随机数,例如: 3345345 345456 564565 56 4564
其他时候代码只是运行并且永不停止,我必须强制它停止。
此时我已经碰壁了,我很肯定问题出在我的主要功能中,但我已经在我的脑海中碰壁了去哪里。在过去的 5 年里我没有编码,所以我非常缺乏实践。
【问题讨论】:
-
可能只是一个术语,但这看起来不像是左轮换。 40 怎么会在 50 之后立即结束?
-
不要在循环定义中使用
sizeof( y ) / sizeof( *y ),而是在定义y之后使用size_t nelem = sizeof( y ) / sizeof( *y );然后使用for (size_t i = 0; i < nelem; ....)会更简洁 -
这看起来像是反转,而不是旋转。
-
我认为也不是。这是一个右旋转(但不是整个数组,只有第一个
n元素)2的条目交换前两个元素,3旋转前三个元素,等等。 -
@Obsidian,发布第一次使用的确切输入和看到的输出。 “类似”是不够的。