2017-08-30 15 views
-3

私は適切な必要なコードを書くことができないという問題があります。 問題は次のとおりです。数値が配列に入力され、逆の出力を表示する必要があります。しかし、出力には特別なパターンがあります。特別なパターンはEg:出力に与えられます。配列内の数値の特殊な逆転


例:入力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

コード作成サービスではありませんので、[mcve]を作成してください。 –

+0

配列を逆にするために要素を追加または減算する必要はありません。あなたのコードが何をしているのかは明らかではありません。変革が適切に行われなければならないという要件はありますか? – user463035818

+0

算術演算よりも2つの値をスワップする方が良い方法があります。例えば ​​'std :: swap'のようにします。 – molbdnilo

答えて

0

最初のものが最初です。常にあなたの変数を初期化し、あなたがそれらを使用しようとしているときは、常に正確に宣言しよう:

ここ
int a[20],i,j,n,l; 

配列変数は、後に宣言しaswellとして、ごみ値を持っています。

​​

、変数の残りのあなたが初めてのためにそれらを使用するべきである:

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]; 

これらは2つの値を交換することになっていますが、最初の視点では理解しにくいです。 2つの値を交換する関数を作成する方が良いです。標準の1つを使用してくださいstd::swap

swap(a[i], a[j]); 

あなたのアルゴリズムは間違っています。このコード行for(i=0,j=l; i<n/2,j>=0; i++,j--)は、終了条件が間違っています。あなたはほとんどすべての要素を2回逆にしています。最初の半分(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

解決に感謝します。しかし、今私は問題に直面しています。入力された要素の数が奇数である場合、逆配列も中央の最も大きな要素を交換する。例:入力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です。この場合。 – Designex

+0

@Designexは、 'std :: reverse(numbersToInverse + elementCount);を' std :: reverse(numbersToInverse + middleOfVector + elementCount%2、numbersToInverse + elementCount);と置き換えて、 – pmaxim98

+0

を実行する方法を提案できますか?私の先生が私に配列だけを使ってそれをするように言ったからです。ありがとう – Designex

関連する問題