1

特定の配列を取り、それを 2 つの別個の配列に分割するプログラムを作成する必要があります。一方の配列の要素はメイン配列の正の要素であり、もう一方の要素はメイン配列の負の要素です。

コードで最善を尽くした後、コンパイルしようとしたときに約 100 万行のエラーが発生しました。動的に割り当てられた 3 つの配列を削除する方法に問題はありますか? コンパイルを妨げている大きなエラーは何ですか? これが私のコードです:

#include <iostream>
using namespace std;


void count(int ARRAY[], int SIZE, int& NEG, int& POS);
void split(int ARRAY[], int SIZE, int& NEG_ARRAY, int NEG, int& POS_ARRAY, int POS);
void print_array(int ARRAY[], int SIZE);


int main()
{

  int SIZE(0);
  int* ARRAY;

  cout << "Enter number of elements: ";
  cin >> SIZE ;

  ARRAY = new int[SIZE];
  int x(0);
  int numEle(0);

  cout << "Enter list: " << endl;

  while (numEle < SIZE)
  {
      ARRAY[numEle] = x;
      numEle++;
      cin >> x;
  }

  int POS(0), NEG(0);
  count(ARRAY, SIZE, NEG, POS);

  int* NEG_ARRAY;
  NEG_ARRAY = new int[NEG];

  int* POS_ARRAY;
  POS_ARRAY = new int[POS];


  split(ARRAY, SIZE, NEG_ARRAY, NEG, POS_ARRAY, POS);

  cout << "Negative elements: " << endl;
  cout << print_array(NEG_ARRAY, NEG) << endl;

  cout << "Non-negative elements: " << endl;
  cout << print_array(POS_ARRAY, POS) << endl;


  delete [] ARRAY;
  delete [] NEG_ARRAY;
  delete [] POS_ARRAY;

  return 0;
}

void count(int ARRAY[], int SIZE, int& NEG, int& POS)
{
    for (int x=0; x < SIZE; x++)
    {
        if (ARRAY[x] >= 0)
    {
        POS = POS + 1;
    }
        if (ARRAY[x] < 0)
    {
        NEG = NEG + 1;
    }
    }
}

void split(int ARRAY[], int SIZE, int& NEG_ARRAY, int NEG, int& POS_ARRAY, int POS)
{
    NEG = POS = 0;
    for (int x = 0; x < SIZE; x++)
    {
        if (ARRAY[x] < 0)
    {
            NEG_ARRAY[NEG++] = ARRAY[x];
        }
        else
        {
            POS_ARRAY[POS++] = ARRAY[x];
        }
    }
}

void print_array(int ARRAY[], int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        cout << ARRAY[i] << " ";
    }
    cout << endl;
}

コードは、配列を読み取り、新しい負の配列と新しい正の配列を表示することになっています。前もって感謝します!

4

3 に答える 3

2

次のバグがあります。

void split(int ARRAY[], int SIZE, int&NEG_ARRAY, int NEG, int&POS_ARRAY, int POS);

への変更 :

void split(int ARRAY[], int SIZE, int*NEG_ARRAY, int NEG, int*POS_ARRAY, int POS);

また:

void split(int ARRAY[], int SIZE, int&NEG_ARRAY, int NEG, int&POS_ARRAY, int POS){..}

への変更 :

void split(int ARRAY[], int SIZE, int*NEG_ARRAY, int NEG, int*POS_ARRAY, int POS){..}

cout<<print_array(NEG_ARRAY, NEG) <<endl
cout<<print_array(NEG_ARRAY, POS) <<endl;

に :

print_array(NEG_ARRAY, NEG);
print_array(NEG_ARRAY, POS);

これらのバグを修正した後、コンパイルして正常に実行できます。

于 2013-11-15T04:13:45.907 に答える
2

あなたのコードにはたくさんのエラーがあります。最悪なのは、split関数の宣言と定義で参照によって配列を渡すことです。両方をvoid split(int ARRAY[], int SIZE, int *NEG_ARRAY, int NEG, int *POS_ARRAY, int POS);に変更すると、ほとんどのエラーがなくなります。

残りは、配列を印刷する 2 行からのものですmain

cout<<print_array(NEG_ARRAY, NEG) <<endl;

関数を印刷するのではなく、関数を使用してその内部に印刷する必要があります(これは正しく行います)。呼び出しを次のように単純に変更する必要があります。

print_array(NEG_ARRAY, NEG);

これでコードがコンパイルされます。

ただし、アプリ全体が不適切な方法で動作するエラーがもう 1 つあります。値を入力する場所では、配列に入力するcin 前に入力を取得する必要があります。このような:

while(numEle<SIZE) {
  cin>>x;
  ARRAY[numEle] = x ;
  numEle++;
}
于 2013-11-15T04:14:10.077 に答える
0

まず第一に、std::vector動的に割り当てられた C 配列を使用するよりも、ほとんどの場合 a を使用する方が優れています。ポインタと角かっこ配列アクセスの恐ろしい混合は得られず、丸められた余分なサイズの変数を渡す必要もありません。

次に、標準ライブラリには、やりたいことを実行するのに役立つ優れたアルゴリズムがいくつかあります。与えられた数値を というベクトルに書き込むと仮定しましょうvecstd::partition次に、次のように、ゼロ未満のすべての要素をベクトルの前半に移動し、ゼロ以上のすべての要素をベクトルの後半に移動するために使用できます。

inline bool less_than_zero(int a)
{
    return a < 0;
}

std::vector<int>::iterator midpoint = std::partition(vec.begin(),
                                                     vec.end(),
                                                     less_than_zero);

(述語を指定する方法は他にもありますが、このような単純な関数定義は、デモンストレーション目的で最も簡単です。)

返された反復子は、ベクトル内の負でない最初の項目を指します。したがって、値を 2 つの新しいベクトルに簡単にコピーできます。

std::vector<int> negative(vec.begin(), midpoint);
std::vector<int> positive(midpoint, vec.end());

以上です!

于 2013-11-15T04:17:29.533 に答える