我遇到了一个问题,我无法编写正确的所需代码。 问题是:数字输入数组,我必须显示反转输出。但输出有一个特殊的模式。特殊模式在Eg:output中给出。
例如:输入1 2 3 4 5 6 7 8
输出4 3 2 1 8 7 6 5
int main()
{
int a[20],i,j,n,l;
cout<<"ENTER NO. OF ELEMENTS: ";
cin>>n;
for(i=0; i<n; i++)
{
cout<<"ENTER : ";
cin>>a[i];
}
l=(n/2)-1;
for(i=0,j=l; i<n/2,j>=0; i++,j--)
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
for(i=n/2,j=n-1; i<n,j>=n/2; i++,j--)
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
for(i=0; i<n; i++)
{
cout<<a[i];
}
return 0;
}
给定代码上面的问题是它显示原始数组而不是所需的输出。因此,如果有人可以指出我的代码中的错误或错误。
答案 0 :(得分:0)
首先要做的事情。始终初始化变量并始终尝试准确地声明何时使用它们:
int a[20],i,j,n,l;
这里的数组有垃圾值,以及之后声明的变量。您应首先使用空值初始化数组:
int a[20] {};
cout << "ENTER NO. OF ELEMENTS: ";
int n = 0;
cin >> n;
当你第一次使用它们时,其余的变量:
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--)
的结束条件有误。你几乎可以将所有元素反转两次。你应该停在上半部分(l / 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。