2017-08-30 80 views
-3

我遇到了一个问题,我无法编写正确的必需代码。 问题是:数字输入到数组中,我必须显示反转输出。但是输出有一个特殊的模式。输出中给出了特殊模式。数组的特殊反转


例如:输入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; 
} 

与给定代码上面是问题它显示原始数组而不是所需的输出。因此,如果有人能指出我的代码中的错误或错误。

+4

SO不是代码编写服务,请创建[mcve],以便我们帮助您。 –

+0

您不需要添加或减少元素来反转数组。你的代码做什么并不明显。是否要求转型必须实施? – user463035818

+0

有更好的方法来交换两个值比算术。例如,'std :: swap'。 – molbdnilo

回答

0

首先要做的事情。总是初始化变量,并总是试图准确地申报时,您将使用它们:

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

+0

感谢pmaxim98的解决方案。但现在我面临着一个问题,那就是当没有。的输入元素是奇数的倒转阵列也交换最中心的元素。例如:输入1 2 3 4 5 6 7 8 9所需的输出是4 3 2 1 5 9 8 7 6.但上述解决方案的输出是4 3 2 1 9 8 7 6 5.请指出这个案例。 – Designex

+0

@Designex替换'std :: reverse(numbersToInverse + middleOfVector,numbersToInverse + elementCount);'用'std :: reverse(numbersToInverse + middleOfVector + elementCount%2,numbersToInverse + elementCount);' – pmaxim98

+0

您能否提出一种方法来完成数组中的第二种情况是因为我的老师告诉我只使用数组来完成它。谢谢 – Designex