15

逆にしようとしている数値の配列があります。コード内の関数は正しいと思いますが、適切な出力が得られません。

出力は次のようになります: 10 9 8 7 6. 数値の残りの半分を取得できないのはなぜですか? カウントから「/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 << " ";
   }
}
4

18 に答える 18

24

これが私のアプローチです:

#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));
  ...
}
于 2013-10-31T17:27:23.203 に答える
16

この線

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] << " ";
}
于 2013-10-31T17:23:25.360 に答える
3

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

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

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

于 2013-10-31T17:25:33.273 に答える
2

配列を印刷していません。値を印刷していますtemp-これは配列の半分にすぎません...

于 2013-10-31T17:23:18.250 に答える
1

あなたの質問への直接の答えとして:あなたのスワッピングは間違っています

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によってエラーが発生し、配列が破損して削除され、コードが正常に機能するはずです。

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

  • スワッピングでは、次のよう にswapを使用できますstd::swap(arr[i], arr[count-i-1])
  • 全体として逆にするには、のように使用しますstd::reverse(arr, arr+count)

私は C++14 を使用していますが、逆に配列を問題なく使用できます。

于 2017-01-07T23:33:01.650 に答える
1

この質問の答えはとても簡単です: ベクトル

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

出来上がり!これで完了です。=)

ソリューションの詳細:

これが最も効率的な解決策です。Swap は 3 つの値を交換できませんが、reverse は確実に交換できます。アルゴリズムを含めることを忘れないでください。これは非常に単純であるため、コンパイルされたコードは絶対に必要ありません。

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

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

于 2014-10-24T02:16:09.323 に答える
0
#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];
    }
}
于 2014-07-06T16:44:27.423 に答える
-4

これを試してみてください。他のコードと比較して落ちたほうがよいでしょう。

using namespace std;
int main() {
    int a[5]={4,6,3,5,9};
    for(int i=4;i>=0;i--) {
        cout<<"\n"<<a[i];
    }
}
于 2016-06-23T08:17:19.403 に答える