1

特定の配列を取り、それを 2 つの別個の配列に分割する関数を作成する必要があります。一方の配列の要素はメイン配列の正の要素であり、もう一方の要素はメイン配列の負の要素です。これを行うためのループがどのようになるかわかりません。

メイン配列に正と負の値がいくつあるかを判断する別の関数を作成しました。

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)

メイン配列の各正の要素を新しいPositive-Only配列の要素として設定する方法、および負の配列についても同様に設定する方法がわかりません。

ご協力いただきありがとうございます!

与えられた答えを使用し、残りのコードで最善を尽くした後、コンパイルしようとすると約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

1

Cスタイルの答えが得られるかもしれません

しかし、ここでは、STL アルゴリズムをどのように使用するかを説明します。C++

使用するstd::partition

bool is_pos(int i) { return i > 0; }

auto p = std::partition(std::begin(ARRAY), 
         std::end(ARRAY), std::ptr_fun(is_pos));

std::copy(std::begin(ARRAY), p, std::begin(POS_ARRAY));

std::copy(p,  std::end(ARRAY), std::begin(NEG_ARRAY));

またstd::vector、そのような操作に使用する必要があります

デモはこちら

于 2013-11-15T03:02:31.260 に答える
0

count()関数を簡単に変更できます。

void split(int ARRAY[], int SIZE, int NEG [], int POS [])
{
  int ncount = 0, pcount = 0;
  for (int x=0; x<SIZE; x++)
    {
      if(ARRAY[x]>=0)
      {
          POS[pcount++] = ARRAY[x];
      }
      if(ARRAY[x]<0)
      {
          NEG[ncount++] = ARRAY[x];
      }
    }
}
于 2013-11-15T03:01:37.070 に答える
0

このコードは、負の数と正の数を別々の配列に分割します。

void split(int ARRAY[], int SIZE, int NEG_ARRAY[], int&NEG, int POS_ARRAY[], int&POS)
{
    NEG=POS=0;
    for (int i(0); i<SIZE; i++)
    {
        if (ARRAY[i]<0) NEG_ARRAY[NEG++]=ARRAY[i];
        else POS_ARRAY[POS++]=ARRAY[i];
    }
}
于 2013-11-15T03:02:37.243 に答える