2017-08-30 68 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