我试图在不使用任何第二个数组的情况下反转数组。 这是我写的代码,但由于某种原因它似乎没有起作用。
#include<stdio.h>
#include<conio.h>
void getarrayvalues();
void main()
{
int k,n;
int i=0;
int a[100];
printf("Enter the value of n");
scanf("%d", &n);
printf("Ener the values of array");
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
}
k=n;
if(n%2==0)
{
for(i=0;i<n;i++)
{
a[i]=a[k];
k--;
}
}
else
{
for(i=0;i<n;i++)
{
if(k==((n/2)+1))
{
continue;
}
else
{
a[i]=a[k];
k--;
}
}
}
printf("reverse values are");
for(i=0;i<n;i++)
{
printf("%d", a[i]);
}
}
输入数组值后,返回蓝色代码写入屏幕,不打印输出。 有什么想法吗?
答案 0 :(得分:3)
我看到的第一个错误是您将k
作为n
启动。那么,数组n
的位置a
是最后一个元素之后的位置,因为数组索引从零开始。你应该把它作为:
k=n-1;
其次,当你做
时for(i=0;i<n;i++)
{
a[i]=a[k];
k--;
}
用倒置的后半部分覆盖数组的前半部分,但在此过程中丢失了前半部分的原始值。如果您未在其他位置保存先前的a[i]
值,则该任务将丢失该值。放置a[i]
的值的好地方是,因为您正在反转数组,在其对称的相对位置,恰好是a[k]
。代码看起来像:
for(i=0;i<n;i++)
{
int temp = a[i];
a[i]=a[k];
a[k]=temp;
k--;
}
但是这样做,当i == n/2
时,你已经交换了整个数组,因此你必须停在那里:
for(i=0;i<=(n/2);i++)
{
int temp = a[i];
a[i]=a[k];
a[k]=temp;
k--;
}
最后,没有必要区别对待n
奇数或偶数的情况,因为如果它是奇数,则中间元素已经是它需要的位置......
答案 1 :(得分:1)
您只需指定[i]值。您还需要指定[k]值。例如:
int temp;
//code
temp = a[i];
a[i] = a[k];
a[k] = temp;
你现在基本上复制了数组的值。
修改
你还应该看看ivella说的话。如果你不考虑这一点,你将最终访问空内存(你的程序将崩溃)
答案 2 :(得分:1)
就这样做 -
for(i=0;i<n/2;++i)
swap(a+i,a+((n-1)-i));
交换(&amp; x,&amp; y)交换变量x和y的值。
答案 3 :(得分:0)
你似乎在使用C而不是C ++。您可以在没有第二个数组的情况下完成反转:
int array[SIZE];
// fill in array
for (int i = 0; i < SIZE / 2; ++i)
{
int t = array[i];
array[i] = array[SIZE - i - 1];
array[SIZE - i - 1] = t;
}
根据要求,可以通过几种方式完成C ++解决方案。 e.g:
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::reverse(v.begin(), v.end());
答案 4 :(得分:0)
#include<stdio.h>
int main()
{
char s[]="ratiranjankumar";
int i,j;
int count=0;
for(i=0;s[i]!='\0';i++)
{
count++;
}
for(j=0;j<=count/2-1;j++)
{
s[j] ^= s[count-j];
s[count-j] ^= s[j];
s[j] ^= s[count-1];
}
for(i=0;i<=count;i++)
{
printf("%c",s[i]);
}
}