首先要做的事情。总是初始化变量,并总是试图准确地申报时,您将使用它们:
int a[20],i,j,n,l;
这里数组的垃圾值,藏汉作为变量后声明。你应该初始化与空值的数组第一:
和可变的休息时,你应该使用他们的第一次:
for(int i = 0; i < n; i++)
{
cout << "ENTER : ";
cin >> a[i];
}
int l = (n/2) - 1;
现在这行代码:
a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];
这些应该交换两个值,但他们一见钟情并不容易理解。你最好写一个交换两个值的函数,甚至更好:使用标准的函数std::swap
。
swap(a[i], a[j]);
现在,你的算法是错误的。该行代码for(i=0,j=l; i<n/2,j>=0; i++,j--)
的最终条件错误。你几乎颠倒了所有的元素两次。你应该停在前半部分(1/2)的中间,而不是整个阵列的中间(n/2)。
for (int i = 0, j = l; i <= l/2 && j > l/2; i++, j--)
同样的条件如下。
for (int i = n/2, j = n - 1; i <= (n + l)/2 && j > (n + l)/2; i++, j--)
所以你的最终代码应该是这样的:
#include <iostream>
using namespace std;
int main()
{
int a[20] {};
cout << "ENTER NO. OF ELEMENTS: ";
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cout << "ENTER : ";
cin >> a[i];
}
int l = (n/2) - 1;
for (int i = 0, j = l; i <= l/2 && j > l/2; i++, j--)
swap(a[i], a[j]);
for (int i = n/2, j = n - 1; i <= (n + l)/2 && j > (n + l)/2; i++, j--)
swap(a[i], a[j]);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}
现在的问题是代码不是很可读要么因为你正在使用C++,这是你不是活得耻辱使用它具有的标准算法。 另外,你的变量名称不是描述性的,所以代码会很难维护。
#include <iostream>
#include <algorithm>
int main()
{
const int MaxNumbers = 20;
int numbersToInverse[MaxNumbers] {};
int elementCount = 0;
std::cin >> elementCount;
for (int i = 0; i < elementCount; i++)
std::cin >> numbersToInverse[i];
int middleOfVector = elementCount/2;
std::reverse(numbersToInverse, numbersToInverse + middleOfVector);
std::reverse(numbersToInverse + middleOfVector, numbersToInverse + elementCount);
for (int i = 0; i < elementCount; i++)
std::cout << numbersToInverse[i] << ' ';
return 0;
}
当然,更好的实现将与std::vector
,但我一直阵列。我让你看看std::reverse
是如何工作的。也不要使用using namespace std;
。见这里why。
SO不是代码编写服务,请创建[mcve],以便我们帮助您。 –
您不需要添加或减少元素来反转数组。你的代码做什么并不明显。是否要求转型必须实施? – user463035818
有更好的方法来交换两个值比算术。例如,'std :: swap'。 – molbdnilo