#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j,l,m,n;
j=0;
printf("\nenter 5 element single dimension array\n");
printf("enter shift rate\n");
scanf("%d",&n);
/* Here we take input from user that by what times user wants to rotate the array in left. */
int arr[5],arrb[n];
for(i=0;i<=4;i++){
scanf("%d",&arr[i]);
}
/* Here we have taken another array. */
for(i=0;i<=4;i++){
printf("%d",arr[i]);
}
for(i=0;i<n;i++){
arrb[j]=arr[i];
j++;
// These loop will shift array element to left by position which's entered by user.
}
printf("\n");
for(i=0;i<=3;i++){
arr[i]=arr[i+n];
}
for(i=0;i<=4;i++){
if(n==1 && i==4)
break;
if(n==2 && i==3)
break;
if(n==3 && i==2)
break;
printf("%d",arr[i]);
}
//To combine these two arrays. Make it look like single array instead of two
for(i=0;i<n;i++){
printf("%d",arrb[i]);
}
// Final sorted array will get printed here
}
答案 0 :(得分:3)
是向左方向旋转数组的效果程序吗?
实际上,非常复杂,并且包含一些问题:
for(i = 0; i < n; i++)
{
arrb[j] = arr[i];
j++;
}
为什么不简单:
for(i = 0; i < n; i++)
{
arrb[i] = arr[i];
}
不需要第二个变量。但是,如果n
大于5,则会遇到麻烦,因为您将从其附加访问arr
(未定义的行为!)。至少,你应该检查用户输入!
for(i = 0; i <=3 ; i++)
{
arr[i] = arr[i + n];
}
同样的问题:最后一个可访问的索引是4(四),所以n不能超过1,否则你再次访问数组超出范围......
第一个阵列的打印循环中的那些很多无法高效...
你可以拥有更多,更简单的东西:
int arr[5], arrb[5];
// ^
for(int i = 0; i < 5; ++i)
arrb[i] = arr[(i + n) % 5];
但这并未涵盖n的否定值。
arrb[i] = arr[(((i + n) % 5) + 5) % 5];
即使对于负值也是安全的...现在你需要输出的所有内容是:
for(int i = 0; i < 5; ++i)
printf("%d ", arrb[i]);
但最后会发现一个问题:如果用户为n
输入的值大于INT_MAX - 4
,则会出现有符号整数溢出,这也是未定义的行为!
我们可以通过更改索引公式来再次讨论这个问题:
arrb[i] = arr[(5 + i + (n % 5)) % 5];
n % 5
是不变的,所以我们可以将它移出循环:
n %= 5;
for(int i = 0; i < 5; ++i)
arrb[i] = arr[(5 + i + n) % 5];
最后,如果我们已经将n
置于正外,我们可以在for循环中省略添加。
n = ((n % 5) + 5) % 5;
for(int i = 0; i < 5; ++i)
arrb[i] = arr[(i + n) % 5]; // my original formula again...
对于长时间运行的循环,最后一步尤其值得考虑。
答案 1 :(得分:0)
我想你想做这样的事情(你应该检查0&lt; = n&lt; = 5):
int b[5];
int k = 0;
for(i=0; i<5; i++){
if (i < 5 - n)
b[i] = arr[i+n];
else
{
b[i] = arr[k];
k++;
}
}
数组b用于保存旋转的矩阵。