web-dev-qa-db-ja.com

配列のコンテンツを逆にする

私は逆にしようとしている数字の配列を持っています。コード内の関数は正しいと思いますが、適切な出力を取得できません。

出力は次のようになります:10 9 8 7 6.数字の残りの半分を取得できないのはなぜですか? countから「/ 2」を削除すると、出力は次のようになります。10 9 8 7 6 6 7 8 9 10

void reverse(int [], int);

int main ()
{
   const int SIZE = 10;
   int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

   reverse(arr, SIZE);
   return 0;
}
void reverse(int arr[], int count)
{
   int temp;
   for (int i = 0; i < count/2; ++i)
   {
      arr[i] = temp;
      temp = arr[count-i-1];
      arr[count-i-1] = arr[i];
      arr[i] = temp;

      cout << temp << " ";
   }
}
12
John

これは私のアプローチでしょう:

#include <algorithm>
#include <iterator>

int main()
{
  const int SIZE = 10;
  int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  std::reverse(std::begin(arr), std::end(arr));
  ...
}
20
juanchopanza

この線

arr[i] = temp;

間違っている。 (ループの最初の反復で、arr[i]未定義の値に。さらに反復することで、誤った値に設定されます。)この行を削除すると、配列が正しく反転されます。

その後、逆の配列を印刷するコードを、リスト全体を反復する新しいループに移動する必要があります。現在のコードは最初のcount/2要素。

int temp, i;
for (i = 0; i < count/2; ++i) {
    temp = arr[count-i-1];
    arr[count-i-1] = arr[i];
    arr[i] = temp;
}
for (i = 0; i < count; ++i) {
    cout << arr[i] << " ";
}
16
simonc

どちらの答えも私には正しいようです。

1)最初のarr[i] = temp;を削除する必要があります

2)2番目のループを実行して、配列の半分だけでなくall要素を出力する必要があります。逆を行うループは、印刷する必要はありません。

3
Matt

配列を印刷するのではなく、tempの値を印刷しています-これは配列の半分だけです...

2
Floris
void reverse(int [], int);
void printarray(int [], int );
int main ()
{
    const int SIZE = 10;
    int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    cout<<"Before reverse\n";
    printarray(arr, SIZE);
    reverse(arr, SIZE);
    cout<<"After reverse\n";
    printarray(arr, SIZE);

    return 0;
}

void printarray(int arr[], int count)
{
    for(int i = 0; i < count; ++i)
        cout<<arr[i]<<' ';

    cout<<'\n';
}

void reverse(int arr[], int count)
{
   int temp;
   for (int i = 0; i < count/2; ++i)
   {
      temp = arr[i];
      arr[i] = arr[count-i-1];
      arr[count-i-1] = temp;
   }
}
1
user93353

_<algorithm>_ライブラリのreverse()関数を使用します。

オンラインで実行: repl.it/@abranhe/Reverse-Array

_#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  int arr [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  reverse(begin(arr), end(arr));

  for(auto item:arr)
  {
    cout << item << " ";
  }
}
_

出力:

_10 9 8 7 6 5 4 3 2 1
_

このアプローチが気に入っていただければ幸いです。

1

まず、このコードにはどんな価値がありますか? int temp;?すべてのコンパイルで値が異なるため、わかりません。メモリからゴミ値を持たないように値を初期化する必要があります。次の質問は、なぜこの一時値を配列に割り当てるのですか?あなたのソリューションに固執したい場合、私はこのような逆の機能を変更します:

void reverse(int arr[], int count)
{
    int temp = 0;
    for (int i = 0; i < count/2; ++i)
    {
        temp = arr[count - i - 1];
        arr[count - i - 1] = arr[i];
        arr[i] = temp;
    }

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

これで動作しますが、この問題を処理する他のオプションがあります。

ポインターを使用したソリューション:

void reverse(int arr[], int count)
{
    int* head = arr;
    int* tail = arr + count - 1;
    for (int i = 0; i < count/2; ++i)
    {
        if (head < tail)
        {
            int tmp = *tail;
            *tail = *head;
            *head = tmp;

            head++; tail--;
        }
    }

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

そして、of Carlos Abrahamのように、algorithmライブラリーの組み込み関数を使用すると言っています

1
thebarylowi

この質問に対する解決策は非常に簡単です。ベクター

std::vector<int> vector;
for(int i = 0; i < 10;i++)
{
    vector.Push_back(i);
}
std::reverse(vector.begin(), vector.end());

出来上がり!できました! =)

ソリューションの詳細:

これは最も効率的なソリューションです。スワップは3つの値をスワップすることはできませんが、リバースは間違いなく可能です。アルゴリズムを含めることを忘れないでください。これは非常に単純なので、コンパイルされたコードは絶対に必要ありません。

これでOPの問題が解決すると思います

このソリューションにエラーや問題があると思われる場合は、以下にコメントしてください

1
user2913837

あなたの質問への直接的な答えとして:あなたの交換は間違っています

_void reverse(int arr[], int count){
   int temp;
   for(int i = 0; i < count/2; ++i){
      arr[i] = temp; // <== Wrong, Should be deleted
      temp = arr[count-i-1];
      arr[count-i-1] = arr[i];
      arr[i] = temp;
    }
}
_

_arr[i] = temp_を割り当てると、tempが最初にガベージデータを含んでいるため、最初にループに入るときにエラーが発生し、配列が破壊されて削除され、コードが正常に機能するはずです。

アドバイスとして、可能な限り組み込み関数を使用してください。

  • スワップでは、 swap like std::swap(arr[i], arr[count-i-1])を使用できます
  • 全体として逆の場合は、std::reverse(arr, arr+count)のように reverse を使用します。

私はC++ 14を使用しており、問題なく配列でリバース動作します。

1
Argento
#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
    int n, i;
    cout << "n = ";
    cin >> n;
    int *a = new int[n];
    int *b = new int[n];
    for (i = 0; i < n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
    for (i = 0; i < n; i++)
    {
        b[i] = a[n - 1 - i];
    }
    for (i = 0; i < n; i++)
    {
        cout << b[i];
    }
}
0
Diana

まず、配列要素にtempを割り当て、arr[i] = temp;ステートメントを削除する必要があります。次の問題は、配列要素の半分のみを表示する一時変数を印刷していることです(forループ内)。 STLベクターを使用したくない場合は、このソリューションをお勧めします:

#include <iostream>

void reverseArray(int userArray[], int size);

void printArray(int userArray[], int size);

int main(int arg, char**argv) {

    int arr[]{ 1,2,3,4,5,6,7,8,9,10 };
    int sizeOfArray = sizeof(arr) / sizeof(arr[0]);

    reverseArray(arr, sizeOfArray);
    printArray(arr, sizeOfArray);

    system("pause");
    return(0);
}

void reverseArray(int userArray[], int size) {

    int* ptrHead = userArray;
    int* ptrTail = userArray + (size-1);

    while (ptrTail > ptrHead) {
        int temp = *ptrHead;
        *ptrHead = *ptrTail;
        *ptrTail = temp;

        ptrHead++;
        ptrTail--;
    }
}

void printArray(int userArray[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << userArray[i] << " ";
    }
}
0
M.Baryłowicz
Procedure :

 1.Take an array.

 2.Then by default function reverse(array_name, array_name + size) .
  reverse(array_name, array_name + size) function exits in algorithm.h header file.

 3.Now print the array. 

 N.B  Here we use new and delete for dynamic memory allocation.

C++の実装:


#include<bits/stdc++.h>
using namespace std;


int main()
{
   int n;
   cin>>n;

   int *arr = new int[n];


   for(int i=0; i<n; i++)  cin>>arr[i];

   reverse(arr, arr+n);

   for(int i=0; i<n; i++)    cout<<arr[i]<<" ";

   delete[] arr;

   return 0;
}
0
rashedcs

ループはcount/2回だけ実行されます。したがって、配列全体は印刷されません。

また、temp=ar[i]の値は後者のステートメントのどこにも格納されないため、ar[i]=tempの代わりにar[i]を使用する必要があります。したがって、破棄されます。

0
user8110804
for(i=0;i<((s3)/2);i++)
{         
    z=s2[i];
    s2[i]=s2[(s3-1)-i];
    s2[(s3-1)-i]=z;
}
0
Arshad shaik

この問題を解決するためにポインターを使用してみます。以下の私のコード。

    #include <iostream>

    void displayArray(int table[], int size);

    void rev(int table[], int size);


    int main(int argc, char** argv) {

      int a[10] = { 1,2,3,4,5,6,7,8,9,10 };

      rev(a, 10);
      displayArray(a, 10);

      return 0;
    }

    void displayArray(int table[], int size) {
      for (int i = 0; i < size; i++) {
          std::cout << table[i] << " ";
      }
      std::cout << std::endl;
    }

    void rev(int table[], int size) {

      int *start = table;
      int *end = table + (size - 1);

      for (int i = 0; i < size; i++) {

          if (start < end) {
              int temp = *end;
              *end = *start;
              *start = temp;
          }

          start++;
          end--;
      }
    }
0
M.Baryłowicz